Skip to contentSkip to conversation

include: bitops/const: partial update from Linux

PATCH Applied Denis Orlov 2 participants 5 messages Jun 9, 2023

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

cover include: bitops/const: partial update from Linux

This updates some of the definitions in those files, mainly to make BIT*/GENMASK() macros usable in assembly code.

Denis Orlov (3):
include: const: make UL/ULL() macros commonly available
include: bitops: allow BIT* macros to be used in assembly code
include: bitops: import more BITS_TO_* defines from linux

 arch/arm/include/asm/memory.h    |  5 -----
 arch/arm/include/asm/pgtable64.h |  2 --
 arch/kvx/include/asm/sfr_defs.h  |  2 --
 include/linux/bitops.h           | 24 +++++++++++++++++-------
 include/linux/const.h            | 10 ++++++++--
 5 files changed, 25 insertions(+), 18 deletions(-)
Signature · 1 line
2.41.0
#1 lore raw

PATCH 1/3 include: const: make UL/ULL() macros commonly available

Import the definitions from Linux. Some code actually used those already, defining them locally. As these are not needed now that there are common ones available, remove the duplicate definitions.

While at it, also update _BITUL/_BITULL() definitions to align more with the latest Linux sources.

---
 arch/arm/include/asm/memory.h    |  5 -----
 arch/arm/include/asm/pgtable64.h |  2 --
 arch/kvx/include/asm/sfr_defs.h  |  2 --
 include/linux/const.h            | 10 ++++++++--
 4 files changed, 8 insertions(+), 11 deletions(-)
arch/arm/include/asm/memory.h +0 -5
index 2b454fa673..23fbbd8438 100644
@@ -6,11 +6,6 @@
 #include <memory.h>
 
 #include <linux/const.h>
-/*
- * Allow for constants defined here to be used from assembly code
- * by prepending the UL suffix only with actual C code compilation.
- */
-#define UL(x) _AC(x, UL)
 
 static inline int arm_add_mem_device(const char* name, resource_size_t start,
 				     resource_size_t size)
arch/arm/include/asm/pgtable64.h +0 -2
index dbec61753b..21dac30cfe 100644
@@ -4,8 +4,6 @@
 #ifndef __ASM_PGTABLE64_H
 #define __ASM_PGTABLE64_H
 
-#define UL(x)		_AC(x, UL)
-
 #define UNUSED_DESC                0x6EbAAD0BBADbA6E0
 
 #define VA_START                   0x0
arch/kvx/include/asm/sfr_defs.h +0 -2
index 2b7598e0aa..7f6fbd206b 100644
@@ -8,8 +8,6 @@
 
 #include <linux/const.h>
 
-#define _ULL(X) _AC(X, ULL)
-
 /* Register file indices */
 #define KVX_SFR_PC 0 /* Program Counter $pc $s0 */
 #define KVX_SFR_PS 1 /* Processor State $ps $s1 */
include/linux/const.h +8 -2
index 07f886d271..07414f95de 100644
@@ -23,7 +23,13 @@
 #define _AT(T,X)	((T)(X))
 #endif
 
-#define _BITUL(x)	(_AC(1,UL) << (x))
-#define _BITULL(x)	(_AC(1,ULL) << (x))
+#define _UL(x)		(_AC(x, UL))
+#define _ULL(x)		(_AC(x, ULL))
+
+#define _BITUL(x)	(_UL(1) << (x))
+#define _BITULL(x)	(_ULL(1) << (x))
+
+#define UL(x)		(_UL(x))
+#define ULL(x)		(_ULL(x))
 
 #endif /* !(_LINUX_CONST_H) */
Signature · 1 line
2.41.0
#2 lore raw

PATCH 2/3 include: bitops: allow BIT* macros to be used in assembly code

In reply to Denis Orlov

Use UL/ULL() macros for those so that corresponding suffixes only appear when we are compiling C code. Hide all the other functions/macros that we can't use in assembly with '#ifndef __ASSEMBLY__'.

---
 include/linux/bitops.h | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)
include/linux/bitops.h +12 -6
index eb5ff37f2f..d9a5a81a9c 100644
@@ -2,14 +2,16 @@
 
 #ifndef _LINUX_BITOPS_H
 #define _LINUX_BITOPS_H
+
 #include <linux/types.h>
+#include <linux/const.h>
 
 #ifdef	__KERNEL__
-#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
 #define BITS_TO_LONGS(nr)	DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
@@ -21,11 +23,14 @@
  * GENMASK_ULL(39, 21) gives us the 64bit vector 0x000000ffffe00000.
  */
 #define GENMASK(h, l) \
-	(((~0UL) << (l)) & (~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) << (l)) & (~0ULL >> (BITS_PER_LONG_LONG - 1 - (h))))
+	(((~ULL(0)) - (ULL(1) << (l)) + 1) & \
+	 (~ULL(0) >> (BITS_PER_LONG_LONG - 1 - (h))))
 
+#ifndef __ASSEMBLY__
 /*
  * Include this here because some architectures need generic_ffs/fls in
  * scope
@@ -237,5 +242,6 @@ extern unsigned long find_last_bit(const unsigned long *addr,
 				   unsigned long size);
 #endif
 
+#endif /* !(__ASSEMBLY__) */
 #endif /* __KERNEL__ */
 #endif
Signature · 1 line
2.41.0
#3 lore raw

PATCH 3/3 include: bitops: import more BITS_TO_* defines from linux

In reply to Denis Orlov

Those seem quite useful, e.g. when defining bitmasks.

---
 include/linux/bitops.h | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
include/linux/bitops.h +5 -1
index d9a5a81a9c..a5f6ac6545 100644
@@ -14,7 +14,11 @@
 #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
-#define BITS_TO_LONGS(nr)	DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
+#define BITS_PER_TYPE(type)	(sizeof(type) * BITS_PER_BYTE)
+#define BITS_TO_LONGS(nr)	DIV_ROUND_UP(nr, BITS_PER_TYPE(long))
+#define BITS_TO_U64(nr)		DIV_ROUND_UP(nr, BITS_PER_TYPE(u64))
+#define BITS_TO_U32(nr)		DIV_ROUND_UP(nr, BITS_PER_TYPE(u32))
+#define BITS_TO_BYTES(nr)	DIV_ROUND_UP(nr, BITS_PER_TYPE(char))
 #endif
 
 /*
Signature · 1 line
2.41.0
Applied
#4 lore raw
In reply to Denis Orlov
Quoted 7 lines · Denis Orlov

This updates some of the definitions in those files, mainly to make BIT*/GENMASK() macros usable in assembly code.

Denis Orlov (3):
include: const: make UL/ULL() macros commonly available
include: bitops: allow BIT* macros to be used in assembly code
include: bitops: import more BITS_TO_* defines from linux

Applied, thanks

Sascha

Quoted 12 lines
 arch/arm/include/asm/memory.h    |  5 -----
 arch/arm/include/asm/pgtable64.h |  2 --
 arch/kvx/include/asm/sfr_defs.h  |  2 --
 include/linux/bitops.h           | 24 +++++++++++++++++-------
 include/linux/const.h            | 10 ++++++++--
 5 files changed, 25 insertions(+), 18 deletions(-)
Signature · 1 line
2.41.0
Signature · 4 lines
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |