-#define BYTE(_bm, _n) (((unsigned char *)(_bm))[(_n) / CHAR_BIT])
-#define BIT(_n) (0x80 >> ((_n) % 8))
-#define WORD(_bm, _n) ((_bm)[(_n) / BITMAP_WORD_BITS].w)
+static inline bitmap_word bitmap_bswap(bitmap_word w)
+{
+ if (BITMAP_WORD_BITS == 32)
+ return (ENDIAN_CAST bitmap_word)cpu_to_be32(w);
+ else if (BITMAP_WORD_BITS == 64)
+ return (ENDIAN_CAST bitmap_word)cpu_to_be64(w);
+}
+
+#define BITMAP_WORD(_bm, _n) ((_bm)[(_n) / BITMAP_WORD_BITS].w)
+#define BITMAP_WORDBIT(_n) \
+ (bitmap_bswap(1UL << (BITMAP_WORD_BITS - ((_n) % BITMAP_WORD_BITS) - 1)))
+
+#define BITMAP_HEADWORDS(_nbits) \
+ ((_nbits) / BITMAP_WORD_BITS)
+#define BITMAP_HEADBYTES(_nbits) \
+ (BITMAP_HEADWORDS(_nbits) * sizeof(bitmap_word))