diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7e6094c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*~ +obj/ +bin/ diff --git a/code/lab5/libs/atomic.h b/code/lab5/libs/atomic.h index 958be2e..e8f317b 100644 --- a/code/lab5/libs/atomic.h +++ b/code/lab5/libs/atomic.h @@ -53,5 +53,29 @@ test_bit(int nr, volatile void *addr) { 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__ */