aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/include/asm/cmpxchg.h
diff options
context:
space:
mode:
Diffstat (limited to 'arch/s390/include/asm/cmpxchg.h')
-rw-r--r--arch/s390/include/asm/cmpxchg.h34
1 files changed, 25 insertions, 9 deletions
diff --git a/arch/s390/include/asm/cmpxchg.h b/arch/s390/include/asm/cmpxchg.h
index ebd31481f1d2..13c8b2eb6983 100644
--- a/arch/s390/include/asm/cmpxchg.h
+++ b/arch/s390/include/asm/cmpxchg.h
@@ -160,9 +160,14 @@ static inline unsigned long __cmpxchg(void *ptr, unsigned long old,
160 return old; 160 return old;
161} 161}
162 162
163#define cmpxchg(ptr, o, n) \ 163#define cmpxchg(ptr, o, n) \
164 ((__typeof__(*(ptr)))__cmpxchg((ptr), (unsigned long)(o), \ 164({ \
165 (unsigned long)(n), sizeof(*(ptr)))) 165 __typeof__(*(ptr)) __ret; \
166 __ret = (__typeof__(*(ptr))) \
167 __cmpxchg((ptr), (unsigned long)(o), (unsigned long)(n), \
168 sizeof(*(ptr))); \
169 __ret; \
170})
166 171
167#ifdef CONFIG_64BIT 172#ifdef CONFIG_64BIT
168#define cmpxchg64(ptr, o, n) \ 173#define cmpxchg64(ptr, o, n) \
@@ -184,10 +189,16 @@ static inline unsigned long long __cmpxchg64(void *ptr,
184 : "memory", "cc"); 189 : "memory", "cc");
185 return rp_old.pair; 190 return rp_old.pair;
186} 191}
187#define cmpxchg64(ptr, o, n) \ 192
188 ((__typeof__(*(ptr)))__cmpxchg64((ptr), \ 193#define cmpxchg64(ptr, o, n) \
189 (unsigned long long)(o), \ 194({ \
190 (unsigned long long)(n))) 195 __typeof__(*(ptr)) __ret; \
196 __ret = (__typeof__(*(ptr))) \
197 __cmpxchg64((ptr), \
198 (unsigned long long)(o), \
199 (unsigned long long)(n)); \
200 __ret; \
201})
191#endif /* CONFIG_64BIT */ 202#endif /* CONFIG_64BIT */
192 203
193#include <asm-generic/cmpxchg-local.h> 204#include <asm-generic/cmpxchg-local.h>
@@ -216,8 +227,13 @@ static inline unsigned long __cmpxchg_local(void *ptr,
216 * them available. 227 * them available.
217 */ 228 */
218#define cmpxchg_local(ptr, o, n) \ 229#define cmpxchg_local(ptr, o, n) \
219 ((__typeof__(*(ptr)))__cmpxchg_local((ptr), (unsigned long)(o), \ 230({ \
220 (unsigned long)(n), sizeof(*(ptr)))) 231 __typeof__(*(ptr)) __ret; \
232 __ret = (__typeof__(*(ptr))) \
233 __cmpxchg_local((ptr), (unsigned long)(o), \
234 (unsigned long)(n), sizeof(*(ptr))); \
235 __ret; \
236})
221 237
222#define cmpxchg64_local(ptr, o, n) cmpxchg64((ptr), (o), (n)) 238#define cmpxchg64_local(ptr, o, n) cmpxchg64((ptr), (o), (n))
223 239