diff --git a/tools/libxc/xc_bitops.h b/tools/libxc/xc_bitops.h index cd749f4014..3e7a544c9d 100644 --- a/tools/libxc/xc_bitops.h +++ b/tools/libxc/xc_bitops.h @@ -6,70 +6,73 @@ #include #include +/* Needed by several includees, but no longer used for bitops. */ #define BITS_PER_LONG (sizeof(unsigned long) * 8) #define ORDER_LONG (sizeof(unsigned long) == 4 ? 5 : 6) -#define BITMAP_ENTRY(_nr,_bmap) ((_bmap))[(_nr)/BITS_PER_LONG] -#define BITMAP_SHIFT(_nr) ((_nr) % BITS_PER_LONG) +#define BITMAP_ENTRY(_nr,_bmap) ((_bmap))[(_nr) / 8] +#define BITMAP_SHIFT(_nr) ((_nr) % 8) /* calculate required space for number of longs needed to hold nr_bits */ static inline int bitmap_size(int nr_bits) { - int nr_long, nr_bytes; - nr_long = (nr_bits + BITS_PER_LONG - 1) >> ORDER_LONG; - nr_bytes = nr_long * sizeof(unsigned long); - return nr_bytes; + return (nr_bits + 7) / 8; } -static inline unsigned long *bitmap_alloc(int nr_bits) +static inline void *bitmap_alloc(int nr_bits) { return calloc(1, bitmap_size(nr_bits)); } -static inline void bitmap_set(unsigned long *addr, int nr_bits) +static inline void bitmap_set(void *addr, int nr_bits) { memset(addr, 0xff, bitmap_size(nr_bits)); } -static inline void bitmap_clear(unsigned long *addr, int nr_bits) +static inline void bitmap_clear(void *addr, int nr_bits) { memset(addr, 0, bitmap_size(nr_bits)); } -static inline int test_bit(int nr, unsigned long *addr) +static inline int test_bit(int nr, const void *_addr) { + const char *addr = _addr; return (BITMAP_ENTRY(nr, addr) >> BITMAP_SHIFT(nr)) & 1; } -static inline void clear_bit(int nr, unsigned long *addr) +static inline void clear_bit(int nr, void *_addr) { + char *addr = _addr; BITMAP_ENTRY(nr, addr) &= ~(1UL << BITMAP_SHIFT(nr)); } -static inline void set_bit(int nr, unsigned long *addr) +static inline void set_bit(int nr, void *_addr) { + char *addr = _addr; BITMAP_ENTRY(nr, addr) |= (1UL << BITMAP_SHIFT(nr)); } -static inline int test_and_clear_bit(int nr, unsigned long *addr) +static inline int test_and_clear_bit(int nr, void *addr) { int oldbit = test_bit(nr, addr); clear_bit(nr, addr); return oldbit; } -static inline int test_and_set_bit(int nr, unsigned long *addr) +static inline int test_and_set_bit(int nr, void *addr) { int oldbit = test_bit(nr, addr); set_bit(nr, addr); return oldbit; } -static inline void bitmap_or(unsigned long *dst, const unsigned long *other, +static inline void bitmap_or(void *_dst, const void *_other, int nr_bits) { - int i, nr_longs = (bitmap_size(nr_bits) / sizeof(unsigned long)); - for ( i = 0; i < nr_longs; ++i ) + char *dst = _dst; + const char *other = _other; + int i; + for ( i = 0; i < bitmap_size(nr_bits); ++i ) dst[i] |= other[i]; } diff --git a/tools/libxc/xc_misc.c b/tools/libxc/xc_misc.c index 124537bdc1..7d997d98ad 100644 --- a/tools/libxc/xc_misc.c +++ b/tools/libxc/xc_misc.c @@ -99,6 +99,9 @@ xc_cpumap_t xc_cpumap_alloc(xc_interface *xch) * byte aligned and so we need byte versions for architectures which do * not support misaligned accesses (which is basically everyone * but x86, although even on x86 it can be inefficient). + * + * NOTE: The xc_bitops macros now use byte alignment. + * TODO: Clean up the users of this interface. */ #define BITS_PER_CPUMAP(map) (sizeof(*map) * 8) #define CPUMAP_ENTRY(cpu, map) ((map))[(cpu) / BITS_PER_CPUMAP(map)]