xref: /openbmc/linux/arch/alpha/include/asm/cmpxchg.h (revision 82e6fdd6)
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