X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=include%2Fasm-sparc64%2Fbitops.h;h=9d722dc8cca327f6f04bd596ff883526676c2112;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=1289af2416c77c7282306263919dcbbfbc6fc592;hpb=87fc8d1bb10cd459024a742c6a10961fefcef18f;p=linux-2.6.git diff --git a/include/asm-sparc64/bitops.h b/include/asm-sparc64/bitops.h index 1289af241..9d722dc8c 100644 --- a/include/asm-sparc64/bitops.h +++ b/include/asm-sparc64/bitops.h @@ -7,19 +7,16 @@ #ifndef _SPARC64_BITOPS_H #define _SPARC64_BITOPS_H +#include #include #include -extern long ___test_and_set_bit(unsigned long nr, volatile unsigned long *addr); -extern long ___test_and_clear_bit(unsigned long nr, volatile unsigned long *addr); -extern long ___test_and_change_bit(unsigned long nr, volatile unsigned long *addr); - -#define test_and_set_bit(nr,addr) ({___test_and_set_bit(nr,addr)!=0;}) -#define test_and_clear_bit(nr,addr) ({___test_and_clear_bit(nr,addr)!=0;}) -#define test_and_change_bit(nr,addr) ({___test_and_change_bit(nr,addr)!=0;}) -#define set_bit(nr,addr) ((void)___test_and_set_bit(nr,addr)) -#define clear_bit(nr,addr) ((void)___test_and_clear_bit(nr,addr)) -#define change_bit(nr,addr) ((void)___test_and_change_bit(nr,addr)) +extern int test_and_set_bit(unsigned long nr, volatile unsigned long *addr); +extern int test_and_clear_bit(unsigned long nr, volatile unsigned long *addr); +extern int test_and_change_bit(unsigned long nr, volatile unsigned long *addr); +extern void set_bit(unsigned long nr, volatile unsigned long *addr); +extern void clear_bit(unsigned long nr, volatile unsigned long *addr); +extern void change_bit(unsigned long nr, volatile unsigned long *addr); /* "non-atomic" versions... */ @@ -74,8 +71,13 @@ static __inline__ int __test_and_change_bit(int nr, volatile unsigned long *addr return ((old & mask) != 0); } -#define smp_mb__before_clear_bit() do { } while(0) -#define smp_mb__after_clear_bit() do { } while(0) +#ifdef CONFIG_SMP +#define smp_mb__before_clear_bit() membar("#StoreLoad | #LoadLoad") +#define smp_mb__after_clear_bit() membar("#StoreLoad | #StoreStore") +#else +#define smp_mb__before_clear_bit() barrier() +#define smp_mb__after_clear_bit() barrier() +#endif static __inline__ int test_bit(int nr, __const__ volatile unsigned long *addr) { @@ -223,15 +225,16 @@ extern unsigned long find_next_bit(const unsigned long *, unsigned long, * on Linus's ALPHA routines, which are pretty portable BTW. */ -extern unsigned long find_next_zero_bit(unsigned long *, unsigned long, unsigned long); +extern unsigned long find_next_zero_bit(const unsigned long *, + unsigned long, unsigned long); #define find_first_zero_bit(addr, size) \ find_next_zero_bit((addr), (size), 0) #define test_and_set_le_bit(nr,addr) \ - ({ ___test_and_set_bit((nr) ^ 0x38, (addr)) != 0; }) + test_and_set_bit((nr) ^ 0x38, (addr)) #define test_and_clear_le_bit(nr,addr) \ - ({ ___test_and_clear_bit((nr) ^ 0x38, (addr)) != 0; }) + test_and_clear_bit((nr) ^ 0x38, (addr)) static __inline__ int test_le_bit(int nr, __const__ unsigned long * addr) { @@ -250,12 +253,21 @@ extern unsigned long find_next_zero_le_bit(unsigned long *, unsigned long, unsig #ifdef __KERNEL__ +#define __set_le_bit(nr, addr) \ + __set_bit((nr) ^ 0x38, (addr)) +#define __clear_le_bit(nr, addr) \ + __clear_bit((nr) ^ 0x38, (addr)) +#define __test_and_clear_le_bit(nr, addr) \ + __test_and_clear_bit((nr) ^ 0x38, (addr)) +#define __test_and_set_le_bit(nr, addr) \ + __test_and_set_bit((nr) ^ 0x38, (addr)) + #define ext2_set_bit(nr,addr) \ - test_and_set_le_bit((nr),(unsigned long *)(addr)) + __test_and_set_le_bit((nr),(unsigned long *)(addr)) #define ext2_set_bit_atomic(lock,nr,addr) \ test_and_set_le_bit((nr),(unsigned long *)(addr)) #define ext2_clear_bit(nr,addr) \ - test_and_clear_le_bit((nr),(unsigned long *)(addr)) + __test_and_clear_le_bit((nr),(unsigned long *)(addr)) #define ext2_clear_bit_atomic(lock,nr,addr) \ test_and_clear_le_bit((nr),(unsigned long *)(addr)) #define ext2_test_bit(nr,addr) \