--- 2.2.18pre14aa1/include/asm-alpha/bitops.h.~1~ Tue Sep 5 02:28:49 2000 +++ 2.2.18pre14aa1/include/asm-alpha/bitops.h Tue Oct 3 03:08:08 2000 @@ -38,6 +38,30 @@ :"Ir" (1UL << (nr & 31)), "m" (*m)); } +/* + * WARNING: non atomic version. + */ +extern __inline__ void __set_bit(unsigned long nr, volatile void * addr) +{ + unsigned int * m = ((unsigned int *) addr) + (nr >> 5); + /* + * Asm and C produces the same thing so let + * the compiler to do its good work. + */ +#if 0 + int tmp; + + __asm__ __volatile__( + "ldl %0,%3\n\t" + "bis %0,%2,%0\n\t" + "stl %0,%1" + : "=&r" (tmp), "=m" (*m) + : "Ir" (1UL << (nr & 31)), "m" (*m)); +#else + *m |= 1UL << (nr & 31); +#endif +} + extern __inline__ void clear_bit(unsigned long nr, volatile void * addr) { unsigned long oldbit; @@ -96,6 +120,29 @@ "3: br 1b\n" ".previous" :"=&r" (temp), "=m" (*m), "=&r" (oldbit) + :"Ir" (1UL << (nr & 31)), "m" (*m) : "memory"); + + return oldbit != 0; +} + +/* + * WARNING: non atomic version. + */ +extern __inline__ unsigned long __test_and_set_bit(unsigned long nr, + volatile void * addr) +{ + unsigned long oldbit; + unsigned long temp; + unsigned int * m = ((unsigned int *) addr) + (nr >> 5); + + __asm__ __volatile__( + " ldl %0,%4\n" + " and %0,%3,%2\n" + " bne %2,1f\n" + " xor %0,%3,%0\n" + " stl %0,%1\n" + "1:\n" + :"=&r" (temp), "=m" (*m), "=&r" (oldbit) :"Ir" (1UL << (nr & 31)), "m" (*m)); return oldbit != 0; @@ -121,6 +168,29 @@ "3: br 1b\n" ".previous" :"=&r" (temp), "=m" (*m), "=&r" (oldbit) + :"Ir" (1UL << (nr & 31)), "m" (*m) : "memory"); + + return oldbit != 0; +} + +/* + * WARNING: non atomic version. + */ +extern __inline__ unsigned long __test_and_clear_bit(unsigned long nr, + volatile void * addr) +{ + unsigned long oldbit; + unsigned long temp; + unsigned int * m = ((unsigned int *) addr) + (nr >> 5); + + __asm__ __volatile__( + " ldl %0,%4\n" + " and %0,%3,%2\n" + " beq %2,1f\n" + " xor %0,%3,%0\n" + " stl %0,%1\n" + "1:\n" + :"=&r" (temp), "=m" (*m), "=&r" (oldbit) :"Ir" (1UL << (nr & 31)), "m" (*m)); return oldbit != 0; @@ -144,7 +214,7 @@ "3: br 1b\n" ".previous" :"=&r" (temp), "=m" (*m), "=&r" (oldbit) - :"Ir" (1UL << (nr & 31)), "m" (*m)); + :"Ir" (1UL << (nr & 31)), "m" (*m) : "memory"); return oldbit != 0; } @@ -285,15 +355,15 @@ #ifdef __KERNEL__ -#define ext2_set_bit test_and_set_bit -#define ext2_clear_bit test_and_clear_bit +#define ext2_set_bit __test_and_set_bit +#define ext2_clear_bit __test_and_clear_bit #define ext2_test_bit test_bit #define ext2_find_first_zero_bit find_first_zero_bit #define ext2_find_next_zero_bit find_next_zero_bit /* Bitmap functions for the minix filesystem. */ -#define minix_set_bit(nr,addr) test_and_set_bit(nr,addr) -#define minix_clear_bit(nr,addr) test_and_clear_bit(nr,addr) +#define minix_set_bit(nr,addr) __test_and_set_bit(nr,addr) +#define minix_clear_bit(nr,addr) __test_and_clear_bit(nr,addr) #define minix_test_bit(nr,addr) test_bit(nr,addr) #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size) --- 2.2.18pre14aa1/include/asm-alpha/spinlock.h.~1~ Tue Oct 3 01:35:31 2000 +++ 2.2.18pre14aa1/include/asm-alpha/spinlock.h Tue Oct 3 03:03:15 2000 @@ -151,7 +151,7 @@ " br 1b\n" ".previous" : "=r" (tmp), "=m" (__dummy_lock(lock)) - : "m"(__dummy_lock(lock))); + : "m"(__dummy_lock(lock)) : "memory"); } #define spin_trylock(lock) (!test_and_set_bit(0,(lock))) @@ -197,7 +197,7 @@ ".previous" : "=m" (__dummy_lock(lock)), "=&r" (regx) : "0" (__dummy_lock(lock)) - ); + : "memory"); } static inline void read_lock(rwlock_t * lock) @@ -218,7 +218,7 @@ ".previous" : "=m" (__dummy_lock(lock)), "=&r" (regx) : "m" (__dummy_lock(lock)) - ); + : "memory"); } #endif /* DEBUG_RWLOCK */ --- 2.2.18pre14aa1/include/asm-i386/spinlock.h.~1~ Mon Oct 2 22:28:15 2000 +++ 2.2.18pre14aa1/include/asm-i386/spinlock.h Tue Oct 3 02:56:35 2000 @@ -159,12 +159,12 @@ #define spin_lock(lock) \ __asm__ __volatile__( \ spin_lock_string \ - :"=m" (__dummy_lock(lock))) + :"=m" (__dummy_lock(lock)) : : "memory") #define spin_unlock(lock) \ __asm__ __volatile__( \ spin_unlock_string \ - :"=m" (__dummy_lock(lock))) + :"=m" (__dummy_lock(lock)) : : "memory") #define spin_trylock(lock) (!test_and_set_bit(0,(lock))) @@ -213,11 +213,11 @@ "js 3b\n\t" \ "jmp 1b\n" \ ".previous" \ - :"=m" (__dummy_lock(&(rw)->lock))) + :"=m" (__dummy_lock(&(rw)->lock)) : : "memory") #define read_unlock(rw) \ asm volatile("lock ; decl %0" \ - :"=m" (__dummy_lock(&(rw)->lock))) + :"=m" (__dummy_lock(&(rw)->lock)) : : "memory") #define write_lock(rw) \ asm volatile("\n1:\t" \ @@ -231,10 +231,10 @@ "jne 4b\n\t" \ "jmp 1b\n" \ ".previous" \ - :"=m" (__dummy_lock(&(rw)->lock))) + :"=m" (__dummy_lock(&(rw)->lock)) : : "memory") #define write_unlock(rw) \ - asm volatile("lock ; btrl $31,%0":"=m" (__dummy_lock(&(rw)->lock))) + asm volatile("lock ; btrl $31,%0":"=m" (__dummy_lock(&(rw)->lock)) : : "memory") #define read_lock_irq(lock) do { __cli(); read_lock(lock); } while (0) #define read_unlock_irq(lock) do { read_unlock(lock); __sti(); } while (0) --- 2.2.18pre14aa1/include/asm-i386/bitops.h.~1~ Fri Sep 29 06:00:19 2000 +++ 2.2.18pre14aa1/include/asm-i386/bitops.h Tue Oct 3 03:01:29 2000 @@ -49,6 +49,15 @@ :"Ir" (nr)); } +/* WARNING: non atomic and it can be reordered! */ +static __inline__ void __set_bit(int nr, volatile void * addr) +{ + __asm__( + "btsl %1,%0" + :"=m" (ADDR) + :"Ir" (nr)); +} + extern __inline__ void clear_bit(int nr, volatile void * addr) { __asm__ __volatile__( LOCK_PREFIX @@ -72,6 +81,18 @@ __asm__ __volatile__( LOCK_PREFIX "btsl %2,%1\n\tsbbl %0,%0" :"=r" (oldbit),"=m" (ADDR) + :"Ir" (nr) : "memory"); + return oldbit; +} + +/* WARNING: non atomic and it can be reordered! */ +static __inline__ int __test_and_set_bit(int nr, volatile void * addr) +{ + int oldbit; + + __asm__( + "btsl %2,%1\n\tsbbl %0,%0" + :"=r" (oldbit),"=m" (ADDR) :"Ir" (nr)); return oldbit; } @@ -83,6 +104,18 @@ __asm__ __volatile__( LOCK_PREFIX "btrl %2,%1\n\tsbbl %0,%0" :"=r" (oldbit),"=m" (ADDR) + :"Ir" (nr) : "memory"); + return oldbit; +} + +/* WARNING: non atomic and it can be reordered! */ +static __inline__ int __test_and_clear_bit(int nr, volatile void * addr) +{ + int oldbit; + + __asm__( + "btrl %2,%1\n\tsbbl %0,%0" + :"=r" (oldbit),"=m" (ADDR) :"Ir" (nr)); return oldbit; } @@ -94,7 +127,7 @@ __asm__ __volatile__( LOCK_PREFIX "btcl %2,%1\n\tsbbl %0,%0" :"=r" (oldbit),"=m" (ADDR) - :"Ir" (nr)); + :"Ir" (nr) : "memory"); return oldbit; } @@ -219,15 +252,15 @@ #ifdef __KERNEL__ -#define ext2_set_bit test_and_set_bit -#define ext2_clear_bit test_and_clear_bit +#define ext2_set_bit __test_and_set_bit +#define ext2_clear_bit __test_and_clear_bit #define ext2_test_bit test_bit #define ext2_find_first_zero_bit find_first_zero_bit #define ext2_find_next_zero_bit find_next_zero_bit /* Bitmap functions for the minix filesystem. */ -#define minix_set_bit(nr,addr) test_and_set_bit(nr,addr) -#define minix_clear_bit(nr,addr) test_and_clear_bit(nr,addr) +#define minix_set_bit(nr,addr) __test_and_set_bit(nr,addr) +#define minix_clear_bit(nr,addr) __test_and_clear_bit(nr,addr) #define minix_test_bit(nr,addr) test_bit(nr,addr) #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size)