Adds __ALIGN_MASK (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 31 Dec 2014 15:51:36 +0000 (10:51 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 31 Dec 2014 18:03:10 +0000 (13:03 -0500)
Helper used in bitmap code.  We could use it in kmalloc_align if we want.  To
keep that option open, I've asserted kmalloc aligns are a power of 2.  The
current code (ROUNDUP) can handle non-powers of 2.

Technically, ros/common.h is a kernel header, but don't worry about it in this
case.

kern/include/ros/common.h
kern/src/bitmap.c
kern/src/kmalloc.c

index 307c7a9..af460a5 100644 (file)
@@ -34,7 +34,12 @@ typedef unsigned long uintreg_t;
 #define PiB    1125899906842624ull
 #define EiB    1152921504606846976ull
 
+/* Test for alignment, e.g. 2^6 */
 #define ALIGNED(p, a)  (!(((uintptr_t)(p)) & ((a)-1)))
+/* Aligns x up to the mask, e.g. (2^6 - 1) */
+#define __ALIGN_MASK(x, mask)       (((x) + (mask)) & ~(mask))
+/* Will return false for 0.  Debatable, based on what you want. */
+#define IS_PWR2(x) ((x) && !((x) & (x - 1)))
 
 #define ARRAY_SIZE(x) (sizeof((x))/sizeof((x)[0]))
 
index 9e64a0b..fecf491 100644 (file)
@@ -13,8 +13,6 @@
 #include <bitops.h>
 #include <bitmap.h>
 
-#warning "find where something like __ALIGN_MASK is defined"
-#define __ALIGN_MASK(x, mask)       (((x) + (mask)) & ~(mask))
 /*
  * bitmaps provide an array of bits, implemented using an an
  * array of unsigned longs.  The number of valid bits in a
index 3f9ebbf..872a25f 100644 (file)
@@ -107,6 +107,7 @@ void *kmalloc_align(size_t size, int flags, size_t align)
        /* must fit in the space reserved for the offset amount, which is at most
         * 'align'. */
        assert(align < (1 << (32 - KMALLOC_ALIGN_SHIFT)));
+       assert(IS_PWR2(align));
        addr = kmalloc(size + align, flags);
        if (!addr)
                return 0;