blob: 16653f510c669bd42cbd86c8b14b68bc1d8e4f53 [file] [log] [blame]
/*
* 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