Message ID | 20190527083412.26651-2-yamada.masahiro@socionext.com |
---|---|
State | Superseded |
Headers | show |
Series | Allow assembly code to use BIT(), GENMASK(), etc. and clean-up arm64 header | expand |
On Mon, May 27, 2019 at 05:34:11PM +0900, Masahiro Yamada wrote: > BIT(), GENMASK(), etc. are useful to define register bits of hardware. > However, low-level code is often written in assembly, where they are > not available due to the hard-coded 1UL, 0UL. > > In fact, in-kernel headers such as arch/arm64/include/asm/sysreg.h > use _BITUL() instead of BIT() so that the register bit macros are > available in assembly. > > Using macros in include/uapi/linux/const.h have two reasons: > > [1] For use in uapi headers > We should use underscore-prefixed variants for user-space. > > [2] For use in assembly code > Since _BITUL() does not use hard-coded 1UL, it can be used as an > alternative of BIT(). > > For [2], it is pretty easy to change BIT() etc. for use in assembly. > > This allows to replace _BUTUL() in kernel headers with BIT(). > > Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> > --- > > include/linux/bits.h | 17 ++++++++++------- > 1 file changed, 10 insertions(+), 7 deletions(-) Acked-by: Will Deacon <will.deacon@arm.com> Will
diff --git a/include/linux/bits.h b/include/linux/bits.h index 2b7b532c1d51..669d69441a62 100644 --- a/include/linux/bits.h +++ b/include/linux/bits.h @@ -1,13 +1,15 @@ /* SPDX-License-Identifier: GPL-2.0 */ #ifndef __LINUX_BITS_H #define __LINUX_BITS_H + +#include <linux/const.h> #include <asm/bitsperlong.h> -#define BIT(nr) (1UL << (nr)) -#define BIT_ULL(nr) (1ULL << (nr)) -#define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG)) +#define BIT(nr) (UL(1) << (nr)) +#define BIT_ULL(nr) (ULL(1) << (nr)) +#define BIT_MASK(nr) (UL(1) << ((nr) % BITS_PER_LONG)) #define BIT_WORD(nr) ((nr) / BITS_PER_LONG) -#define BIT_ULL_MASK(nr) (1ULL << ((nr) % BITS_PER_LONG_LONG)) +#define BIT_ULL_MASK(nr) (ULL(1) << ((nr) % BITS_PER_LONG_LONG)) #define BIT_ULL_WORD(nr) ((nr) / BITS_PER_LONG_LONG) #define BITS_PER_BYTE 8 @@ -17,10 +19,11 @@ * GENMASK_ULL(39, 21) gives us the 64bit vector 0x000000ffffe00000. */ #define GENMASK(h, l) \ - (((~0UL) - (1UL << (l)) + 1) & (~0UL >> (BITS_PER_LONG - 1 - (h)))) + (((~UL(0)) - (UL(1) << (l)) + 1) & \ + (~UL(0) >> (BITS_PER_LONG - 1 - (h)))) #define GENMASK_ULL(h, l) \ - (((~0ULL) - (1ULL << (l)) + 1) & \ - (~0ULL >> (BITS_PER_LONG_LONG - 1 - (h)))) + (((~ULL(0)) - (ULL(1) << (l)) + 1) & \ + (~ULL(0) >> (BITS_PER_LONG_LONG - 1 - (h)))) #endif /* __LINUX_BITS_H */
BIT(), GENMASK(), etc. are useful to define register bits of hardware. However, low-level code is often written in assembly, where they are not available due to the hard-coded 1UL, 0UL. In fact, in-kernel headers such as arch/arm64/include/asm/sysreg.h use _BITUL() instead of BIT() so that the register bit macros are available in assembly. Using macros in include/uapi/linux/const.h have two reasons: [1] For use in uapi headers We should use underscore-prefixed variants for user-space. [2] For use in assembly code Since _BITUL() does not use hard-coded 1UL, it can be used as an alternative of BIT(). For [2], it is pretty easy to change BIT() etc. for use in assembly. This allows to replace _BUTUL() in kernel headers with BIT(). Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> --- include/linux/bits.h | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) -- 2.17.1