diff --git a/include/sbi/riscv_atomic.h b/include/sbi/riscv_atomic.h index 3972e0b7..c5aa05e4 100644 --- a/include/sbi/riscv_atomic.h +++ b/include/sbi/riscv_atomic.h @@ -39,14 +39,14 @@ unsigned int atomic_raw_xchg_uint(volatile unsigned int *ptr, unsigned long atomic_raw_xchg_ulong(volatile unsigned long *ptr, unsigned long newval); /** - * Set a bit in an atomic variable and return the new value. + * Set a bit in an atomic variable and return the value of bit before modify. * @nr : Bit to set. * @atom: atomic variable to modify */ int atomic_set_bit(int nr, atomic_t *atom); /** - * Clear a bit in an atomic variable and return the new value. + * Clear a bit in an atomic variable and return the value of bit before modify. * @nr : Bit to set. * @atom: atomic variable to modify */ @@ -54,14 +54,14 @@ int atomic_set_bit(int nr, atomic_t *atom); int atomic_clear_bit(int nr, atomic_t *atom); /** - * Set a bit in any address and return the new value . + * Set a bit in any address and return the value of bit before modify. * @nr : Bit to set. * @addr: Address to modify */ int atomic_raw_set_bit(int nr, volatile unsigned long *addr); /** - * Clear a bit in any address and return the new value . + * Clear a bit in any address and return the value of bit before modify. * @nr : Bit to set. * @addr: Address to modify */ diff --git a/lib/sbi/riscv_atomic.c b/lib/sbi/riscv_atomic.c index a1432183..4d14bc56 100644 --- a/lib/sbi/riscv_atomic.c +++ b/lib/sbi/riscv_atomic.c @@ -124,7 +124,7 @@ unsigned long atomic_raw_xchg_ulong(volatile unsigned long *ptr, : "=r"(__res), "+A"(addr[BIT_WORD(nr)]) \ : "r"(mod(__mask)) \ : "memory"); \ - __res; \ + __res & __mask ? 1 : 0; \ }) #define __atomic_op_bit(op, mod, nr, addr) \ @@ -134,22 +134,22 @@ unsigned long atomic_raw_xchg_ulong(volatile unsigned long *ptr, #define __NOP(x) (x) #define __NOT(x) (~(x)) -inline int atomic_raw_set_bit(int nr, volatile unsigned long *addr) +int atomic_raw_set_bit(int nr, volatile unsigned long *addr) { return __atomic_op_bit(or, __NOP, nr, addr); } -inline int atomic_raw_clear_bit(int nr, volatile unsigned long *addr) +int atomic_raw_clear_bit(int nr, volatile unsigned long *addr) { return __atomic_op_bit(and, __NOT, nr, addr); } -inline int atomic_set_bit(int nr, atomic_t *atom) +int atomic_set_bit(int nr, atomic_t *atom) { return atomic_raw_set_bit(nr, (unsigned long *)&atom->counter); } -inline int atomic_clear_bit(int nr, atomic_t *atom) +int atomic_clear_bit(int nr, atomic_t *atom) { return atomic_raw_clear_bit(nr, (unsigned long *)&atom->counter); }