Added bitmask macros
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 15 Apr 2009 19:15:53 +0000 (12:15 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 15 Apr 2009 19:15:53 +0000 (12:15 -0700)
inc/types.h
kern/testing.c
kern/testing.h

index 60d6384..684b00c 100644 (file)
@@ -73,4 +73,22 @@ typedef int32_t off_t;
 // a uint64_t programatically
 #define UINT64(upper, lower) ( (((uint64_t)(upper)) << 32) | (lower) )
 
+#define BYTES_FOR_BITMASK(size) ((size) ? ((size) - 1) / 8 + 1 : 0)
+
+//#define DECL_BITMASK(name, size) (uint8_t COUNT(BYTES_FOR_BITMASK((size)))
+#define DECL_BITMASK(name, size) uint8_t \
+       (name)[BYTES_FOR_BITMASK((size))]
+
+#define CLR_BITMASK(name, size) (memset((name), 0, BYTES_FOR_BITMASK((size))))
+
+#define GET_BITMASK_BIT(name, bit) (((name)[(bit)/8] & (1 << ((bit) % 8))) ?1:0)
+
+#define SET_BITMASK_BIT(name, bit) ((name)[(bit)/8] |= (1 << ((bit) % 8)))
+
+#define CLR_BITMASK_BIT(name, bit) ((name)[(bit)/8] &= ~(1 << ((bit) % 8)))
+
+
+
+
+
 #endif /* !JOS_INC_TYPES_H */
index 3717593..f0b4be9 100644 (file)
@@ -6,6 +6,7 @@
 #include <inc/x86.h>
 #include <inc/stdio.h>
 #include <inc/assert.h>
+#include <inc/string.h>
 
 #include <kern/testing.h>
 #include <kern/trap.h>
@@ -198,6 +199,36 @@ void test_interrupts_irqsave(void)
        cprintf("Passed enable_irqsave tests\n");
 }
 
+void test_bitmasks(void)
+{
+#define print_mask() { \
+       for (int i = 0; i < BYTES_FOR_BITMASK(258); i++) \
+               for (int j = 0; j < 8; j++) \
+                       printk("%x", (mask[i] >> j) & 1); \
+       printk("\n"); \
+} 
+
+       DECL_BITMASK(mask, 258);
+       printk("size of mask %d\n", sizeof(mask));
+       CLR_BITMASK(mask, 258);
+       print_mask();
+       printk("cleared\n");
+       SET_BITMASK_BIT(mask, 0);
+       SET_BITMASK_BIT(mask, 11);
+       SET_BITMASK_BIT(mask, 17);
+       SET_BITMASK_BIT(mask, 257);
+       printk("bits set\n");
+       print_mask();
+       CLR_BITMASK_BIT(mask, 11);
+       printk("11 cleared\n");
+       print_mask();
+       printk("bit 17 is %d (should be 1)\n", GET_BITMASK_BIT(mask, 17));
+       printk("bit 11 is %d (should be 0)\n", GET_BITMASK_BIT(mask, 11));
+       CLR_BITMASK(mask, 258);
+       print_mask();
+       printk("should be cleared\n");
+}
+
 /* Helper Functions */
 
 void test_hello_world_handler(struct Trapframe *tf)
index c9d6785..de2852b 100644 (file)
@@ -15,6 +15,7 @@ void test_pic_reception(void);
 void test_print_info(void);
 void test_barrier(void);
 void test_interrupts_irqsave(void);
+void test_bitmasks(void);
 
 void test_hello_world_handler(struct Trapframe *tf);
 void test_print_info_handler(struct Trapframe *tf);