linux/include/linux/bitops.h
<<
>>
Prefs
   1#ifndef _LINUX_BITOPS_H
   2#define _LINUX_BITOPS_H
   3#include <asm/types.h>
   4
   5#ifdef  __KERNEL__
   6#define BIT(nr)                 (1UL << (nr))
   7#define BIT_MASK(nr)            (1UL << ((nr) % BITS_PER_LONG))
   8#define BIT_WORD(nr)            ((nr) / BITS_PER_LONG)
   9#define BITS_PER_BYTE           8
  10#define BITS_TO_LONGS(nr)       DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
  11#endif
  12
  13extern unsigned int __sw_hweight8(unsigned int w);
  14extern unsigned int __sw_hweight16(unsigned int w);
  15extern unsigned int __sw_hweight32(unsigned int w);
  16extern unsigned long __sw_hweight64(__u64 w);
  17
  18/*
  19 * Include this here because some architectures need generic_ffs/fls in
  20 * scope
  21 */
  22#include <asm/bitops.h>
  23
  24#define for_each_set_bit(bit, addr, size) \
  25        for ((bit) = find_first_bit((addr), (size)); \
  26             (bit) < (size); \
  27             (bit) = find_next_bit((addr), (size), (bit) + 1))
  28
  29static __inline__ int get_bitmask_order(unsigned int count)
  30{
  31        int order;
  32
  33        order = fls(count);
  34        return order;   /* We could be slightly more clever with -1 here... */
  35}
  36
  37static __inline__ int get_count_order(unsigned int count)
  38{
  39        int order;
  40
  41        order = fls(count) - 1;
  42        if (count & (count - 1))
  43                order++;
  44        return order;
  45}
  46
  47static inline unsigned long hweight_long(unsigned long w)
  48{
  49        return sizeof(w) == 4 ? hweight32(w) : hweight64(w);
  50}
  51
  52/**
  53 * rol32 - rotate a 32-bit value left
  54 * @word: value to rotate
  55 * @shift: bits to roll
  56 */
  57static inline __u32 rol32(__u32 word, unsigned int shift)
  58{
  59        return (word << shift) | (word >> (32 - shift));
  60}
  61
  62/**
  63 * ror32 - rotate a 32-bit value right
  64 * @word: value to rotate
  65 * @shift: bits to roll
  66 */
  67static inline __u32 ror32(__u32 word, unsigned int shift)
  68{
  69        return (word >> shift) | (word << (32 - shift));
  70}
  71
  72/**
  73 * rol16 - rotate a 16-bit value left
  74 * @word: value to rotate
  75 * @shift: bits to roll
  76 */
  77static inline __u16 rol16(__u16 word, unsigned int shift)
  78{
  79        return (word << shift) | (word >> (16 - shift));
  80}
  81
  82/**
  83 * ror16 - rotate a 16-bit value right
  84 * @word: value to rotate
  85 * @shift: bits to roll
  86 */
  87static inline __u16 ror16(__u16 word, unsigned int shift)
  88{
  89        return (word >> shift) | (word << (16 - shift));
  90}
  91
  92/**
  93 * rol8 - rotate an 8-bit value left
  94 * @word: value to rotate
  95 * @shift: bits to roll
  96 */
  97static inline __u8 rol8(__u8 word, unsigned int shift)
  98{
  99        return (word << shift) | (word >> (8 - shift));
 100}
 101
 102/**
 103 * ror8 - rotate an 8-bit value right
 104 * @word: value to rotate
 105 * @shift: bits to roll
 106 */
 107static inline __u8 ror8(__u8 word, unsigned int shift)
 108{
 109        return (word >> shift) | (word << (8 - shift));
 110}
 111
 112static inline unsigned fls_long(unsigned long l)
 113{
 114        if (sizeof(l) == 4)
 115                return fls(l);
 116        return fls64(l);
 117}
 118
 119/**
 120 * __ffs64 - find first set bit in a 64 bit word
 121 * @word: The 64 bit word
 122 *
 123 * On 64 bit arches this is a synomyn for __ffs
 124 * The result is not defined if no bits are set, so check that @word
 125 * is non-zero before calling this.
 126 */
 127static inline unsigned long __ffs64(u64 word)
 128{
 129#if BITS_PER_LONG == 32
 130        if (((u32)word) == 0UL)
 131                return __ffs((u32)(word >> 32)) + 32;
 132#elif BITS_PER_LONG != 64
 133#error BITS_PER_LONG not 32 or 64
 134#endif
 135        return __ffs((unsigned long)word);
 136}
 137
 138#ifdef __KERNEL__
 139#ifdef CONFIG_GENERIC_FIND_FIRST_BIT
 140
 141/**
 142 * find_first_bit - find the first set bit in a memory region
 143 * @addr: The address to start the search at
 144 * @size: The maximum size to search
 145 *
 146 * Returns the bit number of the first set bit.
 147 */
 148extern unsigned long find_first_bit(const unsigned long *addr,
 149                                    unsigned long size);
 150
 151/**
 152 * find_first_zero_bit - find the first cleared bit in a memory region
 153 * @addr: The address to start the search at
 154 * @size: The maximum size to search
 155 *
 156 * Returns the bit number of the first cleared bit.
 157 */
 158extern unsigned long find_first_zero_bit(const unsigned long *addr,
 159                                         unsigned long size);
 160#endif /* CONFIG_GENERIC_FIND_FIRST_BIT */
 161
 162#ifdef CONFIG_GENERIC_FIND_LAST_BIT
 163/**
 164 * find_last_bit - find the last set bit in a memory region
 165 * @addr: The address to start the search at
 166 * @size: The maximum size to search
 167 *
 168 * Returns the bit number of the first set bit, or size.
 169 */
 170extern unsigned long find_last_bit(const unsigned long *addr,
 171                                   unsigned long size);
 172#endif /* CONFIG_GENERIC_FIND_LAST_BIT */
 173
 174#ifdef CONFIG_GENERIC_FIND_NEXT_BIT
 175
 176/**
 177 * find_next_bit - find the next set bit in a memory region
 178 * @addr: The address to base the search on
 179 * @offset: The bitnumber to start searching at
 180 * @size: The bitmap size in bits
 181 */
 182extern unsigned long find_next_bit(const unsigned long *addr,
 183                                   unsigned long size, unsigned long offset);
 184
 185/**
 186 * find_next_zero_bit - find the next cleared bit in a memory region
 187 * @addr: The address to base the search on
 188 * @offset: The bitnumber to start searching at
 189 * @size: The bitmap size in bits
 190 */
 191
 192extern unsigned long find_next_zero_bit(const unsigned long *addr,
 193                                        unsigned long size,
 194                                        unsigned long offset);
 195
 196#endif /* CONFIG_GENERIC_FIND_NEXT_BIT */
 197#endif /* __KERNEL__ */
 198#endif
 199
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.