add sync_core primitive
[urcu.git] / arch_x86.h
index e899684b56ddc50b9c43b506e6cb3ccdd6f254d0..e7d945e3859393edece5eb4b2aee4c99538083e2 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 #include <compiler.h>
+#include <arch_atomic.h>
 
 /* Assume P4 or newer */
 #define CONFIG_HAVE_FENCE 1
 /* Nop everywhere except on alpha. */
 #define smp_read_barrier_depends()
 
-/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
 static inline void rep_nop(void)
 {
-       asm volatile("rep; nop" ::: "memory");
+       asm volatile("rep; nop" : : : "memory");
 }
 
 static inline void cpu_relax(void)
@@ -94,54 +94,12 @@ static inline void cpu_relax(void)
        rep_nop();
 }
 
-#define xchg(ptr, v)   \
-       ((__typeof__(*(ptr)))__xchg((ptr), (unsigned long)(v), sizeof(*(ptr))))
-
-struct __xchg_ptr_as_array {
-       unsigned long a[100];
-};
-
-#define __xchg_ptr_as_array(x) ((struct __xchg_ptr_as_array *)(x))
-
 /*
- * xchg always implies a "lock" prefix, even on UP. See Intel documentation.
- * volatile attribute is neccessary due to xchg side effect.
- * *ptr is an output argument.
- * x is considered local, ptr is considered remote.
+ * Serialize core instruction execution. Also acts as a compiler barrier.
  */
-static inline unsigned long __xchg(volatile void *ptr, unsigned long x,
-                                  int size)
+static inline void sync_core(void)
 {
-       switch (size) {
-       case 1:
-               asm volatile("xchgb %b0,%1"
-                            : "=q" (x)
-                            : "m" (*__xchg_ptr_as_array(ptr)), "0" (x)
-                            : "memory");
-               break;
-       case 2:
-               asm volatile("xchgw %w0,%1"
-                            : "=r" (x)
-                            : "m" (*__xchg_ptr_as_array(ptr)), "0" (x)
-                            : "memory");
-               break;
-       case 4:
-               asm volatile("xchgl %k0,%1"
-                            : "=r" (x)
-                            : "m" (*__xchg_ptr_as_array(ptr)), "0" (x)
-                            : "memory");
-               break;
-#if (BITS_PER_LONG == 64)
-       case 8:
-               asm volatile("xchgq %0,%1"
-                            : "=r" (x)
-                            : "m" (*__xchg_ptr_as_array(ptr)), "0" (x)
-                            : "memory");
-               break;
-#endif
-       }
-       smp_wmc();
-       return x;
+       asm volatile("cpuid" : : : "memory", "eax", "ebx", "ecx", "edx");
 }
 
 #define rdtscll(val)                                                     \
This page took 0.023294 seconds and 4 git commands to generate.