summaryrefslogtreecommitdiff
path: root/libcpu
diff options
context:
space:
mode:
authorzhangyan <[email protected]>2024-09-04 06:14:06 +0800
committerGitHub <[email protected]>2024-09-03 18:14:06 -0400
commita4882e1d40769b4b6e809277d2732af898570de2 (patch)
tree60858aca43ca907397d34f4ece05ac133e5110c0 /libcpu
parent635e16a8d54db94c878a4bfc624cc4c38f0b8a35 (diff)
[libcpu/aarch64]修改atomic实现
Diffstat (limited to 'libcpu')
-rw-r--r--libcpu/aarch64/common/atomic_aarch64.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/libcpu/aarch64/common/atomic_aarch64.c b/libcpu/aarch64/common/atomic_aarch64.c
index 4b32951613..35dd2b0399 100644
--- a/libcpu/aarch64/common/atomic_aarch64.c
+++ b/libcpu/aarch64/common/atomic_aarch64.c
@@ -90,7 +90,6 @@ rt_atomic_t rt_hw_atomic_flag_test_and_set(volatile rt_atomic_t *ptr)
rt_atomic_t rt_hw_atomic_compare_exchange_strong(volatile rt_atomic_t *ptr, rt_atomic_t *old, rt_atomic_t new)
{
rt_atomic_t tmp, oldval;
-
__asm__ volatile (
" prfm pstl1strm, %2\n"
"1: ldxr %0, %2\n"
@@ -99,10 +98,15 @@ rt_atomic_t rt_hw_atomic_compare_exchange_strong(volatile rt_atomic_t *ptr, rt_a
" stlxr %w1, %4, %2\n"
" cbnz %w1, 1b\n"
" dmb ish\n"
- "2:"
+ " mov %w1, #1\n"
+ " b 3f\n"
+ "2: str %0, [%5]\n"
+ " mov %w1, #0\n"
+ "3:"
: "=&r" (oldval), "=&r" (tmp), "+Q" (*ptr)
- : "Kr" (*old), "r" (new)
+ : "Kr" (*old), "r" (new), "r" (old)
: "memory");
- return oldval == *old;
+ return tmp;
}
+