Put atomic_cmpset_int() into central place. This function was defined and
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Tue, 16 May 2006 12:34:15 +0000 (12:34 +0000)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Tue, 16 May 2006 12:34:15 +0000 (12:34 +0000)
used in many places.

Reviewed-by: dillon
OK: davidxu

lib/libthread_xu/arch/i386/include/pthread_md.h
sys/cpu/i386/include/atomic.h
sys/dev/drm/drm_os_freebsd.h
sys/i386/include/atomic.h

index 9e470a3..c9c692b 100644 (file)
@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/arch/i386/include/pthread_md.h,v 1.13 2004/11/06 03:35:51 peter Exp $
- * $DragonFly: src/lib/libthread_xu/arch/i386/include/pthread_md.h,v 1.5 2005/03/29 19:26:20 joerg Exp $
+ * $DragonFly: src/lib/libthread_xu/arch/i386/include/pthread_md.h,v 1.6 2006/05/16 12:34:15 sephe Exp $
  */
 
 /*
 
 struct pthread;
 
-static __inline int
-atomic_cmpset_int(volatile int *dst, int exp, int src)
-{
-       int res = exp;
-
-       __asm __volatile (
-       "       lock cmpxchgl %1,%2 ;   "
-       "       setz    %%al ;          "
-       "       movzbl  %%al,%0 ;       "
-       "1:                             "
-       "# atomic_cmpset_int"
-       : "+a" (res)                    /* 0 (result) */
-       : "r" (src),                    /* 1 */
-         "m" (*(dst))                  /* 2 */
-       : "memory");                             
-
-       return (res);
-}
-
 #define atomic_cmpset_acq_int  atomic_cmpset_int
 
 /*
index 87f3dce..174cd0e 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/include/atomic.h,v 1.9.2.1 2000/07/07 00:38:47 obrien Exp $
- * $DragonFly: src/sys/cpu/i386/include/atomic.h,v 1.15 2005/10/13 00:02:46 dillon Exp $
+ * $DragonFly: src/sys/cpu/i386/include/atomic.h,v 1.16 2006/05/16 12:34:15 sephe Exp $
  */
 #ifndef _MACHINE_ATOMIC_H_
 #define _MACHINE_ATOMIC_H_
@@ -339,4 +339,29 @@ atomic_intr_cond_exit(atomic_intr_t *p, void (*func)(void *), void *arg)
 
 #endif
 
+/*
+ * Atomic compare and set
+ *
+ * if (*dst == exp) *dst = src (all 32 bit words)
+ *
+ * Returns 0 on failure, non-zero on success
+ */
+#if defined(KLD_MODULE)
+extern int atomic_cmpset_int(volatile u_int *dst, u_int exp, u_int src);
+#else
+static __inline int
+atomic_cmpset_int(volatile u_int *dst, u_int exp, u_int src)
+{
+       int res = exp;
+
+       __asm __volatile(MPLOCKED "cmpxchgl %2,%1; " \
+                        "setz %%al; " \
+                        "movzbl %%al,%0; " \
+                        : "+a" (res), "=m" (*dst) \
+                        : "r" (src), "m" (*dst) \
+                        : "memory");
+       return res;
+}
+#endif /* KLD_MODULE */
+
 #endif /* ! _MACHINE_ATOMIC_H_ */
index a607ef8..6568382 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * $FreeBSD: src/sys/dev/drm/drm_os_freebsd.h,v 1.10.2.1 2003/04/26 07:05:28 anholt Exp $
- * $DragonFly: src/sys/dev/drm/Attic/drm_os_freebsd.h,v 1.15 2006/05/05 20:15:01 dillon Exp $
+ * $DragonFly: src/sys/dev/drm/Attic/drm_os_freebsd.h,v 1.16 2006/05/16 12:34:15 sephe Exp $
  */
 #include <sys/param.h>
 #include <sys/queue.h>
@@ -248,29 +248,6 @@ typedef u_int8_t u8;
 
 /* Fake this */
 
-#if defined(__DragonFly__) || __FreeBSD_version < 500000
-/* The extra atomic functions from 5.0 haven't been merged to 4.x */
-static __inline int
-atomic_cmpset_int(volatile u_int *dst, u_int exp, u_int src)
-{
-       int res = exp;
-
-       __asm __volatile (
-       "       lock ;                  "
-       "       cmpxchgl %1,%2 ;        "
-       "       setz    %%al ;          "
-       "       movzbl  %%al,%0 ;       "
-       "1:                             "
-       "# atomic_cmpset_int"
-       : "+a" (res)                    /* 0 (result) */
-       : "r" (src),                    /* 1 */
-         "m" (*(dst))                  /* 2 */
-       : "memory");                             
-
-       return (res);
-}
-#endif
-
 static __inline atomic_t
 test_and_set_bit(int b, volatile void *p)
 {
index e4d8d42..213e961 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/include/atomic.h,v 1.9.2.1 2000/07/07 00:38:47 obrien Exp $
- * $DragonFly: src/sys/i386/include/Attic/atomic.h,v 1.15 2005/10/13 00:02:46 dillon Exp $
+ * $DragonFly: src/sys/i386/include/Attic/atomic.h,v 1.16 2006/05/16 12:34:15 sephe Exp $
  */
 #ifndef _MACHINE_ATOMIC_H_
 #define _MACHINE_ATOMIC_H_
@@ -339,4 +339,29 @@ atomic_intr_cond_exit(atomic_intr_t *p, void (*func)(void *), void *arg)
 
 #endif
 
+/*
+ * Atomic compare and set
+ *
+ * if (*dst == exp) *dst = src (all 32 bit words)
+ *
+ * Returns 0 on failure, non-zero on success
+ */
+#if defined(KLD_MODULE)
+extern int atomic_cmpset_int(volatile u_int *dst, u_int exp, u_int src);
+#else
+static __inline int
+atomic_cmpset_int(volatile u_int *dst, u_int exp, u_int src)
+{
+       int res = exp;
+
+       __asm __volatile(MPLOCKED "cmpxchgl %2,%1; " \
+                        "setz %%al; " \
+                        "movzbl %%al,%0; " \
+                        : "+a" (res), "=m" (*dst) \
+                        : "r" (src), "m" (*dst) \
+                        : "memory");
+       return res;
+}
+#endif /* KLD_MODULE */
+
 #endif /* ! _MACHINE_ATOMIC_H_ */