svn commit: r357458 - head/sys/arm64/include
Mark Johnston
markj at FreeBSD.org
Mon Feb 3 18:23:15 UTC 2020
Author: markj
Date: Mon Feb 3 18:23:14 2020
New Revision: 357458
URL: https://svnweb.freebsd.org/changeset/base/357458
Log:
Add wrappers for arm64 atomics.
Add a _llsc suffix for the existing LL/SC-based implementations and add
trivial wrappers. This is in preparation for supporting LSE-based
atomic(9) implementations.
No functional change intended.
Reviewed by: andrew, kib
MFC after: 1 month
Sponsored by: The FreeBSD Foundation, Amazon (hardware)
Differential Revision: https://reviews.freebsd.org/D23323
Modified:
head/sys/arm64/include/atomic.h
Modified: head/sys/arm64/include/atomic.h
==============================================================================
--- head/sys/arm64/include/atomic.h Mon Feb 3 18:22:59 2020 (r357457)
+++ head/sys/arm64/include/atomic.h Mon Feb 3 18:23:14 2020 (r357458)
@@ -59,9 +59,12 @@
#include <sys/atomic_common.h>
-#define _ATOMIC_OP_IMPL(t, w, s, op, asm_op, bar, a, l) \
+#define _ATOMIC_OP_PROTO(t, op, bar, flav) \
static __inline void \
-atomic_##op##_##bar##t(volatile uint##t##_t *p, uint##t##_t val) \
+atomic_##op##_##bar##t##flav(volatile uint##t##_t *p, uint##t##_t val)
+
+#define _ATOMIC_OP_IMPL(t, w, s, op, asm_op, bar, a, l) \
+_ATOMIC_OP_PROTO(t, op, bar, _llsc) \
{ \
uint##t##_t tmp; \
int res; \
@@ -75,6 +78,11 @@ atomic_##op##_##bar##t(volatile uint##t##_t *p, uint##
: "r" (p), "r" (val) \
: "memory" \
); \
+} \
+ \
+_ATOMIC_OP_PROTO(t, op, bar, ) \
+{ \
+ atomic_##op##_##bar##t##_llsc(p, val); \
}
#define __ATOMIC_OP(op, asm_op, bar, a, l) \
@@ -93,10 +101,18 @@ _ATOMIC_OP(clear, bic)
_ATOMIC_OP(set, orr)
_ATOMIC_OP(subtract, sub)
-#define _ATOMIC_CMPSET_IMPL(t, w, s, bar, a, l) \
+#define _ATOMIC_CMPSET_PROTO(t, bar, flav) \
static __inline int \
-atomic_cmpset_##bar##t(volatile uint##t##_t *p, uint##t##_t cmpval, \
- uint##t##_t newval) \
+atomic_cmpset_##bar##t##flav(volatile uint##t##_t *p, \
+ uint##t##_t cmpval, uint##t##_t newval)
+
+#define _ATOMIC_FCMPSET_PROTO(t, bar, flav) \
+static __inline int \
+atomic_fcmpset_##bar##t##flav(volatile uint##t##_t *p, \
+ uint##t##_t *cmpval, uint##t##_t newval)
+
+#define _ATOMIC_CMPSET_IMPL(t, w, s, bar, a, l) \
+_ATOMIC_CMPSET_PROTO(t, bar, _llsc) \
{ \
uint##t##_t tmp; \
int res; \
@@ -117,10 +133,13 @@ atomic_cmpset_##bar##t(volatile uint##t##_t *p, uint##
return (!res); \
} \
\
-static __inline int \
-atomic_fcmpset_##bar##t(volatile uint##t##_t *p, uint##t##_t *cmpval, \
- uint##t##_t newval) \
+_ATOMIC_CMPSET_PROTO(t, bar, ) \
{ \
+ return (atomic_cmpset_##bar##t##_llsc(p, cmpval, newval)); \
+} \
+ \
+_ATOMIC_FCMPSET_PROTO(t, bar, _llsc) \
+{ \
uint##t##_t _cmpval, tmp; \
int res; \
\
@@ -139,6 +158,11 @@ atomic_fcmpset_##bar##t(volatile uint##t##_t *p, uint#
*cmpval = tmp; \
\
return (!res); \
+} \
+ \
+_ATOMIC_FCMPSET_PROTO(t, bar, ) \
+{ \
+ return (atomic_fcmpset_##bar##t##_llsc(p, cmpval, newval)); \
}
#define _ATOMIC_CMPSET(bar, a, l) \
@@ -151,9 +175,12 @@ _ATOMIC_CMPSET( , , )
_ATOMIC_CMPSET(acq_, a, )
_ATOMIC_CMPSET(rel_, ,l)
-#define _ATOMIC_FETCHADD_IMPL(t, w) \
+#define _ATOMIC_FETCHADD_PROTO(t, flav) \
static __inline uint##t##_t \
-atomic_fetchadd_##t(volatile uint##t##_t *p, uint##t##_t val) \
+atomic_fetchadd_##t##flav(volatile uint##t##_t *p, uint##t##_t val)
+
+#define _ATOMIC_FETCHADD_IMPL(t, w) \
+_ATOMIC_FETCHADD_PROTO(t, _llsc) \
{ \
uint##t##_t tmp, ret; \
int res; \
@@ -169,14 +196,26 @@ atomic_fetchadd_##t(volatile uint##t##_t *p, uint##t##
); \
\
return (ret); \
+} \
+ \
+_ATOMIC_FETCHADD_PROTO(t, ) \
+{ \
+ return (atomic_fetchadd_##t##_llsc(p, val)); \
}
_ATOMIC_FETCHADD_IMPL(32, w)
_ATOMIC_FETCHADD_IMPL(64, )
-#define _ATOMIC_SWAP_IMPL(t, w, zreg) \
+#define _ATOMIC_SWAP_PROTO(t, flav) \
static __inline uint##t##_t \
-atomic_swap_##t(volatile uint##t##_t *p, uint##t##_t val) \
+atomic_swap_##t##flav(volatile uint##t##_t *p, uint##t##_t val)
+
+#define _ATOMIC_READANDCLEAR_PROTO(t, flav) \
+static __inline uint##t##_t \
+atomic_readandclear_##t##flav(volatile uint##t##_t *p)
+
+#define _ATOMIC_SWAP_IMPL(t, w, zreg) \
+_ATOMIC_SWAP_PROTO(t, _llsc) \
{ \
uint##t##_t ret; \
int res; \
@@ -193,9 +232,13 @@ atomic_swap_##t(volatile uint##t##_t *p, uint##t##_t v
return (ret); \
} \
\
-static __inline uint##t##_t \
-atomic_readandclear_##t(volatile uint##t##_t *p) \
+_ATOMIC_SWAP_PROTO(t, ) \
{ \
+ return (atomic_swap_##t##_llsc(p, val)); \
+} \
+ \
+_ATOMIC_READANDCLEAR_PROTO(t, _llsc) \
+{ \
uint##t##_t ret; \
int res; \
\
@@ -209,14 +252,22 @@ atomic_readandclear_##t(volatile uint##t##_t *p) \
); \
\
return (ret); \
+} \
+ \
+_ATOMIC_READANDCLEAR_PROTO(t, ) \
+{ \
+ return (atomic_readandclear_##t##_llsc(p)); \
}
_ATOMIC_SWAP_IMPL(32, w, wzr)
_ATOMIC_SWAP_IMPL(64, , xzr)
-#define _ATOMIC_TEST_OP_IMPL(t, w, op, asm_op) \
+#define _ATOMIC_TEST_OP_PROTO(t, op, flav) \
static __inline int \
-atomic_testand##op##_##t(volatile uint##t##_t *p, u_int val) \
+atomic_testand##op##_##t##flav(volatile uint##t##_t *p, u_int val)
+
+#define _ATOMIC_TEST_OP_IMPL(t, w, op, asm_op) \
+_ATOMIC_TEST_OP_PROTO(t, op, _llsc) \
{ \
uint##t##_t mask, old, tmp; \
int res; \
@@ -233,6 +284,11 @@ atomic_testand##op##_##t(volatile uint##t##_t *p, u_in
); \
\
return ((old & mask) != 0); \
+} \
+ \
+_ATOMIC_TEST_OP_PROTO(t, op, ) \
+{ \
+ return (atomic_testand##op##_##t##_llsc(p, val)); \
}
#define _ATOMIC_TEST_OP(op, asm_op) \
@@ -389,5 +445,4 @@ atomic_thread_fence_seq_cst(void)
}
#endif /* KCSAN && !KCSAN_RUNTIME */
-
#endif /* _MACHINE_ATOMIC_H_ */
More information about the svn-src-head
mailing list