svn commit: r341787 - in head/sys: arm/include mips/include powerpc/include

Hans Petter Selasky hselasky at FreeBSD.org
Mon Dec 10 13:38:15 UTC 2018


Author: hselasky
Date: Mon Dec 10 13:38:13 2018
New Revision: 341787
URL: https://svnweb.freebsd.org/changeset/base/341787

Log:
  Implement atomic_swap_xxx() for all platforms.
  
  Differential Revision:	https://reviews.freebsd.org/D18450
  Reviewed by:		kib@
  MFC after:		3 days
  Sponsored by:		Mellanox Technologies

Modified:
  head/sys/arm/include/atomic.h
  head/sys/mips/include/atomic.h
  head/sys/powerpc/include/atomic.h

Modified: head/sys/arm/include/atomic.h
==============================================================================
--- head/sys/arm/include/atomic.h	Mon Dec 10 09:45:57 2018	(r341786)
+++ head/sys/arm/include/atomic.h	Mon Dec 10 13:38:13 2018	(r341787)
@@ -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

Modified: head/sys/mips/include/atomic.h
==============================================================================
--- head/sys/mips/include/atomic.h	Mon Dec 10 09:45:57 2018	(r341786)
+++ head/sys/mips/include/atomic.h	Mon Dec 10 13:38:13 2018	(r341787)
@@ -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_ */

Modified: head/sys/powerpc/include/atomic.h
==============================================================================
--- head/sys/powerpc/include/atomic.h	Mon Dec 10 09:45:57 2018	(r341786)
+++ head/sys/powerpc/include/atomic.h	Mon Dec 10 13:38:13 2018	(r341787)
@@ -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


More information about the svn-src-head mailing list