2005-04-16 15:20:36 -07:00
# ifndef _ASM_GENERIC_BITOPS_H_
# define _ASM_GENERIC_BITOPS_H_
/*
* For the benefit of those who are trying to port Linux to another
* architecture , here are some C - language equivalents . You should
* recode these in the native assembly language , if at all possible .
* To guarantee atomicity , these routines call cli ( ) and sti ( ) to
* disable interrupts while they operate . ( You have to provide inline
* routines to cli ( ) and sti ( ) . )
*
* Also note , these routines assume that you have 32 bit longs .
* You will have to change this if you are trying to port Linux to the
* Alpha architecture or to a Cray . : - )
*
* C language equivalents written by Theodore Ts ' o , 9 / 26 / 92
*/
extern __inline__ int set_bit ( int nr , long * addr )
{
int mask , retval ;
addr + = nr > > 5 ;
mask = 1 < < ( nr & 0x1f ) ;
cli ( ) ;
retval = ( mask & * addr ) ! = 0 ;
* addr | = mask ;
sti ( ) ;
return retval ;
}
extern __inline__ int clear_bit ( int nr , long * addr )
{
int mask , retval ;
addr + = nr > > 5 ;
mask = 1 < < ( nr & 0x1f ) ;
cli ( ) ;
retval = ( mask & * addr ) ! = 0 ;
* addr & = ~ mask ;
sti ( ) ;
return retval ;
}
extern __inline__ int test_bit ( int nr , const unsigned long * addr )
{
int mask ;
addr + = nr > > 5 ;
mask = 1 < < ( nr & 0x1f ) ;
return ( ( mask & * addr ) ! = 0 ) ;
}
/*
* fls : find last bit set .
*/
# define fls(x) generic_fls(x)
2005-12-21 19:30:53 -08:00
# define fls64(x) generic_fls64(x)
2005-04-16 15:20:36 -07:00
# ifdef __KERNEL__
/*
* ffs : find first bit set . This is defined the same way as
* the libc and compiler builtin ffs routines , therefore
* differs in spirit from the above ffz ( man ffs ) .
*/
# define ffs(x) generic_ffs(x)
/*
* hweightN : returns the hamming weight ( i . e . the number
* of bits set ) of a N - bit word
*/
# define hweight32(x) generic_hweight32(x)
# define hweight16(x) generic_hweight16(x)
# define hweight8(x) generic_hweight8(x)
# endif /* __KERNEL__ */
# endif /* _ASM_GENERIC_BITOPS_H */