Skip to content

Commit 614fe8a

Browse files
committed
Add memory barrier for aarch64
1 parent 9b37fb2 commit 614fe8a

File tree

2 files changed

+14
-8
lines changed

2 files changed

+14
-8
lines changed

seqlock/seqlock.c

+14-8
Original file line numberDiff line numberDiff line change
@@ -10,37 +10,43 @@
1010

1111
#define SEQLOCK_WRITER 1U
1212

13-
#if defined(__i386__) || defined(__x86_64__) || defined(__aarch64__)
13+
#if defined(__i386__) || defined(__x86_64__)
1414
#define spin_wait() atomic_thread_fence(memory_order_seq_cst)
15+
#elif defined(__aarch64__)
16+
#define spin_wait() __asm__ __volatile__("isb\n")
1517
#else
1618
#define spin_wait() ((void) 0)
1719
#endif
1820

21+
#if defined(__aarch64__)
1922
#define SEVL() sevl()
2023
static inline void sevl(void)
2124
{
22-
atomic_thread_fence(memory_order_seq_cst);
25+
__asm__ volatile("sevl" : : :);
2326
}
2427
#define WFE() wfe()
2528
static inline int wfe(void)
2629
{
27-
atomic_thread_fence(memory_order_seq_cst);
30+
__asm__ volatile("wfe" : : : "memory");
2831
return 1;
2932
}
3033
#define LDX(a, b) ldx((a), (b))
31-
static inline uint32_t ldx(const _Atomic uint32_t *var, int mm)
34+
static inline uint32_t ldx(const uint8_t *var, int mm)
3235
{
3336
uint32_t old;
34-
3537
if (mm == memory_order_acquire)
36-
old = atomic_load_explicit(var, memory_order_acquire);
38+
__asm volatile("ldaxrb %w0, [%1]" : "=&r"(old) : "r"(var) : "memory");
3739
else if (mm == memory_order_relaxed)
38-
old = atomic_load_explicit(var, memory_order_relaxed);
40+
__asm volatile("ldxrb %w0, [%1]" : "=&r"(old) : "r"(var) : "memory");
3941
else
4042
abort();
41-
4243
return old;
4344
}
45+
#else /* generic */
46+
#define SEVL() (void) 0
47+
#define WFE() 1
48+
#define LDX(a, b) atomic_load_explicit((a), (b))
49+
#endif
4450

4551
#define UNLIKELY(x) __builtin_expect(!!(x), 0)
4652

seqlock/tests

15.8 KB
Binary file not shown.

0 commit comments

Comments
 (0)