[PATCH] lib: fix atomic_add_return
Xiang W
wxjstz at 126.com
Tue Apr 6 04:34:38 BST 2021
unsigned length may be 4 bytes or 8 bytes, amoadd.w only applies to 4 bytes,
so submit this patch
Signed-off-by: Xiang W <wxjstz at 126.com>
---
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) \
--
2.20.1
More information about the opensbi
mailing list