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 #define xchg(ptr, x) \ 42 ({ \ 43 __typeof__(*(ptr)) _x_ = (x); \ 44 (__typeof__(*(ptr))) __xchg((ptr), (unsigned long)_x_, \ 45 sizeof(*(ptr))); \ 46 }) 47 48 #define cmpxchg(ptr, o, n) \ 49 ({ \ 50 __typeof__(*(ptr)) _o_ = (o); \ 51 __typeof__(*(ptr)) _n_ = (n); \ 52 (__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_, \ 53 (unsigned long)_n_, sizeof(*(ptr)));\ 54 }) 55 56 #define cmpxchg64(ptr, o, n) \ 57 ({ \ 58 BUILD_BUG_ON(sizeof(*(ptr)) != 8); \ 59 cmpxchg((ptr), (o), (n)); \ 60 }) 61 62 #undef ____cmpxchg 63 64 #endif /* _ALPHA_CMPXCHG_H */ 65