BITS_PER_* values can be defined in a common way using compiler-provided macros.
Thus, these definitions are moved to xen/config.h to reduce duplication across
architectures.
Additionally, *_BYTEORDER macros are removed, as BITS_PER_* values now come
directly from the compiler environment.
The arch_fls() implementation for Arm and PPC is updated to use BITS_PER_INT
instead of a hardcoded value of 32.
Suggested-by: Andrew Cooper <andrew.cooper3@citrix.com>
Signed-off-by: Oleksii Kurochko <oleksii.kurochko@gmail.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Julien Grall <jgrall@amazon.com>
#define __set_bit(n,p) set_bit(n,p)
#define __clear_bit(n,p) clear_bit(n,p)
-#define BITS_PER_BYTE 8
-
#define ADDR (*(volatile int *) addr)
#define CONST_ADDR (*(const volatile int *) addr)
#define arch_ffs(x) ((x) ? 1 + __builtin_ctz(x) : 0)
#define arch_ffsl(x) ((x) ? 1 + __builtin_ctzl(x) : 0)
-#define arch_fls(x) ((x) ? 32 - __builtin_clz(x) : 0)
+#define arch_fls(x) ((x) ? BITS_PER_INT - __builtin_clz(x) : 0)
#define arch_flsl(x) ((x) ? BITS_PER_LONG - __builtin_clzl(x) : 0)
#endif /* _ARM_BITOPS_H */
#define __ARM_CONFIG_H__
#if defined(CONFIG_ARM_64)
-# define LONG_BYTEORDER 3
# define ELFSIZE 64
#else
-# define LONG_BYTEORDER 2
# define ELFSIZE 32
#endif
-#define BYTES_PER_LONG (1 << LONG_BYTEORDER)
-#define BITS_PER_LONG (BYTES_PER_LONG << 3)
-#define POINTER_ALIGN BYTES_PER_LONG
-
-#define BITS_PER_LLONG 64
-
/* xen_ulong_t is always 64 bits */
#define BITS_PER_XEN_ULONG 64
#define __set_bit(n, p) set_bit(n, p)
#define __clear_bit(n, p) clear_bit(n, p)
-#define BITS_PER_BYTE 8
-
/* PPC bit number conversion */
#define PPC_BITLSHIFT(be) (BITS_PER_LONG - 1 - (be))
#define PPC_BIT(bit) (1UL << PPC_BITLSHIFT(bit))
#define arch_ffs(x) ((x) ? 1 + __builtin_ctz(x) : 0)
#define arch_ffsl(x) ((x) ? 1 + __builtin_ctzl(x) : 0)
-#define arch_fls(x) ((x) ? 32 - __builtin_clz(x) : 0)
+#define arch_fls(x) ((x) ? BITS_PER_INT - __builtin_clz(x) : 0)
#define arch_flsl(x) ((x) ? BITS_PER_LONG - __builtin_clzl(x) : 0)
#define arch_hweightl(x) __builtin_popcountl(x)
#include <xen/page-size.h>
#if defined(CONFIG_PPC64)
-#define LONG_BYTEORDER 3
#define ELFSIZE 64
#define MAX_VIRT_CPUS 1024u
#else
#error "Unsupported PowerPC variant"
#endif
-#define BYTES_PER_LONG (1 << LONG_BYTEORDER)
-#define BITS_PER_LONG (BYTES_PER_LONG << 3)
-#define POINTER_ALIGN BYTES_PER_LONG
-
-#define BITS_PER_LLONG 64
-
/* xen_ulong_t is always 64 bits */
#define BITS_PER_XEN_ULONG 64
#define HYPERVISOR_VIRT_START XEN_VIRT_START
#if defined(CONFIG_RISCV_64)
-# define INT_BYTEORDER 2
-# define LONG_BYTEORDER 3
# define ELFSIZE 64
# define MAX_VIRT_CPUS 128u
#else
# error "Unsupported RISCV variant"
#endif
-#define BYTES_PER_INT (1 << INT_BYTEORDER)
-#define BITS_PER_INT (BYTES_PER_INT << 3)
-
-#define BYTES_PER_LONG (1 << LONG_BYTEORDER)
-#define BITS_PER_LONG (BYTES_PER_LONG << 3)
-#define POINTER_ALIGN BYTES_PER_LONG
-
-#define BITS_PER_LLONG 64
-
-#define BITS_PER_BYTE 8
-
/* xen_ulong_t is always 64 bits */
#define BITS_PER_XEN_ULONG 64
#ifndef __X86_CONFIG_H__
#define __X86_CONFIG_H__
-#define LONG_BYTEORDER 3
#define CONFIG_PAGING_LEVELS 4
-#define BYTES_PER_LONG (1 << LONG_BYTEORDER)
-#define BITS_PER_LONG (BYTES_PER_LONG << 3)
-#define BITS_PER_BYTE 8
-#define POINTER_ALIGN BYTES_PER_LONG
-
-#define BITS_PER_LLONG 64
-
#define BITS_PER_XEN_ULONG BITS_PER_LONG
#define CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS 1
#define ZERO_BLOCK_PTR ((void *)-1L)
#endif
+#define BYTES_PER_LONG __SIZEOF_LONG__
+
+#define BITS_PER_BYTE __CHAR_BIT__
+#define BITS_PER_INT (BITS_PER_BYTE * __SIZEOF_INT__)
+#define BITS_PER_LONG (BITS_PER_BYTE * BYTES_PER_LONG)
+#define BITS_PER_LLONG (BITS_PER_BYTE * __SIZEOF_LONG_LONG__)
+
+/* It is assumed that sizeof(void *) == __alignof(void *) */
+#define POINTER_ALIGN __SIZEOF_POINTER__
+
#endif /* __XEN_CONFIG_H__ */