Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 28 Nov 2015 12:12:29 +0000 (UTC)
From:      Michal Meloun <mmel@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r291426 - head/sys/arm/include
Message-ID:  <201511281212.tASCCTnr046037@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mmel
Date: Sat Nov 28 12:12:28 2015
New Revision: 291426
URL: https://svnweb.freebsd.org/changeset/base/291426

Log:
  ARM: Implement atomic_swap_int(9). It's used in DRM2 code.
  
  Approved by:	kib (mentor)

Modified:
  head/sys/arm/include/atomic-v4.h
  head/sys/arm/include/atomic-v6.h
  head/sys/arm/include/atomic.h

Modified: head/sys/arm/include/atomic-v4.h
==============================================================================
--- head/sys/arm/include/atomic-v4.h	Sat Nov 28 12:11:44 2015	(r291425)
+++ head/sys/arm/include/atomic-v4.h	Sat Nov 28 12:12:28 2015	(r291426)
@@ -363,6 +363,13 @@ atomic_readandclear_32(volatile u_int32_
 	return (__swp(0, p));
 }
 
+static __inline uint32_t
+atomic_swap_32(volatile u_int32_t *p, u_int32_t v)
+{
+
+	return (__swp(v, p));
+}
+
 #define atomic_cmpset_rel_32	atomic_cmpset_32
 #define atomic_cmpset_acq_32	atomic_cmpset_32
 #define atomic_set_rel_32	atomic_set_32

Modified: head/sys/arm/include/atomic-v6.h
==============================================================================
--- head/sys/arm/include/atomic-v6.h	Sat Nov 28 12:11:44 2015	(r291425)
+++ head/sys/arm/include/atomic-v6.h	Sat Nov 28 12:12:28 2015	(r291426)
@@ -641,6 +641,25 @@ atomic_testandset_64(volatile uint64_t *
 	return (atomic_testandset_32(p32, v));
 }
 
+static __inline uint32_t
+atomic_swap_32(volatile uint32_t *p, uint32_t v)
+{
+	uint32_t ret, exflag;
+
+	__asm __volatile(
+	    "1: ldrex	%[ret], [%[ptr]]		\n"
+	    "   strex	%[exf], %[val], [%[ptr]]	\n"
+	    "   teq	%[exf], #0			\n"
+	    "   it	ne				\n"
+	    "   bne	1b				\n"
+	    : [ret] "=r"  (ret),
+	      [exf] "=&r" (exflag)
+	    : [val] "r"  (v),
+	      [ptr] "r"  (p)
+	    : "cc", "memory");
+	return (ret);
+}
+
 #undef ATOMIC_ACQ_REL
 #undef ATOMIC_ACQ_REL_LONG
 

Modified: head/sys/arm/include/atomic.h
==============================================================================
--- head/sys/arm/include/atomic.h	Sat Nov 28 12:11:44 2015	(r291425)
+++ head/sys/arm/include/atomic.h	Sat Nov 28 12:12:28 2015	(r291426)
@@ -109,5 +109,6 @@ atomic_store_long(volatile u_long *dst, 
 #define atomic_readandclear_int		atomic_readandclear_32
 #define atomic_load_acq_int		atomic_load_acq_32
 #define atomic_store_rel_int		atomic_store_rel_32
+#define atomic_swap_int			atomic_swap_32
 
 #endif /* _MACHINE_ATOMIC_H_ */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201511281212.tASCCTnr046037>