kernel - Add atomic_readandclear_int()
authorMatthew Dillon <dillon@apollo.backplane.com>
Sun, 14 Feb 2010 23:53:28 +0000 (15:53 -0800)
committerMatthew Dillon <dillon@apollo.backplane.com>
Sun, 14 Feb 2010 23:53:28 +0000 (15:53 -0800)
* Add atomic_readandclear_int() to support if_alc and future
  uses.

sys/cpu/i386/include/atomic.h
sys/cpu/x86_64/include/atomic.h

index 0960c75..444b9c1 100644 (file)
@@ -130,6 +130,31 @@ ATOMIC_ASM(clear,    long,  "andl %1,%0", ~v)
 ATOMIC_ASM(add,             long,  "addl %1,%0",  v)
 ATOMIC_ASM(subtract, long,  "subl %1,%0",  v)
 
+#if defined(KLD_MODULE)
+
+u_int  atomic_readandclear_int(volatile u_int *addr);
+
+#else /* !KLD_MODULE */
+
+static __inline u_int
+atomic_readandclear_int(volatile u_int *addr)
+{
+       u_long res;
+
+       res = 0;
+       __asm __volatile(
+       "       xchgl   %1,%0 ;         "
+       "# atomic_readandclear_int"
+       : "+r" (res),                   /* 0 */
+         "=m" (*addr)                  /* 1 */
+       : "m" (*addr));
+
+       return (res);
+}
+
+#endif /* KLD_MODULE */
+
+
 /*
  * atomic_poll_acquire_int(P)  Returns non-zero on success, 0 if the lock
  *                             has already been acquired.
index 93bb8ba..d605fff 100644 (file)
@@ -57,6 +57,7 @@
  * atomic_add_long(P, V)       (*(u_long*)(P) += (V))
  * atomic_subtract_long(P, V)  (*(u_long*)(P) -= (V))
  * atomic_readandclear_long(P) (return (*(u_long*)(P)); *(u_long*)(P) = 0;)
+ * atomic_readandclear_int(P)  (return (*(u_int*)(P)); *(u_int*)(P) = 0;)
  */
 
 /*
@@ -132,8 +133,12 @@ ATOMIC_ASM(add,         long,  "addq %1,%0",  v)
 ATOMIC_ASM(subtract, long,  "subq %1,%0",  v)
 
 #if defined(KLD_MODULE)
+
 u_long atomic_readandclear_long(volatile u_long *addr);
+u_int  atomic_readandclear_int(volatile u_int *addr);
+
 #else /* !KLD_MODULE */
+
 static __inline u_long
 atomic_readandclear_long(volatile u_long *addr)
 {
@@ -149,6 +154,23 @@ atomic_readandclear_long(volatile u_long *addr)
 
        return (res);
 }
+
+static __inline u_int
+atomic_readandclear_int(volatile u_int *addr)
+{
+       u_long res;
+
+       res = 0;
+       __asm __volatile(
+       "       xchgl   %1,%0 ;         "
+       "# atomic_readandclear_int"
+       : "+r" (res),                   /* 0 */
+         "=m" (*addr)                  /* 1 */
+       : "m" (*addr));
+
+       return (res);
+}
+
 #endif /* KLD_MODULE */
 
 /*