diff options
Diffstat (limited to 'include/linux/bitfield.h')
| -rw-r--r-- | include/linux/bitfield.h | 9 | 
1 files changed, 5 insertions, 4 deletions
| diff --git a/include/linux/bitfield.h b/include/linux/bitfield.h index cf2588d81148..3f1ef4450a7c 100644 --- a/include/linux/bitfield.h +++ b/include/linux/bitfield.h @@ -53,7 +53,7 @@  	({								\  		BUILD_BUG_ON_MSG(!__builtin_constant_p(_mask),		\  				 _pfx "mask is not constant");		\ -		BUILD_BUG_ON_MSG(!(_mask), _pfx "mask is zero");	\ +		BUILD_BUG_ON_MSG((_mask) == 0, _pfx "mask is zero");	\  		BUILD_BUG_ON_MSG(__builtin_constant_p(_val) ?		\  				 ~((_mask) >> __bf_shf(_mask)) & (_val) : 0, \  				 _pfx "value too large for the field"); \ @@ -104,7 +104,7 @@  		(typeof(_mask))(((_reg) & (_mask)) >> __bf_shf(_mask));	\  	}) -extern void __compiletime_warning("value doesn't fit into mask") +extern void __compiletime_error("value doesn't fit into mask")  __field_overflow(void);  extern void __compiletime_error("bad bitfield mask")  __bad_mask(void); @@ -121,8 +121,8 @@ static __always_inline u64 field_mask(u64 field)  #define ____MAKE_OP(type,base,to,from)					\  static __always_inline __##type type##_encode_bits(base v, base field)	\  {									\ -        if (__builtin_constant_p(v) &&	(v & ~field_multiplier(field)))	\ -			    __field_overflow();				\ +	if (__builtin_constant_p(v) && (v & ~field_mask(field)))	\ +		__field_overflow();					\  	return to((v & field_mask(field)) * field_multiplier(field));	\  }									\  static __always_inline __##type type##_replace_bits(__##type old,	\ @@ -143,6 +143,7 @@ static __always_inline base type##_get_bits(__##type v, base field)	\  	____MAKE_OP(le##size,u##size,cpu_to_le##size,le##size##_to_cpu)	\  	____MAKE_OP(be##size,u##size,cpu_to_be##size,be##size##_to_cpu)	\  	____MAKE_OP(u##size,u##size,,) +____MAKE_OP(u8,u8,,)  __MAKE_OP(16)  __MAKE_OP(32)  __MAKE_OP(64) |