aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorHans Petter Selasky <hselasky@FreeBSD.org>2018-12-10 13:38:13 +0000
committerHans Petter Selasky <hselasky@FreeBSD.org>2018-12-10 13:38:13 +0000
commitd7a9bfee8f10e6a787ea24581ac0db1040f409aa (patch)
treef9231031aa555f6b1b3ca58657eadf7b59fc41a5 /sys
parent98d2a76e378cf8ab6d000919be6872d77fc9448b (diff)
Notes
Diffstat (limited to 'sys')
-rw-r--r--sys/arm/include/atomic.h7
-rw-r--r--sys/mips/include/atomic.h64
-rw-r--r--sys/powerpc/include/atomic.h3
3 files changed, 74 insertions, 0 deletions
diff --git a/sys/arm/include/atomic.h b/sys/arm/include/atomic.h
index 25c663bc251c..25a764dee736 100644
--- a/sys/arm/include/atomic.h
+++ b/sys/arm/include/atomic.h
@@ -55,6 +55,13 @@
#include <machine/atomic-v4.h>
#endif /* Arch >= v6 */
+static __inline u_long
+atomic_swap_long(volatile u_long *p, u_long v)
+{
+
+ return (atomic_swap_32((volatile uint32_t *)p, v));
+}
+
#define atomic_clear_ptr atomic_clear_32
#define atomic_clear_acq_ptr atomic_clear_acq_32
#define atomic_clear_rel_ptr atomic_clear_rel_32
diff --git a/sys/mips/include/atomic.h b/sys/mips/include/atomic.h
index d299fb4a1bba..0e4681feead0 100644
--- a/sys/mips/include/atomic.h
+++ b/sys/mips/include/atomic.h
@@ -755,4 +755,68 @@ atomic_thread_fence_seq_cst(void)
#define atomic_store_rel_ptr atomic_store_rel_long
#define atomic_readandclear_ptr atomic_readandclear_long
+static __inline unsigned int
+atomic_swap_int(volatile unsigned int *ptr, const unsigned int value)
+{
+ unsigned int retval;
+
+ retval = *ptr;
+
+ while (!atomic_fcmpset_int(ptr, &retval, value))
+ ;
+ return (retval);
+}
+
+static __inline uint32_t
+atomic_swap_32(volatile uint32_t *ptr, const uint32_t value)
+{
+ uint32_t retval;
+
+ retval = *ptr;
+
+ while (!atomic_fcmpset_32(ptr, &retval, value))
+ ;
+ return (retval);
+}
+
+#if defined(__mips_n64) || defined(__mips_n32)
+static __inline uint64_t
+atomic_swap_64(volatile uint64_t *ptr, const uint64_t value)
+{
+ uint64_t retval;
+
+ retval = *ptr;
+
+ while (!atomic_fcmpset_64(ptr, &retval, value))
+ ;
+ return (retval);
+}
+#endif
+
+static __inline unsigned long
+atomic_swap_long(volatile unsigned long *ptr, const unsigned long value)
+{
+ unsigned long retval;
+
+ retval = *ptr;
+
+ while (!atomic_fcmpset_32((volatile uint32_t *)ptr,
+ (uint32_t *)&retval, value))
+ ;
+ return (retval);
+}
+
+static __inline uintptr_t
+atomic_swap_ptr(volatile uintptr_t *ptr, const uintptr_t value)
+{
+ uintptr_t retval;
+
+ retval = *ptr;
+
+ while (!atomic_fcmpset_32((volatile uint32_t *)ptr,
+ (uint32_t *)&retval, value))
+ ;
+ return (retval);
+}
+
#endif /* ! _MACHINE_ATOMIC_H_ */
diff --git a/sys/powerpc/include/atomic.h b/sys/powerpc/include/atomic.h
index c8e1e8447cc7..d379a7be8e89 100644
--- a/sys/powerpc/include/atomic.h
+++ b/sys/powerpc/include/atomic.h
@@ -852,6 +852,9 @@ atomic_swap_64(volatile u_long *p, u_long v)
#define atomic_fetchadd_64 atomic_fetchadd_long
#define atomic_swap_long atomic_swap_64
#define atomic_swap_ptr atomic_swap_64
+#else
+#define atomic_swap_long(p,v) atomic_swap_32((volatile u_int *)(p), v)
+#define atomic_swap_ptr(p,v) atomic_swap_32((volatile u_int *)(p), v)
#endif
#undef __ATOMIC_REL