X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=arch_x86.h;h=cc3ab012c557f38db5df6c7b5c829a13ceaf511a;hb=e7061ad2321fd7f553095c5c13319931d177494b;hp=01b5d50bde8e174cd255a4270172b48bca55e784;hpb=af02d47e5d0712e5ccde6d8f1ee89f18de798cad;p=urcu.git diff --git a/arch_x86.h b/arch_x86.h index 01b5d50..cc3ab01 100644 --- a/arch_x86.h +++ b/arch_x86.h @@ -23,13 +23,14 @@ */ #include +#include /* Assume P4 or newer */ #define CONFIG_HAVE_FENCE 1 #define CONFIG_HAVE_MEM_COHERENCY #ifndef BITS_PER_LONG -#define BITS_PER_LONG (sizeof(unsigned long) * 8) +#define BITS_PER_LONG (__SIZEOF_LONG__ * 8) #endif #ifdef CONFIG_HAVE_FENCE @@ -94,56 +95,6 @@ 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. - */ -static inline unsigned long __xchg(volatile void *ptr, unsigned long x, - int size) -{ - 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; -} - #define rdtscll(val) \ do { \ unsigned int __a, __d; \