@ -4,16 +4,41 @@
# include <linux/types.h>
# define USHRT_MAX ((u16)(~0U))
# define SHRT_MAX ((s16)(USHRT_MAX>>1))
# define SHRT_MIN ((s16)(-SHRT_MAX - 1))
# define INT_MAX ((int)(~0U>>1))
# define INT_MIN (-INT_MAX - 1)
# define UINT_MAX (~0U)
# define LONG_MAX ((long)(~0UL>>1))
# define LONG_MIN (-LONG_MAX - 1)
# define ULONG_MAX (~0UL)
# define LLONG_MAX ((long long)(~0ULL>>1))
# define LLONG_MIN (-LLONG_MAX - 1)
# define ULLONG_MAX (~0ULL)
# define SIZE_MAX (~(size_t)0)
# define U8_MAX ((u8)~0U)
# define S8_MAX ((s8)(U8_MAX>>1))
# define S8_MIN ((s8)(-S8_MAX - 1))
# define U16_MAX ((u16)~0U)
# define S16_MAX ((s16)(U16_MAX>>1))
# define S16_MIN ((s16)(-S16_MAX - 1))
# define U32_MAX ((u32)~0U)
# define S32_MAX ((s32)(U32_MAX>>1))
# define S32_MIN ((s32)(-S32_MAX - 1))
# define U64_MAX ((u64)~0ULL)
# define S64_MAX ((s64)(U64_MAX>>1))
# define S64_MIN ((s64)(-S64_MAX - 1))
# define STACK_MAGIC 0xdeadbeef
# define REPEAT_BYTE(x) ((~0ul / 0xff) * (x))
# define ALIGN(x,a) __ALIGN_MASK((x),(typeof(x))(a)-1)
# define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask))
# define PTR_ALIGN(p, a) ((typeof(p))ALIGN((unsigned long)(p), (a)))
# define IS_ALIGNED(x, a) (((x) & ((typeof(x))(a) - 1)) == 0)
# define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
@ -27,10 +52,24 @@
# define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1)
# define round_down(x, y) ((x) & ~__round_mask(x, y))
# define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))
# define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
# if BITS_PER_LONG == 32
# define DIV_ROUND_UP_SECTOR_T(ll,d) DIV_ROUND_UP_ULL(ll, d)
# else
# define DIV_ROUND_UP_SECTOR_T(ll,d) DIV_ROUND_UP(ll,d)
# endif
# define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y))
# define rounddown(x, y) ( \
{ \
typeof ( x ) __x = ( x ) ; \
__x - ( __x % ( y ) ) ; \
} \
)
/*
* Divide positive or negative dividend by positive divisor and round
* to closest integer . Result is undefined for negative divisors and
@ -127,6 +166,27 @@
_max1 > _max2 ? ( _max1 > _max3 ? _max1 : _max3 ) : \
( _max2 > _max3 ? _max2 : _max3 ) ; } )
/**
* min_not_zero - return the minimum that is _not_ zero , unless both are zero
* @ x : value1
* @ y : value2
*/
# define min_not_zero(x, y) ({ \
typeof ( x ) __x = ( x ) ; \
typeof ( y ) __y = ( y ) ; \
__x = = 0 ? __y : ( ( __y = = 0 ) ? __x : min ( __x , __y ) ) ; } )
/**
* clamp - return a value clamped to a given range with strict typechecking
* @ val : current value
* @ lo : lowest allowable value
* @ hi : highest allowable value
*
* This macro does strict typechecking of lo / hi to make sure they are of the
* same type as val . See the unnecessary pointer comparisons .
*/
# define clamp(val, lo, hi) min((typeof(val))max(val, lo), hi)
/*
* . . and if you can ' t take the strict
* types , you can specify one yourself .
@ -144,6 +204,38 @@
__max1 > __max2 ? __max1 : __max2 ; } )
/**
* clamp_t - return a value clamped to a given range using a given type
* @ type : the type of variable to use
* @ val : current value
* @ lo : minimum allowable value
* @ hi : maximum allowable value
*
* This macro does no typechecking and uses temporary variables of type
* ' type ' to make all the comparisons .
*/
# define clamp_t(type, val, lo, hi) min_t(type, max_t(type, val, lo), hi)
/**
* clamp_val - return a value clamped to a given range using val ' s type
* @ val : current value
* @ lo : minimum allowable value
* @ hi : maximum allowable value
*
* This macro does no typechecking and uses temporary variables of whatever
* type the input argument ' val ' is . This is useful when val is an unsigned
* type and min and max are literals that will otherwise be assigned a signed
* integer type .
*/
# define clamp_val(val, lo, hi) clamp_t(typeof(val), val, lo, hi)
/*
* swap - swap value of @ a and @ b
*/
# define swap(a, b) \
do { typeof ( a ) __tmp = ( a ) ; ( a ) = ( b ) ; ( b ) = __tmp ; } while ( 0 )
/**
* container_of - cast a member of a structure out to the containing structure
* @ ptr : the pointer to the member .
* @ type : the type of the container struct this is embedded in .