| /* |
| * Copyright 1996-2004 by Hans Reiser, licensing governed by |
| * reiserfsprogs/README |
| */ |
| |
| #ifndef MISC_BITOPS_H |
| #define MISC_BITOPS_H |
| |
| #include "misc/types.h" |
| #include "misc/misc.h" |
| |
| extern __u16 mask16 (int from, int count); |
| extern __u32 mask32 (int from, int count); |
| extern __u64 mask64 (int from, int count); |
| |
| #define misc_set_bitfield_XX(XX,vp,val,from,count) \ |
| ({ \ |
| __u##XX * p, tmp; \ |
| \ |
| /* make sure that given value can be put in 'count' bits */ \ |
| if (val > (1 << count)) \ |
| misc_die ("misc_set_bitfield: val %d is too big for %d bits", val, count); \ |
| \ |
| p = (__u##XX *)vp; \ |
| tmp = le##XX##_to_cpu (*p); \ |
| \ |
| /* clear 'count' bits starting from 'from'-th one */ \ |
| tmp &= ~mask##XX (from, count); \ |
| \ |
| /* put given value in proper bits */ \ |
| tmp |= (val << from); \ |
| \ |
| *p = cpu_to_le##XX (tmp); \ |
| }) |
| |
| |
| #define misc_get_bitfield_XX(XX,vp,from,count) \ |
| ({ \ |
| __u##XX * p, tmp; \ |
| \ |
| p = (__u##XX *)vp; \ |
| tmp = le##XX##_to_cpu (*p); \ |
| \ |
| /* clear all bits but 'count' bits starting from 'from'-th one */ \ |
| tmp &= mask##XX (from, count); \ |
| \ |
| /* get value written in specified bits */ \ |
| tmp >>= from; \ |
| tmp; \ |
| }) |
| |
| extern inline int misc_set_bit (unsigned long long nr, |
| void * addr); |
| |
| extern inline int misc_clear_bit (unsigned long long nr, |
| void * addr); |
| |
| extern inline int misc_test_bit(unsigned long long nr, |
| const void * addr); |
| |
| extern inline unsigned long long |
| misc_find_first_zero_bit (const void *vaddr, |
| unsigned long long size); |
| |
| extern inline unsigned long long |
| misc_find_next_zero_bit (const void *vaddr, |
| unsigned long long size, |
| unsigned long long offset); |
| |
| extern inline unsigned long long |
| misc_find_next_set_bit(const void *vaddr, |
| unsigned long long size, |
| unsigned long long offset); |
| |
| extern inline unsigned long long |
| misc_find_first_set_bit (const void *vaddr, |
| unsigned long long size); |
| |
| #endif |