1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _ALPHA_CMPXCHG_H 3 #define _ALPHA_CMPXCHG_H 4 5 /* 6 * Atomic exchange routines. 7 */ 8 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 #undef ____xchg 36 #undef ____cmpxchg 37 #define ____xchg(type, args...) __xchg ##type(args) 38 #define ____cmpxchg(type, args...) __cmpxchg ##type(args) 39 #include <asm/xchg.h> 40 41 /* 42 * The leading and the trailing memory barriers guarantee that these 43 * operations are fully ordered. 44 */ 45 #define xchg(ptr, x) \ 46 ({ \ 47 __typeof__(*(ptr)) __ret; \ 48 __typeof__(*(ptr)) _x_ = (x); \ 49 smp_mb(); \ 50 __ret = (__typeof__(*(ptr))) \ 51 __xchg((ptr), (unsigned long)_x_, sizeof(*(ptr))); \ 52 smp_mb(); \ 53 __ret; \ 54 }) 55 56 #define cmpxchg(ptr, o, n) \ 57 ({ \ 58 __typeof__(*(ptr)) __ret; \ 59 __typeof__(*(ptr)) _o_ = (o); \ 60 __typeof__(*(ptr)) _n_ = (n); \ 61 smp_mb(); \ 62 __ret = (__typeof__(*(ptr))) __cmpxchg((ptr), \ 63 (unsigned long)_o_, (unsigned long)_n_, sizeof(*(ptr)));\ 64 smp_mb(); \ 65 __ret; \ 66 }) 67 68 #define cmpxchg64(ptr, o, n) \ 69 ({ \ 70 BUILD_BUG_ON(sizeof(*(ptr)) != 8); \ 71 cmpxchg((ptr), (o), (n)); \ 72 }) 73 74 #undef ____cmpxchg 75 76 #endif /* _ALPHA_CMPXCHG_H */ 77