1
/* Unit test bitmap parser */
3
//#include <asm/bitops.h>
10
#define ALIGN(x,a) (((x)+(a)-1)&~((a)-1))
12
#define test_bit(i,p) ((p)[(i) / BITS_PER_LONG] & (1UL << ((i)%BITS_PER_LONG)))
13
#define set_bit(i,p) ((p)[(i) / BITS_PER_LONG] |= (1UL << ((i)%BITS_PER_LONG)))
14
#define clear_bit(i,p) ((p)[(i) / BITS_PER_LONG] &= ~(1UL << ((i)%BITS_PER_LONG)))
18
#define BITS_PER_LONG (sizeof(long)*8)
20
#define round_up(x,y) (((x) + (y) - 1) & ~((y)-1))
22
#define CPU_BYTES(x) (round_up(x, BITS_PER_LONG)/8)
23
#define CPU_LONGS(x) (CPU_BYTES(x) / sizeof(long))
25
/* Following routine extracted from Linux 2.6.16 */
28
#define nbits_to_hold_value(val) fls(val)
29
#define unhex(c) (isdigit(c) ? (c - '0') : (toupper(c) - 'A' + 10))
30
#define BASEDEC 10 /* fancier cpuset lists input in decimal */
33
* bitmap_scnprintf - convert bitmap to an ASCII hex string.
34
* @buf: byte buffer into which string is placed
35
* @buflen: reserved size of @buf, in bytes
36
* @maskp: pointer to bitmap to convert
37
* @nmaskbits: size of bitmap, in bits
39
* Exactly @nmaskbits bits are displayed. Hex digits are grouped into
40
* comma-separated sets of eight digits per set.
42
int bitmap_scnprintf(char *buf, unsigned int buflen,
43
const unsigned long *maskp, int nmaskbits)
45
int i, word, bit, len = 0;
51
chunksz = nmaskbits & (CHUNKSZ - 1);
55
i = ALIGN(nmaskbits, CHUNKSZ) - CHUNKSZ;
56
for (; i >= 0; i -= CHUNKSZ) {
57
chunkmask = ((1ULL << chunksz) - 1);
58
word = i / BITS_PER_LONG;
59
bit = i % BITS_PER_LONG;
60
val = (maskp[word] >> bit) & chunkmask;
61
len += snprintf(buf+len, buflen-len, "%s%0*lx", sep,
69
extern int numa_parse_bitmap(char *buf,unsigned long *mask, unsigned bits);
74
unsigned long mask[20], mask2[20];
76
printf("Testing bitmap functions\n");
77
for (i = 0; i < 300; i++) {
78
memset(mask, 0, sizeof(mask));
79
memset(mask2, 0, sizeof(mask));
81
bitmap_scnprintf(buf, sizeof(buf), mask, 300);
83
if (numa_parse_bitmap(buf, mask2, 300) < 0)
85
if (memcmp(mask, mask2, sizeof(mask))) {
86
bitmap_scnprintf(buf, sizeof(buf), mask2, 300);
87
printf("mask2 differs: %s\n", buf);