00001
00038 #ifndef BITOPS_H_INCLUDED
00039 #define BITOPS_H_INCLUDED
00040
00041 #include <assert.h>
00042 #include <compiler.h>
00043 #include <stdbool.h>
00044 #include <types.h>
00045 #include <util.h>
00046
00079 #define bit_mask(ws, nr) (1 << ((nr) & ((ws) - 1)))
00080
00090 #define bit_word(ws, nr) ((nr) / (ws))
00091
00098 #define set_bit(nr, bitmap) \
00099 do { \
00100 unsigned int priv_bit_ws = 8 * sizeof(*(bitmap)); \
00101 unsigned int priv_bit_nr = (nr); \
00102 (bitmap)[bit_word(priv_bit_ws, priv_bit_nr)] \
00103 |= bit_mask(priv_bit_ws, priv_bit_nr); \
00104 } while (0)
00105
00112 #define clear_bit(nr, bitmap) \
00113 do { \
00114 unsigned int priv_bit_ws = 8 * sizeof(*(bitmap)); \
00115 unsigned int priv_bit_nr = (nr); \
00116 (bitmap)[bit_word(priv_bit_ws, priv_bit_nr)] \
00117 &= ~bit_mask(priv_bit_ws, priv_bit_nr); \
00118 } while (0)
00119
00126 #define toggle_bit(nr, bitmap) \
00127 do { \
00128 unsigned int priv_bit_ws = 8 * sizeof(*(bitmap)); \
00129 unsigned int priv_bit_nr = (nr); \
00130 (bitmap)[bit_word(priv_bit_ws, priv_bit_nr)] \
00131 ^= bit_mask(priv_bit_ws, priv_bit_nr); \
00132 } while (0)
00133
00134 ERROR_FUNC(priv_test_bit_bad_type, "Invalid type passed to test_bit()");
00135
00136 __always_inline static bool priv_test_bit_ws(unsigned int nr, const void *bp,
00137 unsigned int ws)
00138 {
00139 union {
00140 const uint8_t *b;
00141 const uint16_t *s;
00142 const uint32_t *l;
00143 } p = { bp };
00144
00145 switch (ws) {
00146 case 8:
00147 return 1U & (p.b[bit_word(8, nr)] >> (nr & (8 - 1)));
00148 case 16:
00149 return 1U & (p.s[bit_word(16, nr)] >> (nr & (16 - 1)));
00150 case 32:
00151 return 1U & (p.l[bit_word(32, nr)] >> (nr & (32 - 1)));
00152 default:
00153 priv_test_bit_bad_type();
00154 return false;
00155 }
00156 }
00157
00167 #define test_bit(nr, bitmap) \
00168 priv_test_bit_ws(nr, bitmap, 8 * sizeof(*(bitmap)))
00169
00170 #include <arch/bitops.h>
00171
00175 #define bit_word_reverse(word) compiler_brev(word)
00176
00180 #define bit_word_find_first_one_bit(word) compiler_ctz(word)
00181
00185 #define bit_word_find_last_one_bit(word) (31 - compiler_clz(word))
00186
00190 #define bit_word_find_first_zero_bit(word) \
00191 bit_word_find_first_one_bit(~word)
00192
00196 #define bit_word_find_last_zero_bit(word) \
00197 bit_word_find_last_one_bit(~word)
00198
00214 static inline unsigned int bit_array_find_first_one_bit(
00215 const bit_word_t *bitmap, unsigned int len)
00216 {
00217 unsigned int i;
00218 unsigned int nr_words;
00219
00220 nr_words = div_ceil(len, 8 * sizeof(*bitmap));
00221
00222 for (i = 0; i < nr_words; i++) {
00223 if (bitmap[i])
00224 return bit_word_find_first_one_bit(bitmap[i]);
00225 }
00226
00227 return len;
00228 }
00229
00231
00232 #endif