svn commit: r291426 - head/sys/arm/include
Michal Meloun
mmel at FreeBSD.org
Sat Nov 28 12:12:30 UTC 2015
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_ */
More information about the svn-src-head
mailing list