x86: Remove the POLL_CONSOLE hack
[akaros.git] / kern / arch / x86 / bitops.h
index c1567ec..e113e31 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _X86_BITOPS_H
-#define _X86_BITOPS_H
+#pragma once
 
 /*
  * Copyright 1992, Linus Torvalds.
@@ -7,8 +6,6 @@
  * Note: inlines with more than a single statement should be marked
  * __always_inline to avoid problems with older gcc's inlining heuristics.
  */
-// barrier? Where is that defined? 
-#define barrier()
 
 #define BIT_64(n)                      (U64_C(1) << (n))
 #define DECLARE_BITMAP(name,bits) \
@@ -29,8 +26,7 @@
 
 #define ADDR                           BITOP_ADDR(addr)
 
-/* no idea what to really do about this */
-#define LOCK_PREFIX
+#define LOCK_PREFIX "lock "
 /*
  * We do the locked ops that don't return the old value as
  * a mask operation on a byte.
@@ -91,7 +87,14 @@ static inline void __set_bit(int nr, volatile unsigned long *addr)
  * not contain a memory barrier, so if it is used for locking purposes,
  * you should call smp_mb__before_clear_bit() and/or smp_mb__after_clear_bit()
  * in order to ensure changes are visible on other processors.
- */
+ *
+ * Note from brho: I think the use of LOCK_PREFIX (assuming it is "lock")
+ * provides a memory barrier against hardware reordering accesses around the
+ * LOCK ("lock" serializes).  This lacks a cmb() (called a barrier() in Linux),
+ * which would prevent the compiler from reordering the instructions.  The
+ * above-mentioned smp_mb__before_clear_bit appears to be this cmb(), so it's
+ * not clear what the usage of "memory barrier" means exactly here and
+ * elsewhere in this file. */
 static __always_inline void
 clear_bit(int nr, volatile unsigned long *addr)
 {
@@ -116,7 +119,7 @@ clear_bit(int nr, volatile unsigned long *addr)
  */
 static inline void clear_bit_unlock(unsigned nr, volatile unsigned long *addr)
 {
-  //barrier();
+       cmb();
        clear_bit(nr, addr);
 }
 
@@ -139,12 +142,12 @@ static inline void __clear_bit(int nr, volatile unsigned long *addr)
  */
 static inline void __clear_bit_unlock(unsigned nr, volatile unsigned long *addr)
 {
-       barrier();
+       cmb();
        __clear_bit(nr, addr);
 }
 
-#define smp_mb__before_clear_bit()     barrier()
-#define smp_mb__after_clear_bit()      barrier()
+#define smp_mb__before_clear_bit()     cmb()
+#define smp_mb__after_clear_bit()      cmb()
 
 /**
  * __change_bit - Toggle a bit in memory
@@ -392,7 +395,6 @@ static inline int ffs(int x)
 {
        int r;
 
-#ifdef CONFIG_X86_64
        /*
         * AMD64 says BSFL won't clobber the dest reg if x==0; Intel64 says the
         * dest reg is undefined if x==0, but their CPU architect says its
@@ -405,16 +407,6 @@ static inline int ffs(int x)
        asm("bsfl %1,%0"
            : "=r" (r)
            : "rm" (x), "0" (-1));
-#elif defined(CONFIG_X86_CMOV)
-       asm("bsfl %1,%0\n\t"
-           "cmovzl %2,%0"
-           : "=&r" (r) : "rm" (x), "r" (-1));
-#else
-       asm("bsfl %1,%0\n\t"
-           "jnz 1f\n\t"
-           "movl $-1,%0\n"
-           "1:" : "=r" (r) : "rm" (x));
-#endif
        return r + 1;
 }
 
@@ -433,7 +425,6 @@ static inline int fls(int x)
 {
        int r;
 
-#ifdef CONFIG_X86_64
        /*
         * AMD64 says BSRL won't clobber the dest reg if x==0; Intel64 says the
         * dest reg is undefined if x==0, but their CPU architect says its
@@ -446,16 +437,6 @@ static inline int fls(int x)
        asm("bsrl %1,%0"
            : "=r" (r)
            : "rm" (x), "0" (-1));
-#elif defined(CONFIG_X86_CMOV)
-       asm("bsrl %1,%0\n\t"
-           "cmovzl %2,%0"
-           : "=&r" (r) : "rm" (x), "rm" (-1));
-#else
-       asm("bsrl %1,%0\n\t"
-           "jnz 1f\n\t"
-           "movl $-1,%0\n"
-           "1:" : "=r" (r) : "rm" (x));
-#endif
        return r + 1;
 }
 
@@ -470,7 +451,6 @@ static inline int fls(int x)
  * set bit if value is nonzero. The last (most significant) bit is
  * at position 64.
  */
-#ifdef CONFIG_X86_64
 static __always_inline int fls64(uint64_t x)
 {
        int bitpos = -1;
@@ -484,7 +464,3 @@ static __always_inline int fls64(uint64_t x)
            : "rm" (x));
        return bitpos + 1;
 }
-#else
-#error "Need the generic version of fls64"
-#endif
-#endif /* _ASM_X86_BITOPS_H */