summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXiang W <wxjstz@126.com>2021-04-06 06:34:38 +0300
committerAnup Patel <anup@brainfault.org>2021-04-09 16:21:02 +0300
commit70ffc3e2e690f2b7bcea456f49206b636420ef5f (patch)
tree8a5adc76377e80884965fabc73457904110fb2a9
parent4d8e2f135d659697337f8d4a33fec60cd475f0dc (diff)
downloadopensbi-70ffc3e2e690f2b7bcea456f49206b636420ef5f.tar.xz
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 <wxjstz@126.com> Reviewed-by: Anup Patel <anup.patel@wdc.com>
-rw-r--r--lib/sbi/riscv_atomic.c18
1 files 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) \