7#ifndef _LINUX_BITFIELD_H
8#define _LINUX_BITFIELD_H
47#define __bf_shf __builtin_ctzll
49#define __scalar_type_to_unsigned_cases(type) \
50 unsigned type: (unsigned type)0, \
51 signed type: (unsigned type)0
53#define __unsigned_scalar_typeof(x) typeof( \
55 char: (unsigned char)0, \
56 __scalar_type_to_unsigned_cases(char), \
57 __scalar_type_to_unsigned_cases(short), \
58 __scalar_type_to_unsigned_cases(int), \
59 __scalar_type_to_unsigned_cases(long), \
60 __scalar_type_to_unsigned_cases(long long), \
63#define __bf_cast_unsigned(type, x) ((__unsigned_scalar_typeof(type))(x))
65#define __BF_FIELD_CHECK_MASK(_mask, _val, _pfx) \
67 BUILD_BUG_ON_MSG(!__builtin_constant_p(_mask), \
68 _pfx "mask is not constant"); \
69 BUILD_BUG_ON_MSG((_mask) == 0, _pfx "mask is zero"); \
70 BUILD_BUG_ON_MSG(__builtin_constant_p(_val) ? \
71 ~((_mask) >> __bf_shf(_mask)) & \
73 _pfx "value too large for the field"); \
74 __BUILD_BUG_ON_NOT_POWER_OF_2((_mask) + \
75 (1ULL << __bf_shf(_mask))); \
78#define __BF_FIELD_CHECK_REG(mask, reg, pfx) \
79 BUILD_BUG_ON_MSG(__bf_cast_unsigned(mask, mask) > \
80 __bf_cast_unsigned(reg, ~0ull), \
81 pfx "type of reg too small for mask")
83#define __BF_FIELD_CHECK(mask, reg, val, pfx) \
85 __BF_FIELD_CHECK_MASK(mask, val, pfx); \
86 __BF_FIELD_CHECK_REG(mask, reg, pfx); \
89#define __FIELD_PREP(mask, val, pfx) \
91 __BF_FIELD_CHECK_MASK(mask, val, pfx); \
92 ((typeof(mask))(val) << __bf_shf(mask)) & (mask); \
95#define __FIELD_GET(mask, reg, pfx) \
97 __BF_FIELD_CHECK_MASK(mask, 0U, pfx); \
98 (typeof(mask))(((reg) & (mask)) >> __bf_shf(mask)); \
108#define FIELD_MAX(_mask) \
110 __BF_FIELD_CHECK(_mask, 0ULL, 0ULL, "FIELD_MAX: "); \
111 (typeof(_mask))((_mask) >> __bf_shf(_mask)); \
121#define FIELD_FIT(_mask, _val) \
123 __BF_FIELD_CHECK(_mask, 0ULL, 0ULL, "FIELD_FIT: "); \
124 !((((typeof(_mask))_val) << __bf_shf(_mask)) & ~(_mask)); \
135#define FIELD_PREP(_mask, _val) \
137 __BF_FIELD_CHECK_REG(_mask, 0ULL, "FIELD_PREP: "); \
138 __FIELD_PREP(_mask, _val, "FIELD_PREP: "); \
141#define __BF_CHECK_POW2(n) BUILD_BUG_ON_ZERO(((n) & ((n) - 1)) != 0)
155#define FIELD_PREP_CONST(_mask, _val) \
158 BUILD_BUG_ON_ZERO((_mask) == 0) + \
160 BUILD_BUG_ON_ZERO(~((_mask) >> __bf_shf(_mask)) & (_val)) + \
162 __BF_CHECK_POW2((_mask) + (1ULL << __bf_shf(_mask))) + \
164 (((typeof(_mask))(_val) << __bf_shf(_mask)) & (_mask)) \
175#define FIELD_GET(_mask, _reg) \
177 __BF_FIELD_CHECK_REG(_mask, _reg, "FIELD_GET: "); \
178 __FIELD_GET(_mask, _reg, "FIELD_GET: "); \
189#define FIELD_GET_SIGNED(mask, reg) \
191 __BF_FIELD_CHECK(mask, reg, 0U, "FIELD_GET_SIGNED: "); \
192 ((__signed_scalar_typeof(mask)) \
193 (((long long)(reg) << __builtin_clzll(mask)) >> \
194 (__builtin_clzll(mask) + __builtin_ctzll(mask)))); \
206#define FIELD_MODIFY(_mask, _reg_p, _val) \
208 typecheck_pointer(_reg_p); \
209 __BF_FIELD_CHECK(_mask, *(_reg_p), _val, "FIELD_MODIFY: "); \
210 *(_reg_p) &= ~(_mask); \
211 *(_reg_p) |= (((typeof(_mask))(_val) << __bf_shf(_mask)) & (_mask)); \
215__field_overflow(
void);
220 if ((field | (field - 1)) & ((field | (field - 1)) + 1))
222 return field & -field;
226 return field / field_multiplier(field);
228#define field_max(field) ((typeof(field))field_mask(field))
229#define ____MAKE_OP(type,base,to,from) \
230static __always_inline __##type __must_check type##_encode_bits(base v, base field) \
232 if (__builtin_constant_p(v) && (v & ~field_mask(field))) \
233 __field_overflow(); \
234 return to((v & field_mask(field)) * field_multiplier(field)); \
236static __always_inline __##type __must_check type##_replace_bits(__##type old, \
237 base val, base field) \
239 return (old & ~to(field)) | type##_encode_bits(val, field); \
241static __always_inline void type##p_replace_bits(__##type *p, \
242 base val, base field) \
244 *p = (*p & ~to(field)) | type##_encode_bits(val, field); \
246static __always_inline base __must_check type##_get_bits(__##type v, base field) \
248 return (from(v) & field)/field_multiplier(field); \
250#define __MAKE_OP(size) \
251 ____MAKE_OP(le##size,u##size,cpu_to_le##size,le##size##_to_cpu) \
252 ____MAKE_OP(be##size,u##size,cpu_to_be##size,be##size##_to_cpu) \
253 ____MAKE_OP(u##size,u##size,,)
261#define __field_prep(mask, val) \
263 auto __mask = (mask); \
264 typeof(__mask) __val = (val); \
265 unsigned int __shift = BITS_PER_TYPE(__mask) <= 32 ? \
266 __ffs(__mask) : __ffs64(__mask); \
267 (__val << __shift) & __mask; \
270#define __field_get(mask, reg) \
272 auto __mask = (mask); \
273 typeof(__mask) __reg = (reg); \
274 unsigned int __shift = BITS_PER_TYPE(__mask) <= 32 ? \
275 __ffs(__mask) : __ffs64(__mask); \
276 (__reg & __mask) >> __shift; \
295#define field_prep(mask, val) \
296 (__builtin_constant_p(mask) ? __FIELD_PREP(mask, val, "field_prep: ") \
297 : __field_prep(mask, val))
315#define field_get(mask, reg) \
316 (__builtin_constant_p(mask) ? __FIELD_GET(mask, reg, "field_get: ") \
317 : __field_get(mask, reg))
#define ____MAKE_OP(type, base, to, from)
Definition bitfield.h:229
#define __MAKE_OP(size)
Definition bitfield.h:250
#define __compiletime_error(msg)
Definition compiler_attributes.h:140
#define __always_inline
Definition compiler_attributes.h:55
uint64_t u64
Definition kernel.h:17
uint8_t u8
Definition kernel.h:14