File: /Users/paulross/dev/linux/linux-3.13/include/linux/bitmap.h

Green shading in the line number column means the source is part of the translation unit, red means it is conditionally excluded. Highlighted line numbers link to the translation unit page. Highlighted macros link to the macro page.

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