diff options
Diffstat (limited to 'arch/alpha/include/asm/cmpxchg.h')
| -rw-r--r-- | arch/alpha/include/asm/cmpxchg.h | 71 | 
1 files changed, 71 insertions, 0 deletions
diff --git a/arch/alpha/include/asm/cmpxchg.h b/arch/alpha/include/asm/cmpxchg.h new file mode 100644 index 00000000000..429e8cd0d78 --- /dev/null +++ b/arch/alpha/include/asm/cmpxchg.h @@ -0,0 +1,71 @@ +#ifndef _ALPHA_CMPXCHG_H +#define _ALPHA_CMPXCHG_H + +/* + * Atomic exchange routines. + */ + +#define __ASM__MB +#define ____xchg(type, args...)		__xchg ## type ## _local(args) +#define ____cmpxchg(type, args...)	__cmpxchg ## type ## _local(args) +#include <asm/xchg.h> + +#define xchg_local(ptr, x)						\ +({									\ +	__typeof__(*(ptr)) _x_ = (x);					\ +	(__typeof__(*(ptr))) __xchg_local((ptr), (unsigned long)_x_,	\ +				       sizeof(*(ptr)));			\ +}) + +#define cmpxchg_local(ptr, o, n)					\ +({									\ +	__typeof__(*(ptr)) _o_ = (o);					\ +	__typeof__(*(ptr)) _n_ = (n);					\ +	(__typeof__(*(ptr))) __cmpxchg_local((ptr), (unsigned long)_o_,	\ +					  (unsigned long)_n_,		\ +					  sizeof(*(ptr)));		\ +}) + +#define cmpxchg64_local(ptr, o, n)					\ +({									\ +	BUILD_BUG_ON(sizeof(*(ptr)) != 8);				\ +	cmpxchg_local((ptr), (o), (n));					\ +}) + +#ifdef CONFIG_SMP +#undef __ASM__MB +#define __ASM__MB	"\tmb\n" +#endif +#undef ____xchg +#undef ____cmpxchg +#define ____xchg(type, args...)		__xchg ##type(args) +#define ____cmpxchg(type, args...)	__cmpxchg ##type(args) +#include <asm/xchg.h> + +#define xchg(ptr, x)							\ +({									\ +	__typeof__(*(ptr)) _x_ = (x);					\ +	(__typeof__(*(ptr))) __xchg((ptr), (unsigned long)_x_,		\ +				 sizeof(*(ptr)));			\ +}) + +#define cmpxchg(ptr, o, n)						\ +({									\ +	__typeof__(*(ptr)) _o_ = (o);					\ +	__typeof__(*(ptr)) _n_ = (n);					\ +	(__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_,	\ +				    (unsigned long)_n_,	sizeof(*(ptr)));\ +}) + +#define cmpxchg64(ptr, o, n)						\ +({									\ +	BUILD_BUG_ON(sizeof(*(ptr)) != 8);				\ +	cmpxchg((ptr), (o), (n));					\ +}) + +#undef __ASM__MB +#undef ____cmpxchg + +#define __HAVE_ARCH_CMPXCHG 1 + +#endif /* _ALPHA_CMPXCHG_H */  |