linux/tools/include/linux/bitmap.h
<<
>>
Prefs
   1#ifndef _PERF_BITOPS_H
   2#define _PERF_BITOPS_H
   3
   4#include <string.h>
   5#include <linux/bitops.h>
   6#include <stdlib.h>
   7
   8#define DECLARE_BITMAP(name,bits) \
   9        unsigned long name[BITS_TO_LONGS(bits)]
  10
  11int __bitmap_weight(const unsigned long *bitmap, int bits);
  12void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1,
  13                 const unsigned long *bitmap2, int bits);
  14int __bitmap_and(unsigned long *dst, const unsigned long *bitmap1,
  15                 const unsigned long *bitmap2, unsigned int bits);
  16
  17#define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) & (BITS_PER_LONG - 1)))
  18
  19#define BITMAP_LAST_WORD_MASK(nbits)                                    \
  20(                                                                       \
  21        ((nbits) % BITS_PER_LONG) ?                                     \
  22                (1UL<<((nbits) % BITS_PER_LONG))-1 : ~0UL               \
  23)
  24
  25#define small_const_nbits(nbits) \
  26        (__builtin_constant_p(nbits) && (nbits) <= BITS_PER_LONG)
  27
  28static inline void bitmap_zero(unsigned long *dst, int nbits)
  29{
  30        if (small_const_nbits(nbits))
  31                *dst = 0UL;
  32        else {
  33                int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long);
  34                memset(dst, 0, len);
  35        }
  36}
  37
  38static inline int bitmap_weight(const unsigned long *src, int nbits)
  39{
  40        if (small_const_nbits(nbits))
  41                return hweight_long(*src & BITMAP_LAST_WORD_MASK(nbits));
  42        return __bitmap_weight(src, nbits);
  43}
  44
  45static inline void bitmap_or(unsigned long *dst, const unsigned long *src1,
  46                             const unsigned long *src2, int nbits)
  47{
  48        if (small_const_nbits(nbits))
  49                *dst = *src1 | *src2;
  50        else
  51                __bitmap_or(dst, src1, src2, nbits);
  52}
  53
  54/**
  55 * test_and_set_bit - Set a bit and return its old value
  56 * @nr: Bit to set
  57 * @addr: Address to count from
  58 */
  59static inline int test_and_set_bit(int nr, unsigned long *addr)
  60{
  61        unsigned long mask = BIT_MASK(nr);
  62        unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
  63        unsigned long old;
  64
  65        old = *p;
  66        *p = old | mask;
  67
  68        return (old & mask) != 0;
  69}
  70
  71/**
  72 * bitmap_alloc - Allocate bitmap
  73 * @nr: Bit to set
  74 */
  75static inline unsigned long *bitmap_alloc(int nbits)
  76{
  77        return calloc(1, BITS_TO_LONGS(nbits) * sizeof(unsigned long));
  78}
  79
  80/*
  81 * bitmap_scnprintf - print bitmap list into buffer
  82 * @bitmap: bitmap
  83 * @nbits: size of bitmap
  84 * @buf: buffer to store output
  85 * @size: size of @buf
  86 */
  87size_t bitmap_scnprintf(unsigned long *bitmap, int nbits,
  88                        char *buf, size_t size);
  89
  90/**
  91 * bitmap_and - Do logical and on bitmaps
  92 * @dst: resulting bitmap
  93 * @src1: operand 1
  94 * @src2: operand 2
  95 * @nbits: size of bitmap
  96 */
  97static inline int bitmap_and(unsigned long *dst, const unsigned long *src1,
  98                             const unsigned long *src2, unsigned int nbits)
  99{
 100        if (small_const_nbits(nbits))
 101                return (*dst = *src1 & *src2 & BITMAP_LAST_WORD_MASK(nbits)) != 0;
 102        return __bitmap_and(dst, src1, src2, nbits);
 103}
 104
 105#endif /* _PERF_BITOPS_H */
 106