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 Cc: Will Deacon Link: https://lore.kernel.org/all/20250211114018.GB8965@willie-the-truck/ Signed-off-by: Suzuki K Poulose --- 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