Replace the C atomic_cmpset_int compatibility function for -stable with the
authorEric Anholt <anholt@freebsd.org>
Sat, 26 Apr 2003 06:53:22 +0000 (06:53 +0000)
committerEric Anholt <anholt@freebsd.org>
Sat, 26 Apr 2003 06:53:22 +0000 (06:53 +0000)
    real i386 atomic_cmpset_int from -current. FreeBSD-stable won't ever
    have DRM support for non-i386.

bsd-core/drm_os_freebsd.h
bsd/drm_os_freebsd.h

index 461a26c..acbd7cf 100644 (file)
@@ -249,16 +249,23 @@ typedef u_int8_t u8;
 #if __FreeBSD_version < 500000
 /* The extra atomic functions from 5.0 haven't been merged to 4.x */
 static __inline int
-atomic_cmpset_int(volatile int *dst, int old, int new)
+atomic_cmpset_int(volatile u_int *dst, u_int exp, u_int src)
 {
-       int s = splhigh();
-       if (*dst==old) {
-               *dst = new;
-               splx(s);
-               return 1;
-       }
-       splx(s);
-       return 0;
+       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
 
index 461a26c..acbd7cf 100644 (file)
@@ -249,16 +249,23 @@ typedef u_int8_t u8;
 #if __FreeBSD_version < 500000
 /* The extra atomic functions from 5.0 haven't been merged to 4.x */
 static __inline int
-atomic_cmpset_int(volatile int *dst, int old, int new)
+atomic_cmpset_int(volatile u_int *dst, u_int exp, u_int src)
 {
-       int s = splhigh();
-       if (*dst==old) {
-               *dst = new;
-               splx(s);
-               return 1;
-       }
-       splx(s);
-       return 0;
+       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