[PATCH v7 01/17] headers: Update linux/const.h from linux sources

Suzuki K Poulose posted 17 patches 2 days, 13 hours ago
[PATCH v7 01/17] headers: Update linux/const.h from linux sources
Posted by Suzuki K Poulose 2 days, 13 hours ago
Building kvmtool from scratch gives me the following errors with buildroot:

In file included from include/kvm/pci.h:7,
                 from include/kvm/vfio.h:6,
                 from include/kvm/kvm-config.h:5,
                 from include/kvm/kvm.h:6,
                 from builtin-version.c:4:
include/linux/virtio_pci.h:323:20: warning: implicit declaration of function ‘__KERNEL_DIV_ROUND_UP’ [-Wimplicit-function-declaration]
  323 | #define MAX_CAP_ID __KERNEL_DIV_ROUND_UP(VIRTIO_DEV_PARTS_CAP + 1, 64)
      |                    ^~~~~~~~~~~~~~~~~~~~~
include/linux/virtio_pci.h:326:24: note: in expansion of macro ‘MAX_CAP_ID’
  326 |  __le64 supported_caps[MAX_CAP_ID];
      |                        ^~~~~~~~~~
include/linux/virtio_pci.h:326:9: error: variably modified ‘supported_caps’ at file scope
  326 |  __le64 supported_caps[MAX_CAP_ID];

We inherit linux/virtio_pci.h from the kernel sources and won't be good to fix
it by including linux/kernel.h. Instead, pick up up uapi/linux/const.h from the
kernel tree. This also removes the ifdefery linux/kernel.h

To prevent a build warning for redefinition, update the headers from v6.19,
remove the hack from linux.kernel.h in one shot. This was also discussed in
the Link, in another context.

Cc: Anup Patel <apatel@ventanamicro.com>
Cc: Will Deacon <will@kernel.org>
Link: https://lore.kernel.org/all/20250211114018.GB8965@willie-the-truck/
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
---
 include/linux/const.h  | 53 ++++++++++++++++++++++++++++++++++++++++++
 include/linux/kernel.h |  3 ---
 2 files changed, 53 insertions(+), 3 deletions(-)
 create mode 100644 include/linux/const.h

diff --git a/include/linux/const.h b/include/linux/const.h
new file mode 100644
index 00000000..b8f629ef
--- /dev/null
+++ b/include/linux/const.h
@@ -0,0 +1,53 @@
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+/* const.h: Macros for dealing with constants.  */
+
+#ifndef _UAPI_LINUX_CONST_H
+#define _UAPI_LINUX_CONST_H
+
+/* Some constant macros are used in both assembler and
+ * C code.  Therefore we cannot annotate them always with
+ * 'UL' and other type specifiers unilaterally.  We
+ * use the following macros to deal with this.
+ *
+ * Similarly, _AT() will cast an expression with a type in C, but
+ * leave it unchanged in asm.
+ */
+
+#ifdef __ASSEMBLY__
+#define _AC(X,Y)	X
+#define _AT(T,X)	X
+#else
+#define __AC(X,Y)	(X##Y)
+#define _AC(X,Y)	__AC(X,Y)
+#define _AT(T,X)	((T)(X))
+#endif
+
+#define _UL(x)		(_AC(x, UL))
+#define _ULL(x)		(_AC(x, ULL))
+
+#define _BITUL(x)	(_UL(1) << (x))
+#define _BITULL(x)	(_ULL(1) << (x))
+
+#if !defined(__ASSEMBLY__)
+/*
+ * Missing asm support
+ *
+ * __BIT128() would not work in the asm code, as it shifts an
+ * 'unsigned __int128' data type as direct representation of
+ * 128 bit constants is not supported in the gcc compiler, as
+ * they get silently truncated.
+ *
+ * TODO: Please revisit this implementation when gcc compiler
+ * starts representing 128 bit constants directly like long
+ * and unsigned long etc. Subsequently drop the comment for
+ * GENMASK_U128() which would then start supporting asm code.
+ */
+#define _BIT128(x)	((unsigned __int128)(1) << (x))
+#endif
+
+#define __ALIGN_KERNEL(x, a)		__ALIGN_KERNEL_MASK(x, (__typeof__(x))(a) - 1)
+#define __ALIGN_KERNEL_MASK(x, mask)	(((x) + (mask)) & ~(mask))
+
+#define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
+
+#endif /* _UAPI_LINUX_CONST_H */
diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index df42d63a..6c22f1c0 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -8,9 +8,6 @@
 #define round_down(x, y)	((x) & ~__round_mask(x, y))
 
 #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
-#ifndef __KERNEL_DIV_ROUND_UP
-#define __KERNEL_DIV_ROUND_UP(n,d)	DIV_ROUND_UP(n,d)
-#endif
 
 #define ALIGN(x,a)		__ALIGN_MASK(x,(typeof(x))(a)-1)
 #define __ALIGN_MASK(x,mask)	(((x)+(mask))&~(mask))
-- 
2.43.0