14eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells#ifndef _ASM_SCORE_CMPXCHG_H 24eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells#define _ASM_SCORE_CMPXCHG_H 34eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells 44eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells#include <linux/irqflags.h> 54eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells 64eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howellsstruct __xchg_dummy { unsigned long a[100]; }; 74eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells#define __xg(x) ((struct __xchg_dummy *)(x)) 84eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells 94eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howellsstatic inline 104eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howellsunsigned long __xchg(volatile unsigned long *m, unsigned long val) 114eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells{ 124eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells unsigned long retval; 134eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells unsigned long flags; 144eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells 154eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells local_irq_save(flags); 164eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells retval = *m; 174eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells *m = val; 184eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells local_irq_restore(flags); 194eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells return retval; 204eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells} 214eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells 224eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells#define xchg(ptr, v) \ 234eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells ((__typeof__(*(ptr))) __xchg((unsigned long *)(ptr), \ 244eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells (unsigned long)(v))) 254eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells 264eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howellsstatic inline unsigned long __cmpxchg(volatile unsigned long *m, 274eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells unsigned long old, unsigned long new) 284eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells{ 294eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells unsigned long retval; 304eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells unsigned long flags; 314eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells 324eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells local_irq_save(flags); 334eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells retval = *m; 344eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells if (retval == old) 354eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells *m = new; 364eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells local_irq_restore(flags); 374eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells return retval; 384eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells} 394eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells 404eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells#define cmpxchg(ptr, o, n) \ 414eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells ((__typeof__(*(ptr))) __cmpxchg((unsigned long *)(ptr), \ 424eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells (unsigned long)(o), \ 434eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells (unsigned long)(n))) 444eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells 454eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells#define __HAVE_ARCH_CMPXCHG 1 464eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells 474eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells#include <asm-generic/cmpxchg-local.h> 484eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells 494eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells#endif /* _ASM_SCORE_CMPXCHG_H */ 50