cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

bitfield.h (2835B)


      1/*
      2 *	FILE    	bitfield.h
      3 *
      4 *	Version 	1.1
      5 *	Author  	Copyright (c) Marc A. Viredaz, 1998
      6 *	        	DEC Western Research Laboratory, Palo Alto, CA
      7 *	Date    	April 1998 (April 1997)
      8 *	System  	Advanced RISC Machine (ARM)
      9 *	Language	C or ARM Assembly
     10 *	Purpose 	Definition of macros to operate on bit fields.
     11 */
     12
     13
     14
     15#ifndef __BITFIELD_H
     16#define __BITFIELD_H
     17
     18#ifndef __ASSEMBLY__
     19#define UData(Data)	((unsigned long) (Data))
     20#else
     21#define UData(Data)	(Data)
     22#endif
     23
     24
     25/*
     26 * MACRO: Fld
     27 *
     28 * Purpose
     29 *    The macro "Fld" encodes a bit field, given its size and its shift value
     30 *    with respect to bit 0.
     31 *
     32 * Note
     33 *    A more intuitive way to encode bit fields would have been to use their
     34 *    mask. However, extracting size and shift value information from a bit
     35 *    field's mask is cumbersome and might break the assembler (255-character
     36 *    line-size limit).
     37 *
     38 * Input
     39 *    Size      	Size of the bit field, in number of bits.
     40 *    Shft      	Shift value of the bit field with respect to bit 0.
     41 *
     42 * Output
     43 *    Fld       	Encoded bit field.
     44 */
     45
     46#define Fld(Size, Shft)	(((Size) << 16) + (Shft))
     47
     48
     49/*
     50 * MACROS: FSize, FShft, FMsk, FAlnMsk, F1stBit
     51 *
     52 * Purpose
     53 *    The macros "FSize", "FShft", "FMsk", "FAlnMsk", and "F1stBit" return
     54 *    the size, shift value, mask, aligned mask, and first bit of a
     55 *    bit field.
     56 *
     57 * Input
     58 *    Field     	Encoded bit field (using the macro "Fld").
     59 *
     60 * Output
     61 *    FSize     	Size of the bit field, in number of bits.
     62 *    FShft     	Shift value of the bit field with respect to bit 0.
     63 *    FMsk      	Mask for the bit field.
     64 *    FAlnMsk   	Mask for the bit field, aligned on bit 0.
     65 *    F1stBit   	First bit of the bit field.
     66 */
     67
     68#define FSize(Field)	((Field) >> 16)
     69#define FShft(Field)	((Field) & 0x0000FFFF)
     70#define FMsk(Field)	(((UData (1) << FSize (Field)) - 1) << FShft (Field))
     71#define FAlnMsk(Field)	((UData (1) << FSize (Field)) - 1)
     72#define F1stBit(Field)	(UData (1) << FShft (Field))
     73
     74
     75/*
     76 * MACRO: FInsrt
     77 *
     78 * Purpose
     79 *    The macro "FInsrt" inserts a value into a bit field by shifting the
     80 *    former appropriately.
     81 *
     82 * Input
     83 *    Value     	Bit-field value.
     84 *    Field     	Encoded bit field (using the macro "Fld").
     85 *
     86 * Output
     87 *    FInsrt    	Bit-field value positioned appropriately.
     88 */
     89
     90#define FInsrt(Value, Field) \
     91                	(UData (Value) << FShft (Field))
     92
     93
     94/*
     95 * MACRO: FExtr
     96 *
     97 * Purpose
     98 *    The macro "FExtr" extracts the value of a bit field by masking and
     99 *    shifting it appropriately.
    100 *
    101 * Input
    102 *    Data      	Data containing the bit-field to be extracted.
    103 *    Field     	Encoded bit field (using the macro "Fld").
    104 *
    105 * Output
    106 *    FExtr     	Bit-field value.
    107 */
    108
    109#define FExtr(Data, Field) \
    110                	((UData (Data) >> FShft (Field)) & FAlnMsk (Field))
    111
    112
    113#endif /* __BITFIELD_H */