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