Home | History | Annotate | Download | only in linux
      1 #ifndef __LINUX_BITMAP_H
      2 #define __LINUX_BITMAP_H
      3 
      4 #ifndef __ASSEMBLY__
      5 
      6 #include <linux/types.h>
      7 #include <linux/bitops.h>
      8 #include <linux/string.h>
      9 
     10 /*
     11  * bitmaps provide bit arrays that consume one or more unsigned
     12  * longs.  The bitmap interface and available operations are listed
     13  * here, in bitmap.h
     14  *
     15  * Function implementations generic to all architectures are in
     16  * lib/bitmap.c.  Functions implementations that are architecture
     17  * specific are in various include/asm-<arch>/bitops.h headers
     18  * and other arch/<arch> specific files.
     19  *
     20  * See lib/bitmap.c for more details.
     21  */
     22 
     23 /*
     24  * The available bitmap operations and their rough meaning in the
     25  * case that the bitmap is a single unsigned long are thus:
     26  *
     27  * Note that nbits should be always a compile time evaluable constant.
     28  * Otherwise many inlines will generate horrible code.
     29  *
     30  * bitmap_zero(dst, nbits)			*dst = 0UL
     31  * bitmap_fill(dst, nbits)			*dst = ~0UL
     32  * bitmap_copy(dst, src, nbits)			*dst = *src
     33  * bitmap_and(dst, src1, src2, nbits)		*dst = *src1 & *src2
     34  * bitmap_or(dst, src1, src2, nbits)		*dst = *src1 | *src2
     35  * bitmap_xor(dst, src1, src2, nbits)		*dst = *src1 ^ *src2
     36  * bitmap_andnot(dst, src1, src2, nbits)	*dst = *src1 & ~(*src2)
     37  * bitmap_complement(dst, src, nbits)		*dst = ~(*src)
     38  * bitmap_equal(src1, src2, nbits)		Are *src1 and *src2 equal?
     39  * bitmap_intersects(src1, src2, nbits) 	Do *src1 and *src2 overlap?
     40  * bitmap_subset(src1, src2, nbits)		Is *src1 a subset of *src2?
     41  * bitmap_empty(src, nbits)			Are all bits zero in *src?
     42  * bitmap_full(src, nbits)			Are all bits set in *src?
     43  * bitmap_weight(src, nbits)			Hamming Weight: number set bits
     44  * bitmap_shift_right(dst, src, n, nbits)	*dst = *src >> n
     45  * bitmap_shift_left(dst, src, n, nbits)	*dst = *src << n
     46  * bitmap_remap(dst, src, old, new, nbits)	*dst = map(old, new)(src)
     47  * bitmap_bitremap(oldbit, old, new, nbits)	newbit = map(old, new)(oldbit)
     48  * bitmap_scnprintf(buf, len, src, nbits)	Print bitmap src to buf
     49  * bitmap_parse(ubuf, ulen, dst, nbits)		Parse bitmap dst from user buf
     50  * bitmap_scnlistprintf(buf, len, src, nbits)	Print bitmap src as list to buf
     51  * bitmap_parselist(buf, dst, nbits)		Parse bitmap dst from list
     52  * bitmap_find_free_region(bitmap, bits, order)	Find and allocate bit region
     53  * bitmap_release_region(bitmap, pos, order)	Free specified bit region
     54  * bitmap_allocate_region(bitmap, pos, order)	Allocate specified bit region
     55  */
     56 
     57 /*
     58  * Also the following operations in asm/bitops.h apply to bitmaps.
     59  *
     60  * set_bit(bit, addr)			*addr |= bit
     61  * clear_bit(bit, addr)			*addr &= ~bit
     62  * change_bit(bit, addr)		*addr ^= bit
     63  * test_bit(bit, addr)			Is bit set in *addr?
     64  * test_and_set_bit(bit, addr)		Set bit and return old value
     65  * test_and_clear_bit(bit, addr)	Clear bit and return old value
     66  * test_and_change_bit(bit, addr)	Change bit and return old value
     67  * find_first_zero_bit(addr, nbits)	Position first zero bit in *addr
     68  * find_first_bit(addr, nbits)		Position first set bit in *addr
     69  * find_next_zero_bit(addr, nbits, bit)	Position next zero bit in *addr >= bit
     70  * find_next_bit(addr, nbits, bit)	Position next set bit in *addr >= bit
     71  */
     72 
     73 /*
     74  * The DECLARE_BITMAP(name,bits) macro, in linux/types.h, can be used
     75  * to declare an array named 'name' of just enough unsigned longs to
     76  * contain all bit positions from 0 to 'bits' - 1.
     77  */
     78 
     79 /*
     80  * lib/bitmap.c provides these functions:
     81  */
     82 
     83 extern int __bitmap_empty(const unsigned long *bitmap, int bits);
     84 extern int __bitmap_full(const unsigned long *bitmap, int bits);
     85 extern int __bitmap_equal(const unsigned long *bitmap1,
     86                 	const unsigned long *bitmap2, int bits);
     87 extern void __bitmap_complement(unsigned long *dst, const unsigned long *src,
     88 			int bits);
     89 extern void __bitmap_shift_right(unsigned long *dst,
     90                         const unsigned long *src, int shift, int bits);
     91 extern void __bitmap_shift_left(unsigned long *dst,
     92                         const unsigned long *src, int shift, int bits);
     93 extern void __bitmap_and(unsigned long *dst, const unsigned long *bitmap1,
     94 			const unsigned long *bitmap2, int bits);
     95 extern void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1,
     96 			const unsigned long *bitmap2, int bits);
     97 extern void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1,
     98 			const unsigned long *bitmap2, int bits);
     99 extern void __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1,
    100 			const unsigned long *bitmap2, int bits);
    101 extern int __bitmap_intersects(const unsigned long *bitmap1,
    102 			const unsigned long *bitmap2, int bits);
    103 extern int __bitmap_subset(const unsigned long *bitmap1,
    104 			const unsigned long *bitmap2, int bits);
    105 extern int __bitmap_weight(const unsigned long *bitmap, int bits);
    106 
    107 extern int bitmap_scnprintf(char *buf, unsigned int len,
    108 			const unsigned long *src, int nbits);
    109 extern int bitmap_parse(const char __user *ubuf, unsigned int ulen,
    110 			unsigned long *dst, int nbits);
    111 extern int bitmap_scnlistprintf(char *buf, unsigned int len,
    112 			const unsigned long *src, int nbits);
    113 extern int bitmap_parselist(const char *buf, unsigned long *maskp,
    114 			int nmaskbits);
    115 extern void bitmap_remap(unsigned long *dst, const unsigned long *src,
    116 		const unsigned long *old, const unsigned long *new, int bits);
    117 extern int bitmap_bitremap(int oldbit,
    118 		const unsigned long *old, const unsigned long *new, int bits);
    119 extern int bitmap_find_free_region(unsigned long *bitmap, int bits, int order);
    120 extern void bitmap_release_region(unsigned long *bitmap, int pos, int order);
    121 extern int bitmap_allocate_region(unsigned long *bitmap, int pos, int order);
    122 
    123 #define BITMAP_LAST_WORD_MASK(nbits)					\
    124 (									\
    125 	((nbits) % BITS_PER_LONG) ?					\
    126 		(1UL<<((nbits) % BITS_PER_LONG))-1 : ~0UL		\
    127 )
    128 
    129 static inline void bitmap_zero(unsigned long *dst, int nbits)
    130 {
    131 	if (nbits <= BITS_PER_LONG)
    132 		*dst = 0UL;
    133 	else {
    134 		int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long);
    135 		memset(dst, 0, len);
    136 	}
    137 }
    138 
    139 static inline void bitmap_fill(unsigned long *dst, int nbits)
    140 {
    141 	size_t nlongs = BITS_TO_LONGS(nbits);
    142 	if (nlongs > 1) {
    143 		int len = (nlongs - 1) * sizeof(unsigned long);
    144 		memset(dst, 0xff,  len);
    145 	}
    146 	dst[nlongs - 1] = BITMAP_LAST_WORD_MASK(nbits);
    147 }
    148 
    149 static inline void bitmap_copy(unsigned long *dst, const unsigned long *src,
    150 			int nbits)
    151 {
    152 	if (nbits <= BITS_PER_LONG)
    153 		*dst = *src;
    154 	else {
    155 		int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long);
    156 		memcpy(dst, src, len);
    157 	}
    158 }
    159 
    160 static inline void bitmap_and(unsigned long *dst, const unsigned long *src1,
    161 			const unsigned long *src2, int nbits)
    162 {
    163 	if (nbits <= BITS_PER_LONG)
    164 		*dst = *src1 & *src2;
    165 	else
    166 		__bitmap_and(dst, src1, src2, nbits);
    167 }
    168 
    169 static inline void bitmap_or(unsigned long *dst, const unsigned long *src1,
    170 			const unsigned long *src2, int nbits)
    171 {
    172 	if (nbits <= BITS_PER_LONG)
    173 		*dst = *src1 | *src2;
    174 	else
    175 		__bitmap_or(dst, src1, src2, nbits);
    176 }
    177 
    178 static inline void bitmap_xor(unsigned long *dst, const unsigned long *src1,
    179 			const unsigned long *src2, int nbits)
    180 {
    181 	if (nbits <= BITS_PER_LONG)
    182 		*dst = *src1 ^ *src2;
    183 	else
    184 		__bitmap_xor(dst, src1, src2, nbits);
    185 }
    186 
    187 static inline void bitmap_andnot(unsigned long *dst, const unsigned long *src1,
    188 			const unsigned long *src2, int nbits)
    189 {
    190 	if (nbits <= BITS_PER_LONG)
    191 		*dst = *src1 & ~(*src2);
    192 	else
    193 		__bitmap_andnot(dst, src1, src2, nbits);
    194 }
    195 
    196 static inline void bitmap_complement(unsigned long *dst, const unsigned long *src,
    197 			int nbits)
    198 {
    199 	if (nbits <= BITS_PER_LONG)
    200 		*dst = ~(*src) & BITMAP_LAST_WORD_MASK(nbits);
    201 	else
    202 		__bitmap_complement(dst, src, nbits);
    203 }
    204 
    205 static inline int bitmap_equal(const unsigned long *src1,
    206 			const unsigned long *src2, int nbits)
    207 {
    208 	if (nbits <= BITS_PER_LONG)
    209 		return ! ((*src1 ^ *src2) & BITMAP_LAST_WORD_MASK(nbits));
    210 	else
    211 		return __bitmap_equal(src1, src2, nbits);
    212 }
    213 
    214 static inline int bitmap_intersects(const unsigned long *src1,
    215 			const unsigned long *src2, int nbits)
    216 {
    217 	if (nbits <= BITS_PER_LONG)
    218 		return ((*src1 & *src2) & BITMAP_LAST_WORD_MASK(nbits)) != 0;
    219 	else
    220 		return __bitmap_intersects(src1, src2, nbits);
    221 }
    222 
    223 static inline int bitmap_subset(const unsigned long *src1,
    224 			const unsigned long *src2, int nbits)
    225 {
    226 	if (nbits <= BITS_PER_LONG)
    227 		return ! ((*src1 & ~(*src2)) & BITMAP_LAST_WORD_MASK(nbits));
    228 	else
    229 		return __bitmap_subset(src1, src2, nbits);
    230 }
    231 
    232 static inline int bitmap_empty(const unsigned long *src, int nbits)
    233 {
    234 	if (nbits <= BITS_PER_LONG)
    235 		return ! (*src & BITMAP_LAST_WORD_MASK(nbits));
    236 	else
    237 		return __bitmap_empty(src, nbits);
    238 }
    239 
    240 static inline int bitmap_full(const unsigned long *src, int nbits)
    241 {
    242 	if (nbits <= BITS_PER_LONG)
    243 		return ! (~(*src) & BITMAP_LAST_WORD_MASK(nbits));
    244 	else
    245 		return __bitmap_full(src, nbits);
    246 }
    247 
    248 static inline int bitmap_weight(const unsigned long *src, int nbits)
    249 {
    250 	if (nbits <= BITS_PER_LONG)
    251 		return hweight_long(*src & BITMAP_LAST_WORD_MASK(nbits));
    252 	return __bitmap_weight(src, nbits);
    253 }
    254 
    255 static inline void bitmap_shift_right(unsigned long *dst,
    256 			const unsigned long *src, int n, int nbits)
    257 {
    258 	if (nbits <= BITS_PER_LONG)
    259 		*dst = *src >> n;
    260 	else
    261 		__bitmap_shift_right(dst, src, n, nbits);
    262 }
    263 
    264 static inline void bitmap_shift_left(unsigned long *dst,
    265 			const unsigned long *src, int n, int nbits)
    266 {
    267 	if (nbits <= BITS_PER_LONG)
    268 		*dst = (*src << n) & BITMAP_LAST_WORD_MASK(nbits);
    269 	else
    270 		__bitmap_shift_left(dst, src, n, nbits);
    271 }
    272 
    273 #endif /* __ASSEMBLY__ */
    274 
    275 #endif /* __LINUX_BITMAP_H */
    276