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