LCOV - code coverage report
Current view: top level - include/linux - bitmap.h (source / functions) Hit Total Coverage
Test: landlock.info Lines: 63 91 69.2 %
Date: 2021-04-22 12:43:58 Functions: 7 13 53.8 %

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0 */
       2             : #ifndef __LINUX_BITMAP_H
       3             : #define __LINUX_BITMAP_H
       4             : 
       5             : #ifndef __ASSEMBLY__
       6             : 
       7             : #include <linux/types.h>
       8             : #include <linux/bitops.h>
       9             : #include <linux/string.h>
      10             : #include <linux/kernel.h>
      11             : 
      12             : /*
      13             :  * bitmaps provide bit arrays that consume one or more unsigned
      14             :  * longs.  The bitmap interface and available operations are listed
      15             :  * here, in bitmap.h
      16             :  *
      17             :  * Function implementations generic to all architectures are in
      18             :  * lib/bitmap.c.  Functions implementations that are architecture
      19             :  * specific are in various include/asm-<arch>/bitops.h headers
      20             :  * and other arch/<arch> specific files.
      21             :  *
      22             :  * See lib/bitmap.c for more details.
      23             :  */
      24             : 
      25             : /**
      26             :  * DOC: bitmap overview
      27             :  *
      28             :  * The available bitmap operations and their rough meaning in the
      29             :  * case that the bitmap is a single unsigned long are thus:
      30             :  *
      31             :  * The generated code is more efficient when nbits is known at
      32             :  * compile-time and at most BITS_PER_LONG.
      33             :  *
      34             :  * ::
      35             :  *
      36             :  *  bitmap_zero(dst, nbits)                     *dst = 0UL
      37             :  *  bitmap_fill(dst, nbits)                     *dst = ~0UL
      38             :  *  bitmap_copy(dst, src, nbits)                *dst = *src
      39             :  *  bitmap_and(dst, src1, src2, nbits)          *dst = *src1 & *src2
      40             :  *  bitmap_or(dst, src1, src2, nbits)           *dst = *src1 | *src2
      41             :  *  bitmap_xor(dst, src1, src2, nbits)          *dst = *src1 ^ *src2
      42             :  *  bitmap_andnot(dst, src1, src2, nbits)       *dst = *src1 & ~(*src2)
      43             :  *  bitmap_complement(dst, src, nbits)          *dst = ~(*src)
      44             :  *  bitmap_equal(src1, src2, nbits)             Are *src1 and *src2 equal?
      45             :  *  bitmap_intersects(src1, src2, nbits)        Do *src1 and *src2 overlap?
      46             :  *  bitmap_subset(src1, src2, nbits)            Is *src1 a subset of *src2?
      47             :  *  bitmap_empty(src, nbits)                    Are all bits zero in *src?
      48             :  *  bitmap_full(src, nbits)                     Are all bits set in *src?
      49             :  *  bitmap_weight(src, nbits)                   Hamming Weight: number set bits
      50             :  *  bitmap_set(dst, pos, nbits)                 Set specified bit area
      51             :  *  bitmap_clear(dst, pos, nbits)               Clear specified bit area
      52             :  *  bitmap_find_next_zero_area(buf, len, pos, n, mask)  Find bit free area
      53             :  *  bitmap_find_next_zero_area_off(buf, len, pos, n, mask, mask_off)  as above
      54             :  *  bitmap_next_clear_region(map, &start, &end, nbits)  Find next clear region
      55             :  *  bitmap_next_set_region(map, &start, &end, nbits)  Find next set region
      56             :  *  bitmap_for_each_clear_region(map, rs, re, start, end)
      57             :  *                                              Iterate over all clear regions
      58             :  *  bitmap_for_each_set_region(map, rs, re, start, end)
      59             :  *                                              Iterate over all set regions
      60             :  *  bitmap_shift_right(dst, src, n, nbits)      *dst = *src >> n
      61             :  *  bitmap_shift_left(dst, src, n, nbits)       *dst = *src << n
      62             :  *  bitmap_cut(dst, src, first, n, nbits)       Cut n bits from first, copy rest
      63             :  *  bitmap_replace(dst, old, new, mask, nbits)  *dst = (*old & ~(*mask)) | (*new & *mask)
      64             :  *  bitmap_remap(dst, src, old, new, nbits)     *dst = map(old, new)(src)
      65             :  *  bitmap_bitremap(oldbit, old, new, nbits)    newbit = map(old, new)(oldbit)
      66             :  *  bitmap_onto(dst, orig, relmap, nbits)       *dst = orig relative to relmap
      67             :  *  bitmap_fold(dst, orig, sz, nbits)           dst bits = orig bits mod sz
      68             :  *  bitmap_parse(buf, buflen, dst, nbits)       Parse bitmap dst from kernel buf
      69             :  *  bitmap_parse_user(ubuf, ulen, dst, nbits)   Parse bitmap dst from user buf
      70             :  *  bitmap_parselist(buf, dst, nbits)           Parse bitmap dst from kernel buf
      71             :  *  bitmap_parselist_user(buf, dst, nbits)      Parse bitmap dst from user buf
      72             :  *  bitmap_find_free_region(bitmap, bits, order)  Find and allocate bit region
      73             :  *  bitmap_release_region(bitmap, pos, order)   Free specified bit region
      74             :  *  bitmap_allocate_region(bitmap, pos, order)  Allocate specified bit region
      75             :  *  bitmap_from_arr32(dst, buf, nbits)          Copy nbits from u32[] buf to dst
      76             :  *  bitmap_to_arr32(buf, src, nbits)            Copy nbits from buf to u32[] dst
      77             :  *  bitmap_get_value8(map, start)               Get 8bit value from map at start
      78             :  *  bitmap_set_value8(map, value, start)        Set 8bit value to map at start
      79             :  *
      80             :  * Note, bitmap_zero() and bitmap_fill() operate over the region of
      81             :  * unsigned longs, that is, bits behind bitmap till the unsigned long
      82             :  * boundary will be zeroed or filled as well. Consider to use
      83             :  * bitmap_clear() or bitmap_set() to make explicit zeroing or filling
      84             :  * respectively.
      85             :  */
      86             : 
      87             : /**
      88             :  * DOC: bitmap bitops
      89             :  *
      90             :  * Also the following operations in asm/bitops.h apply to bitmaps.::
      91             :  *
      92             :  *  set_bit(bit, addr)                  *addr |= bit
      93             :  *  clear_bit(bit, addr)                *addr &= ~bit
      94             :  *  change_bit(bit, addr)               *addr ^= bit
      95             :  *  test_bit(bit, addr)                 Is bit set in *addr?
      96             :  *  test_and_set_bit(bit, addr)         Set bit and return old value
      97             :  *  test_and_clear_bit(bit, addr)       Clear bit and return old value
      98             :  *  test_and_change_bit(bit, addr)      Change bit and return old value
      99             :  *  find_first_zero_bit(addr, nbits)    Position first zero bit in *addr
     100             :  *  find_first_bit(addr, nbits)         Position first set bit in *addr
     101             :  *  find_next_zero_bit(addr, nbits, bit)
     102             :  *                                      Position next zero bit in *addr >= bit
     103             :  *  find_next_bit(addr, nbits, bit)     Position next set bit in *addr >= bit
     104             :  *  find_next_and_bit(addr1, addr2, nbits, bit)
     105             :  *                                      Same as find_next_bit, but in
     106             :  *                                      (*addr1 & *addr2)
     107             :  *
     108             :  */
     109             : 
     110             : /**
     111             :  * DOC: declare bitmap
     112             :  * The DECLARE_BITMAP(name,bits) macro, in linux/types.h, can be used
     113             :  * to declare an array named 'name' of just enough unsigned longs to
     114             :  * contain all bit positions from 0 to 'bits' - 1.
     115             :  */
     116             : 
     117             : /*
     118             :  * Allocation and deallocation of bitmap.
     119             :  * Provided in lib/bitmap.c to avoid circular dependency.
     120             :  */
     121             : extern unsigned long *bitmap_alloc(unsigned int nbits, gfp_t flags);
     122             : extern unsigned long *bitmap_zalloc(unsigned int nbits, gfp_t flags);
     123             : extern void bitmap_free(const unsigned long *bitmap);
     124             : 
     125             : /*
     126             :  * lib/bitmap.c provides these functions:
     127             :  */
     128             : 
     129             : extern int __bitmap_equal(const unsigned long *bitmap1,
     130             :                           const unsigned long *bitmap2, unsigned int nbits);
     131             : extern bool __pure __bitmap_or_equal(const unsigned long *src1,
     132             :                                      const unsigned long *src2,
     133             :                                      const unsigned long *src3,
     134             :                                      unsigned int nbits);
     135             : extern void __bitmap_complement(unsigned long *dst, const unsigned long *src,
     136             :                         unsigned int nbits);
     137             : extern void __bitmap_shift_right(unsigned long *dst, const unsigned long *src,
     138             :                                 unsigned int shift, unsigned int nbits);
     139             : extern void __bitmap_shift_left(unsigned long *dst, const unsigned long *src,
     140             :                                 unsigned int shift, unsigned int nbits);
     141             : extern void bitmap_cut(unsigned long *dst, const unsigned long *src,
     142             :                        unsigned int first, unsigned int cut,
     143             :                        unsigned int nbits);
     144             : extern int __bitmap_and(unsigned long *dst, const unsigned long *bitmap1,
     145             :                         const unsigned long *bitmap2, unsigned int nbits);
     146             : extern void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1,
     147             :                         const unsigned long *bitmap2, unsigned int nbits);
     148             : extern void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1,
     149             :                         const unsigned long *bitmap2, unsigned int nbits);
     150             : extern int __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1,
     151             :                         const unsigned long *bitmap2, unsigned int nbits);
     152             : extern void __bitmap_replace(unsigned long *dst,
     153             :                         const unsigned long *old, const unsigned long *new,
     154             :                         const unsigned long *mask, unsigned int nbits);
     155             : extern int __bitmap_intersects(const unsigned long *bitmap1,
     156             :                         const unsigned long *bitmap2, unsigned int nbits);
     157             : extern int __bitmap_subset(const unsigned long *bitmap1,
     158             :                         const unsigned long *bitmap2, unsigned int nbits);
     159             : extern int __bitmap_weight(const unsigned long *bitmap, unsigned int nbits);
     160             : extern void __bitmap_set(unsigned long *map, unsigned int start, int len);
     161             : extern void __bitmap_clear(unsigned long *map, unsigned int start, int len);
     162             : 
     163             : extern unsigned long bitmap_find_next_zero_area_off(unsigned long *map,
     164             :                                                     unsigned long size,
     165             :                                                     unsigned long start,
     166             :                                                     unsigned int nr,
     167             :                                                     unsigned long align_mask,
     168             :                                                     unsigned long align_offset);
     169             : 
     170             : /**
     171             :  * bitmap_find_next_zero_area - find a contiguous aligned zero area
     172             :  * @map: The address to base the search on
     173             :  * @size: The bitmap size in bits
     174             :  * @start: The bitnumber to start searching at
     175             :  * @nr: The number of zeroed bits we're looking for
     176             :  * @align_mask: Alignment mask for zero area
     177             :  *
     178             :  * The @align_mask should be one less than a power of 2; the effect is that
     179             :  * the bit offset of all zero areas this function finds is multiples of that
     180             :  * power of 2. A @align_mask of 0 means no alignment is required.
     181             :  */
     182             : static inline unsigned long
     183           3 : bitmap_find_next_zero_area(unsigned long *map,
     184             :                            unsigned long size,
     185             :                            unsigned long start,
     186             :                            unsigned int nr,
     187             :                            unsigned long align_mask)
     188             : {
     189           3 :         return bitmap_find_next_zero_area_off(map, size, start, nr,
     190             :                                               align_mask, 0);
     191             : }
     192             : 
     193             : extern int bitmap_parse(const char *buf, unsigned int buflen,
     194             :                         unsigned long *dst, int nbits);
     195             : extern int bitmap_parse_user(const char __user *ubuf, unsigned int ulen,
     196             :                         unsigned long *dst, int nbits);
     197             : extern int bitmap_parselist(const char *buf, unsigned long *maskp,
     198             :                         int nmaskbits);
     199             : extern int bitmap_parselist_user(const char __user *ubuf, unsigned int ulen,
     200             :                         unsigned long *dst, int nbits);
     201             : extern void bitmap_remap(unsigned long *dst, const unsigned long *src,
     202             :                 const unsigned long *old, const unsigned long *new, unsigned int nbits);
     203             : extern int bitmap_bitremap(int oldbit,
     204             :                 const unsigned long *old, const unsigned long *new, int bits);
     205             : extern void bitmap_onto(unsigned long *dst, const unsigned long *orig,
     206             :                 const unsigned long *relmap, unsigned int bits);
     207             : extern void bitmap_fold(unsigned long *dst, const unsigned long *orig,
     208             :                 unsigned int sz, unsigned int nbits);
     209             : extern int bitmap_find_free_region(unsigned long *bitmap, unsigned int bits, int order);
     210             : extern void bitmap_release_region(unsigned long *bitmap, unsigned int pos, int order);
     211             : extern int bitmap_allocate_region(unsigned long *bitmap, unsigned int pos, int order);
     212             : 
     213             : #ifdef __BIG_ENDIAN
     214             : extern void bitmap_copy_le(unsigned long *dst, const unsigned long *src, unsigned int nbits);
     215             : #else
     216             : #define bitmap_copy_le bitmap_copy
     217             : #endif
     218             : extern unsigned int bitmap_ord_to_pos(const unsigned long *bitmap, unsigned int ord, unsigned int nbits);
     219             : extern int bitmap_print_to_pagebuf(bool list, char *buf,
     220             :                                    const unsigned long *maskp, int nmaskbits);
     221             : 
     222             : #define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) & (BITS_PER_LONG - 1)))
     223             : #define BITMAP_LAST_WORD_MASK(nbits) (~0UL >> (-(nbits) & (BITS_PER_LONG - 1)))
     224             : 
     225             : /*
     226             :  * The static inlines below do not handle constant nbits==0 correctly,
     227             :  * so make such users (should any ever turn up) call the out-of-line
     228             :  * versions.
     229             :  */
     230             : #define small_const_nbits(nbits) \
     231             :         (__builtin_constant_p(nbits) && (nbits) <= BITS_PER_LONG && (nbits) > 0)
     232             : 
     233        3022 : static inline void bitmap_zero(unsigned long *dst, unsigned int nbits)
     234             : {
     235        3022 :         unsigned int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long);
     236        2738 :         memset(dst, 0, len);
     237           4 : }
     238             : 
     239        1129 : static inline void bitmap_fill(unsigned long *dst, unsigned int nbits)
     240             : {
     241        1129 :         unsigned int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long);
     242        1129 :         memset(dst, 0xff, len);
     243           1 : }
     244             : 
     245        3439 : static inline void bitmap_copy(unsigned long *dst, const unsigned long *src,
     246             :                         unsigned int nbits)
     247             : {
     248        3439 :         unsigned int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long);
     249        3418 :         memcpy(dst, src, len);
     250           0 : }
     251             : 
     252             : /*
     253             :  * Copy bitmap and clear tail bits in last word.
     254             :  */
     255             : static inline void bitmap_copy_clear_tail(unsigned long *dst,
     256             :                 const unsigned long *src, unsigned int nbits)
     257             : {
     258             :         bitmap_copy(dst, src, nbits);
     259             :         if (nbits % BITS_PER_LONG)
     260             :                 dst[nbits / BITS_PER_LONG] &= BITMAP_LAST_WORD_MASK(nbits);
     261             : }
     262             : 
     263             : /*
     264             :  * On 32-bit systems bitmaps are represented as u32 arrays internally, and
     265             :  * therefore conversion is not needed when copying data from/to arrays of u32.
     266             :  */
     267             : #if BITS_PER_LONG == 64
     268             : extern void bitmap_from_arr32(unsigned long *bitmap, const u32 *buf,
     269             :                                                         unsigned int nbits);
     270             : extern void bitmap_to_arr32(u32 *buf, const unsigned long *bitmap,
     271             :                                                         unsigned int nbits);
     272             : #else
     273             : #define bitmap_from_arr32(bitmap, buf, nbits)                   \
     274             :         bitmap_copy_clear_tail((unsigned long *) (bitmap),      \
     275             :                         (const unsigned long *) (buf), (nbits))
     276             : #define bitmap_to_arr32(buf, bitmap, nbits)                     \
     277             :         bitmap_copy_clear_tail((unsigned long *) (buf),         \
     278             :                         (const unsigned long *) (bitmap), (nbits))
     279             : #endif
     280             : 
     281        9360 : static inline int bitmap_and(unsigned long *dst, const unsigned long *src1,
     282             :                         const unsigned long *src2, unsigned int nbits)
     283             : {
     284        9360 :         if (small_const_nbits(nbits))
     285        9360 :                 return (*dst = *src1 & *src2 & BITMAP_LAST_WORD_MASK(nbits)) != 0;
     286           0 :         return __bitmap_and(dst, src1, src2, nbits);
     287             : }
     288             : 
     289          31 : static inline void bitmap_or(unsigned long *dst, const unsigned long *src1,
     290             :                         const unsigned long *src2, unsigned int nbits)
     291             : {
     292          31 :         if (small_const_nbits(nbits))
     293          25 :                 *dst = *src1 | *src2;
     294             :         else
     295           6 :                 __bitmap_or(dst, src1, src2, nbits);
     296           6 : }
     297             : 
     298             : static inline void bitmap_xor(unsigned long *dst, const unsigned long *src1,
     299             :                         const unsigned long *src2, unsigned int nbits)
     300             : {
     301             :         if (small_const_nbits(nbits))
     302             :                 *dst = *src1 ^ *src2;
     303             :         else
     304             :                 __bitmap_xor(dst, src1, src2, nbits);
     305             : }
     306             : 
     307           1 : static inline int bitmap_andnot(unsigned long *dst, const unsigned long *src1,
     308             :                         const unsigned long *src2, unsigned int nbits)
     309             : {
     310           1 :         if (small_const_nbits(nbits))
     311           0 :                 return (*dst = *src1 & ~(*src2) & BITMAP_LAST_WORD_MASK(nbits)) != 0;
     312           1 :         return __bitmap_andnot(dst, src1, src2, nbits);
     313             : }
     314             : 
     315           0 : static inline void bitmap_complement(unsigned long *dst, const unsigned long *src,
     316             :                         unsigned int nbits)
     317             : {
     318           0 :         if (small_const_nbits(nbits))
     319             :                 *dst = ~(*src);
     320             :         else
     321           0 :                 __bitmap_complement(dst, src, nbits);
     322             : }
     323             : 
     324             : #ifdef __LITTLE_ENDIAN
     325             : #define BITMAP_MEM_ALIGNMENT 8
     326             : #else
     327             : #define BITMAP_MEM_ALIGNMENT (8 * sizeof(unsigned long))
     328             : #endif
     329             : #define BITMAP_MEM_MASK (BITMAP_MEM_ALIGNMENT - 1)
     330             : 
     331         129 : static inline int bitmap_equal(const unsigned long *src1,
     332             :                         const unsigned long *src2, unsigned int nbits)
     333             : {
     334         129 :         if (small_const_nbits(nbits))
     335         129 :                 return !((*src1 ^ *src2) & BITMAP_LAST_WORD_MASK(nbits));
     336           0 :         if (__builtin_constant_p(nbits & BITMAP_MEM_MASK) &&
     337             :             IS_ALIGNED(nbits, BITMAP_MEM_ALIGNMENT))
     338           0 :                 return !memcmp(src1, src2, nbits / 8);
     339           0 :         return __bitmap_equal(src1, src2, nbits);
     340             : }
     341             : 
     342             : /**
     343             :  * bitmap_or_equal - Check whether the or of two bitmaps is equal to a third
     344             :  * @src1:       Pointer to bitmap 1
     345             :  * @src2:       Pointer to bitmap 2 will be or'ed with bitmap 1
     346             :  * @src3:       Pointer to bitmap 3. Compare to the result of *@src1 | *@src2
     347             :  * @nbits:      number of bits in each of these bitmaps
     348             :  *
     349             :  * Returns: True if (*@src1 | *@src2) == *@src3, false otherwise
     350             :  */
     351          62 : static inline bool bitmap_or_equal(const unsigned long *src1,
     352             :                                    const unsigned long *src2,
     353             :                                    const unsigned long *src3,
     354             :                                    unsigned int nbits)
     355             : {
     356          62 :         if (!small_const_nbits(nbits))
     357           0 :                 return __bitmap_or_equal(src1, src2, src3, nbits);
     358             : 
     359          62 :         return !(((*src1 | *src2) ^ *src3) & BITMAP_LAST_WORD_MASK(nbits));
     360             : }
     361             : 
     362        7947 : static inline int bitmap_intersects(const unsigned long *src1,
     363             :                         const unsigned long *src2, unsigned int nbits)
     364             : {
     365        7947 :         if (small_const_nbits(nbits))
     366        7947 :                 return ((*src1 & *src2) & BITMAP_LAST_WORD_MASK(nbits)) != 0;
     367             :         else
     368           0 :                 return __bitmap_intersects(src1, src2, nbits);
     369             : }
     370             : 
     371         512 : static inline int bitmap_subset(const unsigned long *src1,
     372             :                         const unsigned long *src2, unsigned int nbits)
     373             : {
     374         512 :         if (small_const_nbits(nbits))
     375         512 :                 return ! ((*src1 & ~(*src2)) & BITMAP_LAST_WORD_MASK(nbits));
     376             :         else
     377           0 :                 return __bitmap_subset(src1, src2, nbits);
     378             : }
     379             : 
     380       21252 : static inline bool bitmap_empty(const unsigned long *src, unsigned nbits)
     381             : {
     382       21252 :         if (small_const_nbits(nbits))
     383       19969 :                 return ! (*src & BITMAP_LAST_WORD_MASK(nbits));
     384             : 
     385        1283 :         return find_first_bit(src, nbits) == nbits;
     386             : }
     387             : 
     388        1477 : static inline bool bitmap_full(const unsigned long *src, unsigned int nbits)
     389             : {
     390        1477 :         if (small_const_nbits(nbits))
     391           0 :                 return ! (~(*src) & BITMAP_LAST_WORD_MASK(nbits));
     392             : 
     393        1477 :         return find_first_zero_bit(src, nbits) == nbits;
     394             : }
     395             : 
     396         387 : static __always_inline int bitmap_weight(const unsigned long *src, unsigned int nbits)
     397             : {
     398         340 :         if (small_const_nbits(nbits))
     399         394 :                 return hweight_long(*src & BITMAP_LAST_WORD_MASK(nbits));
     400           1 :         return __bitmap_weight(src, nbits);
     401             : }
     402             : 
     403        2178 : static __always_inline void bitmap_set(unsigned long *map, unsigned int start,
     404             :                 unsigned int nbits)
     405             : {
     406        2178 :         if (__builtin_constant_p(nbits) && nbits == 1)
     407           4 :                 __set_bit(start, map);
     408        2173 :         else if (__builtin_constant_p(start & BITMAP_MEM_MASK) &&
     409           1 :                  IS_ALIGNED(start, BITMAP_MEM_ALIGNMENT) &&
     410           1 :                  __builtin_constant_p(nbits & BITMAP_MEM_MASK) &&
     411             :                  IS_ALIGNED(nbits, BITMAP_MEM_ALIGNMENT))
     412           0 :                 memset((char *)map + start / 8, 0xff, nbits / 8);
     413             :         else
     414        2174 :                 __bitmap_set(map, start, nbits);
     415             : }
     416             : 
     417        3731 : static __always_inline void bitmap_clear(unsigned long *map, unsigned int start,
     418             :                 unsigned int nbits)
     419             : {
     420        3731 :         if (__builtin_constant_p(nbits) && nbits == 1)
     421           0 :                 __clear_bit(start, map);
     422        3731 :         else if (__builtin_constant_p(start & BITMAP_MEM_MASK) &&
     423           0 :                  IS_ALIGNED(start, BITMAP_MEM_ALIGNMENT) &&
     424           0 :                  __builtin_constant_p(nbits & BITMAP_MEM_MASK) &&
     425             :                  IS_ALIGNED(nbits, BITMAP_MEM_ALIGNMENT))
     426           1 :                 memset((char *)map + start / 8, 0, nbits / 8);
     427             :         else
     428        3730 :                 __bitmap_clear(map, start, nbits);
     429             : }
     430             : 
     431             : static inline void bitmap_shift_right(unsigned long *dst, const unsigned long *src,
     432             :                                 unsigned int shift, unsigned int nbits)
     433             : {
     434             :         if (small_const_nbits(nbits))
     435             :                 *dst = (*src & BITMAP_LAST_WORD_MASK(nbits)) >> shift;
     436             :         else
     437             :                 __bitmap_shift_right(dst, src, shift, nbits);
     438             : }
     439             : 
     440             : static inline void bitmap_shift_left(unsigned long *dst, const unsigned long *src,
     441             :                                 unsigned int shift, unsigned int nbits)
     442             : {
     443             :         if (small_const_nbits(nbits))
     444             :                 *dst = (*src << shift) & BITMAP_LAST_WORD_MASK(nbits);
     445             :         else
     446             :                 __bitmap_shift_left(dst, src, shift, nbits);
     447             : }
     448             : 
     449             : static inline void bitmap_replace(unsigned long *dst,
     450             :                                   const unsigned long *old,
     451             :                                   const unsigned long *new,
     452             :                                   const unsigned long *mask,
     453             :                                   unsigned int nbits)
     454             : {
     455             :         if (small_const_nbits(nbits))
     456             :                 *dst = (*old & ~(*mask)) | (*new & *mask);
     457             :         else
     458             :                 __bitmap_replace(dst, old, new, mask, nbits);
     459             : }
     460             : 
     461        4204 : static inline void bitmap_next_clear_region(unsigned long *bitmap,
     462             :                                             unsigned int *rs, unsigned int *re,
     463             :                                             unsigned int end)
     464             : {
     465        4204 :         *rs = find_next_zero_bit(bitmap, end, *rs);
     466        4204 :         *re = find_next_bit(bitmap, end, *rs + 1);
     467        4204 : }
     468             : 
     469           0 : static inline void bitmap_next_set_region(unsigned long *bitmap,
     470             :                                           unsigned int *rs, unsigned int *re,
     471             :                                           unsigned int end)
     472             : {
     473           0 :         *rs = find_next_bit(bitmap, end, *rs);
     474           0 :         *re = find_next_zero_bit(bitmap, end, *rs + 1);
     475           0 : }
     476             : 
     477             : /*
     478             :  * Bitmap region iterators.  Iterates over the bitmap between [@start, @end).
     479             :  * @rs and @re should be integer variables and will be set to start and end
     480             :  * index of the current clear or set region.
     481             :  */
     482             : #define bitmap_for_each_clear_region(bitmap, rs, re, start, end)             \
     483             :         for ((rs) = (start),                                                 \
     484             :              bitmap_next_clear_region((bitmap), &(rs), &(re), (end));        \
     485             :              (rs) < (re);                                                 \
     486             :              (rs) = (re) + 1,                                                \
     487             :              bitmap_next_clear_region((bitmap), &(rs), &(re), (end)))
     488             : 
     489             : #define bitmap_for_each_set_region(bitmap, rs, re, start, end)               \
     490             :         for ((rs) = (start),                                                 \
     491             :              bitmap_next_set_region((bitmap), &(rs), &(re), (end));          \
     492             :              (rs) < (re);                                                 \
     493             :              (rs) = (re) + 1,                                                \
     494             :              bitmap_next_set_region((bitmap), &(rs), &(re), (end)))
     495             : 
     496             : /**
     497             :  * BITMAP_FROM_U64() - Represent u64 value in the format suitable for bitmap.
     498             :  * @n: u64 value
     499             :  *
     500             :  * Linux bitmaps are internally arrays of unsigned longs, i.e. 32-bit
     501             :  * integers in 32-bit environment, and 64-bit integers in 64-bit one.
     502             :  *
     503             :  * There are four combinations of endianness and length of the word in linux
     504             :  * ABIs: LE64, BE64, LE32 and BE32.
     505             :  *
     506             :  * On 64-bit kernels 64-bit LE and BE numbers are naturally ordered in
     507             :  * bitmaps and therefore don't require any special handling.
     508             :  *
     509             :  * On 32-bit kernels 32-bit LE ABI orders lo word of 64-bit number in memory
     510             :  * prior to hi, and 32-bit BE orders hi word prior to lo. The bitmap on the
     511             :  * other hand is represented as an array of 32-bit words and the position of
     512             :  * bit N may therefore be calculated as: word #(N/32) and bit #(N%32) in that
     513             :  * word.  For example, bit #42 is located at 10th position of 2nd word.
     514             :  * It matches 32-bit LE ABI, and we can simply let the compiler store 64-bit
     515             :  * values in memory as it usually does. But for BE we need to swap hi and lo
     516             :  * words manually.
     517             :  *
     518             :  * With all that, the macro BITMAP_FROM_U64() does explicit reordering of hi and
     519             :  * lo parts of u64.  For LE32 it does nothing, and for BE environment it swaps
     520             :  * hi and lo words, as is expected by bitmap.
     521             :  */
     522             : #if __BITS_PER_LONG == 64
     523             : #define BITMAP_FROM_U64(n) (n)
     524             : #else
     525             : #define BITMAP_FROM_U64(n) ((unsigned long) ((u64)(n) & ULONG_MAX)), \
     526             :                                 ((unsigned long) ((u64)(n) >> 32))
     527             : #endif
     528             : 
     529             : /**
     530             :  * bitmap_from_u64 - Check and swap words within u64.
     531             :  *  @mask: source bitmap
     532             :  *  @dst:  destination bitmap
     533             :  *
     534             :  * In 32-bit Big Endian kernel, when using ``(u32 *)(&val)[*]``
     535             :  * to read u64 mask, we will get the wrong word.
     536             :  * That is ``(u32 *)(&val)[0]`` gets the upper 32 bits,
     537             :  * but we expect the lower 32-bits of u64.
     538             :  */
     539           0 : static inline void bitmap_from_u64(unsigned long *dst, u64 mask)
     540             : {
     541           0 :         dst[0] = mask & ULONG_MAX;
     542             : 
     543           0 :         if (sizeof(mask) > sizeof(unsigned long))
     544             :                 dst[1] = mask >> 32;
     545             : }
     546             : 
     547             : /**
     548             :  * bitmap_get_value8 - get an 8-bit value within a memory region
     549             :  * @map: address to the bitmap memory region
     550             :  * @start: bit offset of the 8-bit value; must be a multiple of 8
     551             :  *
     552             :  * Returns the 8-bit value located at the @start bit offset within the @src
     553             :  * memory region.
     554             :  */
     555           0 : static inline unsigned long bitmap_get_value8(const unsigned long *map,
     556             :                                               unsigned long start)
     557             : {
     558           0 :         const size_t index = BIT_WORD(start);
     559           0 :         const unsigned long offset = start % BITS_PER_LONG;
     560             : 
     561           0 :         return (map[index] >> offset) & 0xFF;
     562             : }
     563             : 
     564             : /**
     565             :  * bitmap_set_value8 - set an 8-bit value within a memory region
     566             :  * @map: address to the bitmap memory region
     567             :  * @value: the 8-bit value; values wider than 8 bits may clobber bitmap
     568             :  * @start: bit offset of the 8-bit value; must be a multiple of 8
     569             :  */
     570             : static inline void bitmap_set_value8(unsigned long *map, unsigned long value,
     571             :                                      unsigned long start)
     572             : {
     573             :         const size_t index = BIT_WORD(start);
     574             :         const unsigned long offset = start % BITS_PER_LONG;
     575             : 
     576             :         map[index] &= ~(0xFFUL << offset);
     577             :         map[index] |= value << offset;
     578             : }
     579             : 
     580             : #endif /* __ASSEMBLY__ */
     581             : 
     582             : #endif /* __LINUX_BITMAP_H */

Generated by: LCOV version 1.14