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_ */
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to