diff options
| author | zhangyan <[email protected]> | 2024-09-04 06:14:06 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-09-03 18:14:06 -0400 |
| commit | a4882e1d40769b4b6e809277d2732af898570de2 (patch) | |
| tree | 60858aca43ca907397d34f4ece05ac133e5110c0 /libcpu | |
| parent | 635e16a8d54db94c878a4bfc624cc4c38f0b8a35 (diff) | |
[libcpu/aarch64]修改atomic实现
Diffstat (limited to 'libcpu')
| -rw-r--r-- | libcpu/aarch64/common/atomic_aarch64.c | 12 |
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; } + |
