| #ifndef __LINUX_BITMAP_H |
| #define __LINUX_BITMAP_H |
| |
| #ifndef __ASSEMBLY__ |
| |
| #include <linux/types.h> |
| #include <linux/bitops.h> |
| #include <linux/string.h> |
| #include <linux/kernel.h> |
| |
| |
| |
| |
| |
| |
| extern int __bitmap_empty(const unsigned long *bitmap, int bits); |
| extern int __bitmap_full(const unsigned long *bitmap, int bits); |
| extern int __bitmap_equal(const unsigned long *bitmap1, |
| const unsigned long *bitmap2, int bits); |
| extern void __bitmap_complement(unsigned long *dst, const unsigned long *src, |
| int bits); |
| extern void __bitmap_shift_right(unsigned long *dst, |
| const unsigned long *src, int shift, int bits); |
| extern void __bitmap_shift_left(unsigned long *dst, |
| const unsigned long *src, int shift, int bits); |
| extern int __bitmap_and(unsigned long *dst, const unsigned long *bitmap1, |
| const unsigned long *bitmap2, int bits); |
| extern void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1, |
| const unsigned long *bitmap2, int bits); |
| extern void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1, |
| const unsigned long *bitmap2, int bits); |
| extern int __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1, |
| const unsigned long *bitmap2, int bits); |
| extern int __bitmap_intersects(const unsigned long *bitmap1, |
| const unsigned long *bitmap2, int bits); |
| extern int __bitmap_subset(const unsigned long *bitmap1, |
| const unsigned long *bitmap2, int bits); |
| extern int __bitmap_weight(const unsigned long *bitmap, int bits); |
| |
| extern void bitmap_set(unsigned long *map, int i, int len); |
| extern void bitmap_clear(unsigned long *map, int start, int nr); |
| |
| extern unsigned long bitmap_find_next_zero_area_off(unsigned long *map, |
| unsigned long size, |
| unsigned long start, |
| unsigned int nr, |
| unsigned long align_mask, |
| unsigned long align_offset); |
| |
| static inline unsigned long |
| bitmap_find_next_zero_area(unsigned long *map, |
| unsigned long size, |
| unsigned long start, |
| unsigned int nr, |
| unsigned long align_mask) |
| { |
| return bitmap_find_next_zero_area_off(map, size, start, nr, |
| align_mask, 0); |
| } |
| |
| extern int bitmap_scnprintf(char *buf, unsigned int len, |
| const unsigned long *src, int nbits); |
| extern int __bitmap_parse(const char *buf, unsigned int buflen, int is_user, |
| unsigned long *dst, int nbits); |
| extern int bitmap_parse_user(const char __user *ubuf, unsigned int ulen, |
| unsigned long *dst, int nbits); |
| extern int bitmap_scnlistprintf(char *buf, unsigned int len, |
| const unsigned long *src, int nbits); |
| extern int bitmap_parselist(const char *buf, unsigned long *maskp, |
| int nmaskbits); |
| extern int bitmap_parselist_user(const char __user *ubuf, unsigned int ulen, |
| unsigned long *dst, int nbits); |
| extern void bitmap_remap(unsigned long *dst, const unsigned long *src, |
| const unsigned long *old, const unsigned long *new, int bits); |
| extern int bitmap_bitremap(int oldbit, |
| const unsigned long *old, const unsigned long *new, int bits); |
| extern void bitmap_onto(unsigned long *dst, const unsigned long *orig, |
| const unsigned long *relmap, int bits); |
| extern void bitmap_fold(unsigned long *dst, const unsigned long *orig, |
| int sz, int bits); |
| extern int bitmap_find_free_region(unsigned long *bitmap, int bits, int order); |
| extern void bitmap_release_region(unsigned long *bitmap, int pos, int order); |
| extern int bitmap_allocate_region(unsigned long *bitmap, int pos, int order); |
| extern void bitmap_copy_le(void *dst, const unsigned long *src, int nbits); |
| extern int bitmap_ord_to_pos(const unsigned long *bitmap, int n, int bits); |
| |
| #define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) % BITS_PER_LONG)) |
| #define BITMAP_LAST_WORD_MASK(nbits) \ |
| ( \ |
| ((nbits) % BITS_PER_LONG) ? \ |
| (1UL<<((nbits) % BITS_PER_LONG))-1 : ~0UL \ |
| ) |
| |
| #define small_const_nbits(nbits) \ |
| (__builtin_constant_p(nbits) && (nbits) <= BITS_PER_LONG) |
| |
| static inline void bitmap_zero(unsigned long *dst, int nbits) |
| { |
| if (small_const_nbits(nbits)) |
| *dst = 0UL; |
| else { |
| int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long); |
| memset(dst, 0, len); |
| } |
| } |
| |
| static inline void bitmap_fill(unsigned long *dst, int nbits) |
| { |
| size_t nlongs = BITS_TO_LONGS(nbits); |
| if (!small_const_nbits(nbits)) { |
| int len = (nlongs - 1) * sizeof(unsigned long); |
| memset(dst, 0xff, len); |
| } |
| dst[nlongs - 1] = BITMAP_LAST_WORD_MASK(nbits); |
| } |
| |
| static inline void bitmap_copy(unsigned long *dst, const unsigned long *src, |
| int nbits) |
| { |
| if (small_const_nbits(nbits)) |
| *dst = *src; |
| else { |
| int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long); |
| memcpy(dst, src, len); |
| } |
| } |
| |
| static inline int bitmap_and(unsigned long *dst, const unsigned long *src1, |
| const unsigned long *src2, int nbits) |
| { |
| if (small_const_nbits(nbits)) |
| return (*dst = *src1 & *src2) != 0; |
| return __bitmap_and(dst, src1, src2, nbits); |
| } |
| |
| static inline void bitmap_or(unsigned long *dst, const unsigned long *src1, |
| const unsigned long *src2, int nbits) |
| { |
| if (small_const_nbits(nbits)) |
| *dst = *src1 | *src2; |
| else |
| __bitmap_or(dst, src1, src2, nbits); |
| } |
| |
| static inline void bitmap_xor(unsigned long *dst, const unsigned long *src1, |
| const unsigned long *src2, int nbits) |
| { |
| if (small_const_nbits(nbits)) |
| *dst = *src1 ^ *src2; |
| else |
| __bitmap_xor(dst, src1, src2, nbits); |
| } |
| |
| static inline int bitmap_andnot(unsigned long *dst, const unsigned long *src1, |
| const unsigned long *src2, int nbits) |
| { |
| if (small_const_nbits(nbits)) |
| return (*dst = *src1 & ~(*src2)) != 0; |
| return __bitmap_andnot(dst, src1, src2, nbits); |
| } |
| |
| static inline void bitmap_complement(unsigned long *dst, const unsigned long *src, |
| int nbits) |
| { |
| if (small_const_nbits(nbits)) |
| *dst = ~(*src) & BITMAP_LAST_WORD_MASK(nbits); |
| else |
| __bitmap_complement(dst, src, nbits); |
| } |
| |
| static inline int bitmap_equal(const unsigned long *src1, |
| const unsigned long *src2, int nbits) |
| { |
| if (small_const_nbits(nbits)) |
| return ! ((*src1 ^ *src2) & BITMAP_LAST_WORD_MASK(nbits)); |
| else |
| return __bitmap_equal(src1, src2, nbits); |
| } |
| |
| static inline int bitmap_intersects(const unsigned long *src1, |
| const unsigned long *src2, int nbits) |
| { |
| if (small_const_nbits(nbits)) |
| return ((*src1 & *src2) & BITMAP_LAST_WORD_MASK(nbits)) != 0; |
| else |
| return __bitmap_intersects(src1, src2, nbits); |
| } |
| |
| static inline int bitmap_subset(const unsigned long *src1, |
| const unsigned long *src2, int nbits) |
| { |
| if (small_const_nbits(nbits)) |
| return ! ((*src1 & ~(*src2)) & BITMAP_LAST_WORD_MASK(nbits)); |
| else |
| return __bitmap_subset(src1, src2, nbits); |
| } |
| |
| static inline int bitmap_empty(const unsigned long *src, int nbits) |
| { |
| if (small_const_nbits(nbits)) |
| return ! (*src & BITMAP_LAST_WORD_MASK(nbits)); |
| else |
| return __bitmap_empty(src, nbits); |
| } |
| |
| static inline int bitmap_full(const unsigned long *src, int nbits) |
| { |
| if (small_const_nbits(nbits)) |
| return ! (~(*src) & BITMAP_LAST_WORD_MASK(nbits)); |
| else |
| return __bitmap_full(src, nbits); |
| } |
| |
| static inline int bitmap_weight(const unsigned long *src, int nbits) |
| { |
| if (small_const_nbits(nbits)) |
| return hweight_long(*src & BITMAP_LAST_WORD_MASK(nbits)); |
| return __bitmap_weight(src, nbits); |
| } |
| |
| static inline void bitmap_shift_right(unsigned long *dst, |
| const unsigned long *src, int n, int nbits) |
| { |
| if (small_const_nbits(nbits)) |
| *dst = *src >> n; |
| else |
| __bitmap_shift_right(dst, src, n, nbits); |
| } |
| |
| static inline void bitmap_shift_left(unsigned long *dst, |
| const unsigned long *src, int n, int nbits) |
| { |
| if (small_const_nbits(nbits)) |
| *dst = (*src << n) & BITMAP_LAST_WORD_MASK(nbits); |
| else |
| __bitmap_shift_left(dst, src, n, nbits); |
| } |
| |
| static inline int bitmap_parse(const char *buf, unsigned int buflen, |
| unsigned long *maskp, int nmaskbits) |
| { |
| return __bitmap_parse(buf, buflen, 0, maskp, nmaskbits); |
| } |
| |
| #endif |
| |
| #endif |