blob: e13a56ba2ef6f33a5846c4e72d2bfcb00dd89adc [file] [log] [blame]
#ifndef __BACKPORT_BITOPS_H
#define __BACKPORT_BITOPS_H
#include_next <linux/bitops.h>
#include <linux/version.h>
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30))
static inline unsigned long __ffs64(u64 word)
{
#if BITS_PER_LONG == 32
if (((u32)word) == 0UL)
return __ffs((u32)(word >> 32)) + 32;
#elif BITS_PER_LONG != 64
#error BITS_PER_LONG not 32 or 64
#endif
return __ffs((unsigned long)word);
}
#endif /* < 2.6.30 */
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34))
#define for_each_set_bit(bit, addr, size) \
for ((bit) = find_first_bit((addr), (size)); \
(bit) < (size); \
(bit) = find_next_bit((addr), (size), (bit) + 1))
#endif /* < 2.6.34 */
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38))
#define sign_extend32 LINUX_BACKPORT(sign_extend32)
static inline __s32 sign_extend32(__u32 value, int index)
{
__u8 shift = 31 - index;
return (__s32)(value << shift) >> shift;
}
#endif /* < 2.6.38 */
#endif /* __BACKPORT_BITOPS_H */