linux/include/linux/bitops.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef _LINUX_BITOPS_H
   3#define _LINUX_BITOPS_H
   4#include <asm/types.h>
   5#include <linux/bits.h>
   6
   7/* Set bits in the first 'n' bytes when loaded from memory */
   8#ifdef __LITTLE_ENDIAN
   9#  define aligned_byte_mask(n) ((1UL << 8*(n))-1)
  10#else
  11#  define aligned_byte_mask(n) (~0xffUL << (BITS_PER_LONG - 8 - 8*(n)))
  12#endif
  13
  14#define BITS_PER_TYPE(type)     (sizeof(type) * BITS_PER_BYTE)
  15#define BITS_TO_LONGS(nr)       DIV_ROUND_UP(nr, BITS_PER_TYPE(long))
  16#define BITS_TO_U64(nr)         DIV_ROUND_UP(nr, BITS_PER_TYPE(u64))
  17#define BITS_TO_U32(nr)         DIV_ROUND_UP(nr, BITS_PER_TYPE(u32))
  18#define BITS_TO_BYTES(nr)       DIV_ROUND_UP(nr, BITS_PER_TYPE(char))
  19
  20extern unsigned int __sw_hweight8(unsigned int w);
  21extern unsigned int __sw_hweight16(unsigned int w);
  22extern unsigned int __sw_hweight32(unsigned int w);
  23extern unsigned long __sw_hweight64(__u64 w);
  24
  25/*
  26 * Include this here because some architectures need generic_ffs/fls in
  27 * scope
  28 */
  29#include <asm/bitops.h>
  30
  31#define for_each_set_bit(bit, addr, size) \
  32        for ((bit) = find_first_bit((addr), (size));            \
  33             (bit) < (size);                                    \
  34             (bit) = find_next_bit((addr), (size), (bit) + 1))
  35
  36/* same as for_each_set_bit() but use bit as value to start with */
  37#define for_each_set_bit_from(bit, addr, size) \
  38        for ((bit) = find_next_bit((addr), (size), (bit));      \
  39             (bit) < (size);                                    \
  40             (bit) = find_next_bit((addr), (size), (bit) + 1))
  41
  42#define for_each_clear_bit(bit, addr, size) \
  43        for ((bit) = find_first_zero_bit((addr), (size));       \
  44             (bit) < (size);                                    \
  45             (bit) = find_next_zero_bit((addr), (size), (bit) + 1))
  46
  47/* same as for_each_clear_bit() but use bit as value to start with */
  48#define for_each_clear_bit_from(bit, addr, size) \
  49        for ((bit) = find_next_zero_bit((addr), (size), (bit)); \
  50             (bit) < (size);                                    \
  51             (bit) = find_next_zero_bit((addr), (size), (bit) + 1))
  52
  53/**
  54 * for_each_set_clump8 - iterate over bitmap for each 8-bit clump with set bits
  55 * @start: bit offset to start search and to store the current iteration offset
  56 * @clump: location to store copy of current 8-bit clump
  57 * @bits: bitmap address to base the search on
  58 * @size: bitmap size in number of bits
  59 */
  60#define for_each_set_clump8(start, clump, bits, size) \
  61        for ((start) = find_first_clump8(&(clump), (bits), (size)); \
  62             (start) < (size); \
  63             (start) = find_next_clump8(&(clump), (bits), (size), (start) + 8))
  64
  65static inline int get_bitmask_order(unsigned int count)
  66{
  67        int order;
  68
  69        order = fls(count);
  70        return order;   /* We could be slightly more clever with -1 here... */
  71}
  72
  73static __always_inline unsigned long hweight_long(unsigned long w)
  74{
  75        return sizeof(w) == 4 ? hweight32(w) : hweight64((__u64)w);
  76}
  77
  78/**
  79 * rol64 - rotate a 64-bit value left
  80 * @word: value to rotate
  81 * @shift: bits to roll
  82 */
  83static inline __u64 rol64(__u64 word, unsigned int shift)
  84{
  85        return (word << (shift & 63)) | (word >> ((-shift) & 63));
  86}
  87
  88/**
  89 * ror64 - rotate a 64-bit value right
  90 * @word: value to rotate
  91 * @shift: bits to roll
  92 */
  93static inline __u64 ror64(__u64 word, unsigned int shift)
  94{
  95        return (word >> (shift & 63)) | (word << ((-shift) & 63));
  96}
  97
  98/**
  99 * rol32 - rotate a 32-bit value left
 100 * @word: value to rotate
 101 * @shift: bits to roll
 102 */
 103static inline __u32 rol32(__u32 word, unsigned int shift)
 104{
 105        return (word << (shift & 31)) | (word >> ((-shift) & 31));
 106}
 107
 108/**
 109 * ror32 - rotate a 32-bit value right
 110 * @word: value to rotate
 111 * @shift: bits to roll
 112 */
 113static inline __u32 ror32(__u32 word, unsigned int shift)
 114{
 115        return (word >> (shift & 31)) | (word << ((-shift) & 31));
 116}
 117
 118/**
 119 * rol16 - rotate a 16-bit value left
 120 * @word: value to rotate
 121 * @shift: bits to roll
 122 */
 123static inline __u16 rol16(__u16 word, unsigned int shift)
 124{
 125        return (word << (shift & 15)) | (word >> ((-shift) & 15));
 126}
 127
 128/**
 129 * ror16 - rotate a 16-bit value right
 130 * @word: value to rotate
 131 * @shift: bits to roll
 132 */
 133static inline __u16 ror16(__u16 word, unsigned int shift)
 134{
 135        return (word >> (shift & 15)) | (word << ((-shift) & 15));
 136}
 137
 138/**
 139 * rol8 - rotate an 8-bit value left
 140 * @word: value to rotate
 141 * @shift: bits to roll
 142 */
 143static inline __u8 rol8(__u8 word, unsigned int shift)
 144{
 145        return (word << (shift & 7)) | (word >> ((-shift) & 7));
 146}
 147
 148/**
 149 * ror8 - rotate an 8-bit value right
 150 * @word: value to rotate
 151 * @shift: bits to roll
 152 */
 153static inline __u8 ror8(__u8 word, unsigned int shift)
 154{
 155        return (word >> (shift & 7)) | (word << ((-shift) & 7));
 156}
 157
 158/**
 159 * sign_extend32 - sign extend a 32-bit value using specified bit as sign-bit
 160 * @value: value to sign extend
 161 * @index: 0 based bit index (0<=index<32) to sign bit
 162 *
 163 * This is safe to use for 16- and 8-bit types as well.
 164 */
 165static __always_inline __s32 sign_extend32(__u32 value, int index)
 166{
 167        __u8 shift = 31 - index;
 168        return (__s32)(value << shift) >> shift;
 169}
 170
 171/**
 172 * sign_extend64 - sign extend a 64-bit value using specified bit as sign-bit
 173 * @value: value to sign extend
 174 * @index: 0 based bit index (0<=index<64) to sign bit
 175 */
 176static __always_inline __s64 sign_extend64(__u64 value, int index)
 177{
 178        __u8 shift = 63 - index;
 179        return (__s64)(value << shift) >> shift;
 180}
 181
 182static inline unsigned fls_long(unsigned long l)
 183{
 184        if (sizeof(l) == 4)
 185                return fls(l);
 186        return fls64(l);
 187}
 188
 189static inline int get_count_order(unsigned int count)
 190{
 191        if (count == 0)
 192                return -1;
 193
 194        return fls(--count);
 195}
 196
 197/**
 198 * get_count_order_long - get order after rounding @l up to power of 2
 199 * @l: parameter
 200 *
 201 * it is same as get_count_order() but with long type parameter
 202 */
 203static inline int get_count_order_long(unsigned long l)
 204{
 205        if (l == 0UL)
 206                return -1;
 207        return (int)fls_long(--l);
 208}
 209
 210/**
 211 * __ffs64 - find first set bit in a 64 bit word
 212 * @word: The 64 bit word
 213 *
 214 * On 64 bit arches this is a synomyn for __ffs
 215 * The result is not defined if no bits are set, so check that @word
 216 * is non-zero before calling this.
 217 */
 218static inline unsigned long __ffs64(u64 word)
 219{
 220#if BITS_PER_LONG == 32
 221        if (((u32)word) == 0UL)
 222                return __ffs((u32)(word >> 32)) + 32;
 223#elif BITS_PER_LONG != 64
 224#error BITS_PER_LONG not 32 or 64
 225#endif
 226        return __ffs((unsigned long)word);
 227}
 228
 229/**
 230 * assign_bit - Assign value to a bit in memory
 231 * @nr: the bit to set
 232 * @addr: the address to start counting from
 233 * @value: the value to assign
 234 */
 235static __always_inline void assign_bit(long nr, volatile unsigned long *addr,
 236                                       bool value)
 237{
 238        if (value)
 239                set_bit(nr, addr);
 240        else
 241                clear_bit(nr, addr);
 242}
 243
 244static __always_inline void __assign_bit(long nr, volatile unsigned long *addr,
 245                                         bool value)
 246{
 247        if (value)
 248                __set_bit(nr, addr);
 249        else
 250                __clear_bit(nr, addr);
 251}
 252
 253#ifdef __KERNEL__
 254
 255#ifndef set_mask_bits
 256#define set_mask_bits(ptr, mask, bits)  \
 257({                                                              \
 258        const typeof(*(ptr)) mask__ = (mask), bits__ = (bits);  \
 259        typeof(*(ptr)) old__, new__;                            \
 260                                                                \
 261        do {                                                    \
 262                old__ = READ_ONCE(*(ptr));                      \
 263                new__ = (old__ & ~mask__) | bits__;             \
 264        } while (cmpxchg(ptr, old__, new__) != old__);          \
 265                                                                \
 266        old__;                                                  \
 267})
 268#endif
 269
 270#ifndef bit_clear_unless
 271#define bit_clear_unless(ptr, clear, test)      \
 272({                                                              \
 273        const typeof(*(ptr)) clear__ = (clear), test__ = (test);\
 274        typeof(*(ptr)) old__, new__;                            \
 275                                                                \
 276        do {                                                    \
 277                old__ = READ_ONCE(*(ptr));                      \
 278                new__ = old__ & ~clear__;                       \
 279        } while (!(old__ & test__) &&                           \
 280                 cmpxchg(ptr, old__, new__) != old__);          \
 281                                                                \
 282        !(old__ & test__);                                      \
 283})
 284#endif
 285
 286#ifndef find_last_bit
 287/**
 288 * find_last_bit - find the last set bit in a memory region
 289 * @addr: The address to start the search at
 290 * @size: The number of bits to search
 291 *
 292 * Returns the bit number of the last set bit, or size.
 293 */
 294extern unsigned long find_last_bit(const unsigned long *addr,
 295                                   unsigned long size);
 296#endif
 297
 298#endif /* __KERNEL__ */
 299#endif
 300