80 lines
2.1 KiB
C
80 lines
2.1 KiB
C
/*
|
|
* 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
|