From 70ffc3e2e690f2b7bcea456f49206b636420ef5f Mon Sep 17 00:00:00 2001 From: Xiang W Date: Tue, 6 Apr 2021 11:34:38 +0800 Subject: lib: sbi: fix atomic_add_return The unsigned length may be 4 bytes or 8 bytes, amoadd.w only applies to 4 bytes hence this patch. Signed-off-by: Xiang W Reviewed-by: Anup Patel --- lib/sbi/riscv_atomic.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/lib/sbi/riscv_atomic.c b/lib/sbi/riscv_atomic.c index 558bca8..528686f 100644 --- a/lib/sbi/riscv_atomic.c +++ b/lib/sbi/riscv_atomic.c @@ -28,25 +28,23 @@ void atomic_write(atomic_t *atom, long value) long atomic_add_return(atomic_t *atom, long value) { long ret; - +#if __SIZEOF_LONG__ == 4 __asm__ __volatile__(" amoadd.w.aqrl %1, %2, %0" : "+A"(atom->counter), "=r"(ret) : "r"(value) : "memory"); - +#elif __SIZEOF_LONG__ == 8 + __asm__ __volatile__(" amoadd.d.aqrl %1, %2, %0" + : "+A"(atom->counter), "=r"(ret) + : "r"(value) + : "memory"); +#endif return ret + value; } long atomic_sub_return(atomic_t *atom, long value) { - long ret; - - __asm__ __volatile__(" amoadd.w.aqrl %1, %2, %0" - : "+A"(atom->counter), "=r"(ret) - : "r"(-value) - : "memory"); - - return ret - value; + return atomic_add_return(atom, -value); } #define __axchg(ptr, new, size) \ -- cgit v1.2.3