[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 1/7] xen/bitops: Cleanup ahead of rearrangements
* Rename __attribute_pure__ to just __pure before it gains users. * Identify the areas of xen/bitops.h which are a mess. * Create common/bitops.c for compile and runtime testing. This provides a statement of the ABI, and a confirmation that arch-specific implementations behave as expected. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- CC: Jan Beulich <JBeulich@xxxxxxxx> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx> CC: Wei Liu <wl@xxxxxxx> CC: Stefano Stabellini <sstabellini@xxxxxxxxxx> CC: Julien Grall <julien@xxxxxxx> CC: Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx> CC: Bertrand Marquis <bertrand.marquis@xxxxxxx> CC: Michal Orzel <michal.orzel@xxxxxxx> CC: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx> CC: Shawn Anastasio <sanastasio@xxxxxxxxxxxxxxxxxxxxx> CC: consulting@xxxxxxxxxxx <consulting@xxxxxxxxxxx> CC: Simone Ballarin <simone.ballarin@xxxxxxxxxxx> CC: Federico Serafini <federico.serafini@xxxxxxxxxxx> CC: Nicola Vetrini <nicola.vetrini@xxxxxxxxxxx> I expect MISRA will have something to say about the macros here, but they are in aid of better testing. --- xen/common/Makefile | 1 + xen/common/bitops.c | 41 ++++++++++++++++++++++++++++++++++++++ xen/include/xen/bitops.h | 13 +++++++++--- xen/include/xen/compiler.h | 3 ++- 4 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 xen/common/bitops.c diff --git a/xen/common/Makefile b/xen/common/Makefile index e5eee19a8537..1f8ca9a2f4f8 100644 --- a/xen/common/Makefile +++ b/xen/common/Makefile @@ -1,5 +1,6 @@ obj-$(CONFIG_ARGO) += argo.o obj-y += bitmap.o +obj-y += bitops.o obj-$(CONFIG_GENERIC_BUG_FRAME) += bug.o obj-$(CONFIG_HYPFS_CONFIG) += config_data.o obj-$(CONFIG_CORE_PARKING) += core_parking.o diff --git a/xen/common/bitops.c b/xen/common/bitops.c new file mode 100644 index 000000000000..4c07191b4030 --- /dev/null +++ b/xen/common/bitops.c @@ -0,0 +1,41 @@ +#include <xen/bitops.h> +#include <xen/bug.h> +#include <xen/init.h> + +/* Hide a value from the optimiser. */ +#define HIDE(x) ({ typeof(x) _x = x; asm volatile ( "" : "+r" (_x) ); _x; }) + +/* + * Check that fn(val) can be calcuated by the compiler, and that it gives the + * expected answer. + */ +#define COMPILE_CHECK(fn, val, res) \ + do { \ + if ( fn(val) != res ) \ + asm (".error \"Compile time check '" STR(fn(val) == res) "' failed\""); \ + } while ( 0 ) + +/* + * Check that Xen's runtime logic for fn(val) gives the expected answer. This + * requires using HIDE() to prevent the optimiser from emitting the full + * calculation. + */ +#define RUNTIME_CHECK(fn, val, res) \ + do { \ + BUG_ON(fn(HIDE(val)) != res); \ + } while ( 0 ) + +/* + * Perform compiletime and runtime checks for fn(val) == res. + */ +#define CHECK(fn, val, res) \ + do { \ + COMPILE_CHECK(fn, val, res); \ + RUNTIME_CHECK(fn, val, res); \ + } while ( 0 ) + +static int __init cf_check test_bitops(void) +{ + return 0; +} +__initcall(test_bitops); diff --git a/xen/include/xen/bitops.h b/xen/include/xen/bitops.h index e3c5a4ccf321..9b40f20381a2 100644 --- a/xen/include/xen/bitops.h +++ b/xen/include/xen/bitops.h @@ -1,5 +1,7 @@ -#ifndef _LINUX_BITOPS_H -#define _LINUX_BITOPS_H +#ifndef XEN_BITOPS_H +#define XEN_BITOPS_H + +#include <xen/compiler.h> #include <xen/types.h> /* @@ -103,8 +105,13 @@ static inline int generic_flsl(unsigned long x) * Include this here because some architectures need generic_ffs/fls in * scope */ + +/* --------------------- Please tidy above here --------------------- */ + #include <asm/bitops.h> +/* --------------------- Please tidy below here --------------------- */ + #ifndef find_next_bit /** * find_next_bit - find the next set bit in a memory region @@ -294,4 +301,4 @@ static inline __u32 ror32(__u32 word, unsigned int shift) #define BIT_WORD(nr) ((nr) / BITS_PER_LONG) -#endif +#endif /* XEN_BITOPS_H */ diff --git a/xen/include/xen/compiler.h b/xen/include/xen/compiler.h index 16d554f2a593..972719df55b3 100644 --- a/xen/include/xen/compiler.h +++ b/xen/include/xen/compiler.h @@ -85,7 +85,8 @@ #define inline inline __init #endif -#define __attribute_pure__ __attribute__((__pure__)) +#define __pure __attribute__((__pure__)) + #define __attribute_const__ __attribute__((__const__)) #define __transparent__ __attribute__((__transparent_union__)) -- 2.30.2
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |