1 #ifndef _ALPHA_CMPXCHG_H 2 #define _ALPHA_CMPXCHG_H 3 4 /* 5 * Atomic exchange routines. 6 */ 7 8 #define __ASM__MB 9 #define ____xchg(type, args...) __xchg ## type ## _local(args) 10 #define ____cmpxchg(type, args...) __cmpxchg ## type ## _local(args) 11 #include <asm/xchg.h> 12 13 #define xchg_local(ptr, x) \ 14 ({ \ 15 __typeof__(*(ptr)) _x_ = (x); \ 16 (__typeof__(*(ptr))) __xchg_local((ptr), (unsigned long)_x_, \ 17 sizeof(*(ptr))); \ 18 }) 19 20 #define cmpxchg_local(ptr, o, n) \ 21 ({ \ 22 __typeof__(*(ptr)) _o_ = (o); \ 23 __typeof__(*(ptr)) _n_ = (n); \ 24 (__typeof__(*(ptr))) __cmpxchg_local((ptr), (unsigned long)_o_, \ 25 (unsigned long)_n_, \ 26 sizeof(*(ptr))); \ 27 }) 28 29 #define cmpxchg64_local(ptr, o, n) \ 30 ({ \ 31 BUILD_BUG_ON(sizeof(*(ptr)) != 8); \ 32 cmpxchg_local((ptr), (o), (n)); \ 33 }) 34 35 #ifdef CONFIG_SMP 36 #undef __ASM__MB 37 #define __ASM__MB "\tmb\n" 38 #endif 39 #undef ____xchg 40 #undef ____cmpxchg 41 #define ____xchg(type, args...) __xchg ##type(args) 42 #define ____cmpxchg(type, args...) __cmpxchg ##type(args) 43 #include <asm/xchg.h> 44 45 #define xchg(ptr, x) \ 46 ({ \ 47 __typeof__(*(ptr)) _x_ = (x); \ 48 (__typeof__(*(ptr))) __xchg((ptr), (unsigned long)_x_, \ 49 sizeof(*(ptr))); \ 50 }) 51 52 #define cmpxchg(ptr, o, n) \ 53 ({ \ 54 __typeof__(*(ptr)) _o_ = (o); \ 55 __typeof__(*(ptr)) _n_ = (n); \ 56 (__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_, \ 57 (unsigned long)_n_, sizeof(*(ptr)));\ 58 }) 59 60 #define cmpxchg64(ptr, o, n) \ 61 ({ \ 62 BUILD_BUG_ON(sizeof(*(ptr)) != 8); \ 63 cmpxchg((ptr), (o), (n)); \ 64 }) 65 66 #undef __ASM__MB 67 #undef ____cmpxchg 68 69 #endif /* _ALPHA_CMPXCHG_H */ 70