1 #ifndef _ASM_POWERPC_CMPXCHG_H_
2 #define _ASM_POWERPC_CMPXCHG_H_
5 #include <linux/compiler.h>
7 #include <asm/asm-compat.h>
16 __xchg_u32(
volatile void *
p,
unsigned long val)
27 :
"=&r" (prev),
"+m" (*(
volatile unsigned int *)p)
41 __xchg_u32_local(
volatile void *p,
unsigned long val)
50 :
"=&r" (prev),
"+m" (*(
volatile unsigned int *)p)
59 __xchg_u64(
volatile void *p,
unsigned long val)
70 :
"=&r" (prev),
"+m" (*(
volatile unsigned long *)p)
78 __xchg_u64_local(
volatile void *p,
unsigned long val)
87 :
"=&r" (prev),
"+m" (*(
volatile unsigned long *)p)
106 return __xchg_u32(ptr, x);
117 __xchg_local(
volatile void *ptr,
unsigned long x,
unsigned int size)
121 return __xchg_u32_local(ptr, x);
124 return __xchg_u64_local(ptr, x);
130 #define xchg(ptr,x) \
132 __typeof__(*(ptr)) _x_ = (x); \
133 (__typeof__(*(ptr))) __xchg((ptr), (unsigned long)_x_, sizeof(*(ptr))); \
136 #define xchg_local(ptr,x) \
138 __typeof__(*(ptr)) _x_ = (x); \
139 (__typeof__(*(ptr))) __xchg_local((ptr), \
140 (unsigned long)_x_, sizeof(*(ptr))); \
147 #define __HAVE_ARCH_CMPXCHG 1
150 __cmpxchg_u32(
volatile unsigned int *p,
unsigned long old,
unsigned long new)
156 "1: lwarx %0,0,%2 # __cmpxchg_u32\n\
165 :
"=&r" (prev),
"+m" (*p)
166 :
"r" (p),
"r" (old),
"r" (
new)
173 __cmpxchg_u32_local(
volatile unsigned int *p,
unsigned long old,
179 "1: lwarx %0,0,%2 # __cmpxchg_u32\n\
187 :
"=&r" (prev),
"+m" (*p)
188 :
"r" (p),
"r" (old),
"r" (
new)
196 __cmpxchg_u64(
volatile unsigned long *p,
unsigned long old,
unsigned long new)
202 "1: ldarx %0,0,%2 # __cmpxchg_u64\n\
210 :
"=&r" (prev),
"+m" (*p)
211 :
"r" (p),
"r" (old),
"r" (
new)
218 __cmpxchg_u64_local(
volatile unsigned long *p,
unsigned long old,
224 "1: ldarx %0,0,%2 # __cmpxchg_u64\n\
231 :
"=&r" (prev),
"+m" (*p)
232 :
"r" (p),
"r" (old),
"r" (
new)
244 __cmpxchg(
volatile void *ptr,
unsigned long old,
unsigned long new,
260 __cmpxchg_local(
volatile void *ptr,
unsigned long old,
unsigned long new,
265 return __cmpxchg_u32_local(ptr, old,
new);
268 return __cmpxchg_u64_local(ptr, old,
new);
275 #define cmpxchg(ptr, o, n) \
277 __typeof__(*(ptr)) _o_ = (o); \
278 __typeof__(*(ptr)) _n_ = (n); \
279 (__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_, \
280 (unsigned long)_n_, sizeof(*(ptr))); \
284 #define cmpxchg_local(ptr, o, n) \
286 __typeof__(*(ptr)) _o_ = (o); \
287 __typeof__(*(ptr)) _n_ = (n); \
288 (__typeof__(*(ptr))) __cmpxchg_local((ptr), (unsigned long)_o_, \
289 (unsigned long)_n_, sizeof(*(ptr))); \
293 #define cmpxchg64(ptr, o, n) \
295 BUILD_BUG_ON(sizeof(*(ptr)) != 8); \
296 cmpxchg((ptr), (o), (n)); \
298 #define cmpxchg64_local(ptr, o, n) \
300 BUILD_BUG_ON(sizeof(*(ptr)) != 8); \
301 cmpxchg_local((ptr), (o), (n)); \
305 #define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n))