blob: f3c8798a5457bb3dd152318e3c21be29688c26b6 [file] [log] [blame]
#pragma once
#include <string.h>
#include <sys/types.h>
#include <atomic.h>
#include <stdio.h>
#define DECL_BITMASK(name, size) \
uint8_t (name)[BYTES_FOR_BITMASK((size))]
#define BYTES_FOR_BITMASK(size) \
(((size) - 1) / 8 + 1)
#define BYTES_FOR_BITMASK_WITH_CHECK(size) \
((size) ? ((size) - (1)) / (8) + (1) : (0))
static bool GET_BITMASK_BIT(uint8_t* name, size_t bit)
{
return (((name)[(bit)/8] & (1 << ((bit) % 8))) ? 1 : 0);
}
#define SET_BITMASK_BIT(name, bit) \
((name)[(bit)/8] |= (1 << ((bit) % 8)));
/*
static void SET_BITMASK_BIT(uint8_t* name, size_t bit)
{
((name)[(bit)/8] |= (1 << ((bit) % 8)));
}
*/
#define CLR_BITMASK_BIT(name, bit) \
((name)[(bit)/8] &= ~(1 << ((bit) % 8)));
/*
static void CLR_BITMASK_BIT(uint8_t* name, size_t bit)
{
((name)[(bit)/8] &= ~(1 << ((bit) % 8)));
}
*/
static void SET_BITMASK_BIT_ATOMIC(uint8_t* name, size_t bit)
{
(atomic_orb(&(name)[(bit)/8], (1 << ((bit) % 8))));
}
#define CLR_BITMASK_BIT_ATOMIC(name, bit) \
(atomic_andb(&(name)[(bit)/8], ~(1 << ((bit) % 8))))
#define CLR_BITMASK(name, size) \
({ \
memset((void*)((uintptr_t)(name)), 0, BYTES_FOR_BITMASK((size))); \
})
#define FILL_BITMASK(name, size) \
({ \
memset((void*)((uintptr_t)(name)), 255, BYTES_FOR_BITMASK((size))); \
(name)[BYTES_FOR_BITMASK((size))-1] >>= (((size) % 8) ? (8 - ((size) % 8)) : 0 ); \
})
#define COPY_BITMASK(newmask, oldmask, size) \
({ \
memcpy((void*)((uintptr_t)(newmask)), \
(void*)((uintptr_t)(oldmask)), \
BYTES_FOR_BITMASK((size))); \
})
// this checks the entire last byte, so keep it 0 in the other macros
#define BITMASK_IS_CLEAR(name, size) ({ \
uint32_t __n = BYTES_FOR_BITMASK((size)); \
bool clear = 1; \
while (__n-- > 0) { \
if ((name)[__n]) { \
clear = 0; \
break;\
}\
} \
clear; })
static inline bool BITMASK_IS_FULL(volatile uint8_t *map, size_t size)
{
int _size = size;
for (int i = 0; i < BYTES_FOR_BITMASK(size); i++) {
for (int j = 0; j < MIN(8, _size); j++) {
if(!((map[i] >> j) &1))
return FALSE;
_size--;
}
}
return TRUE;
}
#define PRINT_BITMASK(name, size) { \
int i; \
int _size = size; \
print_lock(); \
for (i = 0; i < BYTES_FOR_BITMASK(size); i++) { \
int j; \
for (j = 0; j < MIN(8, _size); j++) { \
printk("%x", ((name)[i] >> j) & 1); \
_size--; \
} \
} \
printk("\n"); \
print_unlock(); \
}