![](https://secure.gravatar.com/avatar/17473c8dd27516724006cfed6d0b469d.jpg?s=120&d=mm&r=g)
On 11/22/21 10:32 AM, Johannes Berg wrote:
On Mon, 2021-11-22 at 16:53 +0100, Geert Uytterhoeven wrote:
The existing FIELD_{GET,PREP}() macros are limited to compile-time constants. However, it is very common to prepare or extract bitfield elements where the bitfield mask is not a compile-time constant.
I'm not sure it's really a good idea to add a third API here?
We have the upper-case (constant) versions, and already {u32,...}_get_bits()/etc.
I've used these a lot (and personally prefer the lower-case ones).
Your new macros don't do anything to ensure the field mask is of the right form, which is basically: (2 ^ width - 1) << shift
I really like the property that the field mask must be constant.
That being said, I've had to use some strange coding patterns in order to adhere to the "const only" rule in a few cases. So if you can come up with a satisfactory naming scheme I'm all for it.
-Alex
Also, you're using __ffs(), which doesn't work for 64-bit on 32-bit architectures (afaict), so that seems a bit awkward.
Maybe we can make {u32,...}_get_bits() be doing compile-time only checks if it is indeed a constant? The __field_overflow() usage is already only done if __builtin_constant_p(v), so I guess we can do the same with __bad_mask()?
johannes