diff options
Diffstat (limited to 'arch/powerpc/include/asm/bitops.h')
| -rw-r--r-- | arch/powerpc/include/asm/bitops.h | 56 | 
1 files changed, 30 insertions, 26 deletions
diff --git a/arch/powerpc/include/asm/bitops.h b/arch/powerpc/include/asm/bitops.h index 56f2f2ea563..30964ae2d09 100644 --- a/arch/powerpc/include/asm/bitops.h +++ b/arch/powerpc/include/asm/bitops.h @@ -65,7 +65,7 @@ static __inline__ void fn(unsigned long mask,	\  	unsigned long *p = (unsigned long *)_p;	\  	__asm__ __volatile__ (			\  	prefix					\ -"1:"	PPC_LLARX "%0,0,%3\n"			\ +"1:"	PPC_LLARX(%0,0,%3,0) "\n"		\  	stringify_in_c(op) "%0,%0,%2\n"		\  	PPC405_ERR77(0,%3)			\  	PPC_STLCX "%0,0,%3\n"			\ @@ -78,7 +78,7 @@ static __inline__ void fn(unsigned long mask,	\  DEFINE_BITOP(set_bits, or, "", "")  DEFINE_BITOP(clear_bits, andc, "", "") -DEFINE_BITOP(clear_bits_unlock, andc, LWSYNC_ON_SMP, "") +DEFINE_BITOP(clear_bits_unlock, andc, PPC_RELEASE_BARRIER, "")  DEFINE_BITOP(change_bits, xor, "", "")  static __inline__ void set_bit(int nr, volatile unsigned long *addr) @@ -103,31 +103,35 @@ static __inline__ void change_bit(int nr, volatile unsigned long *addr)  /* Like DEFINE_BITOP(), with changes to the arguments to 'op' and the output   * operands. */ -#define DEFINE_TESTOP(fn, op, prefix, postfix)	\ -static __inline__ unsigned long fn(		\ -		unsigned long mask,		\ -		volatile unsigned long *_p)	\ -{						\ -	unsigned long old, t;			\ -	unsigned long *p = (unsigned long *)_p;	\ -	__asm__ __volatile__ (			\ -	prefix					\ -"1:"	PPC_LLARX "%0,0,%3\n"			\ -	stringify_in_c(op) "%1,%0,%2\n"		\ -	PPC405_ERR77(0,%3)			\ -	PPC_STLCX "%1,0,%3\n"			\ -	"bne- 1b\n"				\ -	postfix					\ -	: "=&r" (old), "=&r" (t)		\ -	: "r" (mask), "r" (p)			\ -	: "cc", "memory");			\ -	return (old & mask);			\ +#define DEFINE_TESTOP(fn, op, prefix, postfix, eh)	\ +static __inline__ unsigned long fn(			\ +		unsigned long mask,			\ +		volatile unsigned long *_p)		\ +{							\ +	unsigned long old, t;				\ +	unsigned long *p = (unsigned long *)_p;		\ +	__asm__ __volatile__ (				\ +	prefix						\ +"1:"	PPC_LLARX(%0,0,%3,eh) "\n"			\ +	stringify_in_c(op) "%1,%0,%2\n"			\ +	PPC405_ERR77(0,%3)				\ +	PPC_STLCX "%1,0,%3\n"				\ +	"bne- 1b\n"					\ +	postfix						\ +	: "=&r" (old), "=&r" (t)			\ +	: "r" (mask), "r" (p)				\ +	: "cc", "memory");				\ +	return (old & mask);				\  } -DEFINE_TESTOP(test_and_set_bits, or, LWSYNC_ON_SMP, ISYNC_ON_SMP) -DEFINE_TESTOP(test_and_set_bits_lock, or, "", ISYNC_ON_SMP) -DEFINE_TESTOP(test_and_clear_bits, andc, LWSYNC_ON_SMP, ISYNC_ON_SMP) -DEFINE_TESTOP(test_and_change_bits, xor, LWSYNC_ON_SMP, ISYNC_ON_SMP) +DEFINE_TESTOP(test_and_set_bits, or, PPC_RELEASE_BARRIER, +	      PPC_ACQUIRE_BARRIER, 0) +DEFINE_TESTOP(test_and_set_bits_lock, or, "", +	      PPC_ACQUIRE_BARRIER, 1) +DEFINE_TESTOP(test_and_clear_bits, andc, PPC_RELEASE_BARRIER, +	      PPC_ACQUIRE_BARRIER, 0) +DEFINE_TESTOP(test_and_change_bits, xor, PPC_RELEASE_BARRIER, +	      PPC_ACQUIRE_BARRIER, 0)  static __inline__ int test_and_set_bit(unsigned long nr,  				       volatile unsigned long *addr) @@ -158,7 +162,7 @@ static __inline__ int test_and_change_bit(unsigned long nr,  static __inline__ void __clear_bit_unlock(int nr, volatile unsigned long *addr)  { -	__asm__ __volatile__(LWSYNC_ON_SMP "" ::: "memory"); +	__asm__ __volatile__(PPC_RELEASE_BARRIER "" ::: "memory");  	__clear_bit(nr, addr);  }  |