|
@ -53,5 +53,29 @@ test_bit(int nr, volatile void *addr) { |
|
|
return oldbit != 0; |
|
|
return oldbit != 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* * |
|
|
|
|
|
* test_and_set_bit - Atomically set a bit and return its old value |
|
|
|
|
|
* @nr: the bit to set |
|
|
|
|
|
* @addr: the address to count from |
|
|
|
|
|
* */ |
|
|
|
|
|
static inline bool |
|
|
|
|
|
test_and_set_bit(int nr, volatile void *addr) { |
|
|
|
|
|
int oldbit; |
|
|
|
|
|
asm volatile ("btsl %2, %1; sbbl %0, %0" : "=r" (oldbit), "=m" (*(volatile long *)addr) : "Ir" (nr) : "memory"); |
|
|
|
|
|
return oldbit != 0; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* * |
|
|
|
|
|
* test_and_clear_bit - Atomically clear a bit and return its old value |
|
|
|
|
|
* @nr: the bit to clear |
|
|
|
|
|
* @addr: the address to count from |
|
|
|
|
|
* */ |
|
|
|
|
|
static inline bool |
|
|
|
|
|
test_and_clear_bit(int nr, volatile void *addr) { |
|
|
|
|
|
int oldbit; |
|
|
|
|
|
asm volatile ("btrl %2, %1; sbbl %0, %0" : "=r" (oldbit), "=m" (*(volatile long *)addr) : "Ir" (nr) : "memory"); |
|
|
|
|
|
return oldbit != 0; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
#endif /* !__LIBS_ATOMIC_H__ */ |
|
|
#endif /* !__LIBS_ATOMIC_H__ */ |
|
|
|
|
|
|