diff options
| author | Anton Blanchard <anton@samba.org> | 2010-02-09 20:02:36 -0500 |
|---|---|---|
| committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2010-02-16 22:03:15 -0500 |
| commit | 864b9e6fd76489aab422bac62162f57c52e06ed8 (patch) | |
| tree | 5ba9673f295abda55a23ae33e11a75de9b8292bf | |
| parent | 4e14a4d17a8cd66ccab180d32c977091922cfbed (diff) | |
powerpc: Use lwarx/ldarx hint in bit locks
This patch implements the lwarx/ldarx hint bit for bit locks.
Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
| -rw-r--r-- | arch/powerpc/include/asm/asm-compat.h | 5 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/bitops.h | 48 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/local.h | 12 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/ppc-opcode.h | 4 |
4 files changed, 37 insertions, 32 deletions
diff --git a/arch/powerpc/include/asm/asm-compat.h b/arch/powerpc/include/asm/asm-compat.h index 8f0fe7971949..c1b475a941eb 100644 --- a/arch/powerpc/include/asm/asm-compat.h +++ b/arch/powerpc/include/asm/asm-compat.h | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | #define _ASM_POWERPC_ASM_COMPAT_H | 2 | #define _ASM_POWERPC_ASM_COMPAT_H |
| 3 | 3 | ||
| 4 | #include <asm/types.h> | 4 | #include <asm/types.h> |
| 5 | #include <asm/ppc-opcode.h> | ||
| 5 | 6 | ||
| 6 | #ifdef __ASSEMBLY__ | 7 | #ifdef __ASSEMBLY__ |
| 7 | # define stringify_in_c(...) __VA_ARGS__ | 8 | # define stringify_in_c(...) __VA_ARGS__ |
| @@ -24,7 +25,7 @@ | |||
| 24 | #define PPC_LONG stringify_in_c(.llong) | 25 | #define PPC_LONG stringify_in_c(.llong) |
| 25 | #define PPC_LONG_ALIGN stringify_in_c(.balign 8) | 26 | #define PPC_LONG_ALIGN stringify_in_c(.balign 8) |
| 26 | #define PPC_TLNEI stringify_in_c(tdnei) | 27 | #define PPC_TLNEI stringify_in_c(tdnei) |
| 27 | #define PPC_LLARX stringify_in_c(ldarx) | 28 | #define PPC_LLARX(t, a, b, eh) PPC_LDARX(t, a, b, eh) |
| 28 | #define PPC_STLCX stringify_in_c(stdcx.) | 29 | #define PPC_STLCX stringify_in_c(stdcx.) |
| 29 | #define PPC_CNTLZL stringify_in_c(cntlzd) | 30 | #define PPC_CNTLZL stringify_in_c(cntlzd) |
| 30 | 31 | ||
| @@ -46,7 +47,7 @@ | |||
| 46 | #define PPC_LONG stringify_in_c(.long) | 47 | #define PPC_LONG stringify_in_c(.long) |
| 47 | #define PPC_LONG_ALIGN stringify_in_c(.balign 4) | 48 | #define PPC_LONG_ALIGN stringify_in_c(.balign 4) |
| 48 | #define PPC_TLNEI stringify_in_c(twnei) | 49 | #define PPC_TLNEI stringify_in_c(twnei) |
| 49 | #define PPC_LLARX stringify_in_c(lwarx) | 50 | #define PPC_LLARX(t, a, b, eh) PPC_LWARX(t, a, b, eh) |
| 50 | #define PPC_STLCX stringify_in_c(stwcx.) | 51 | #define PPC_STLCX stringify_in_c(stwcx.) |
| 51 | #define PPC_CNTLZL stringify_in_c(cntlzw) | 52 | #define PPC_CNTLZL stringify_in_c(cntlzw) |
| 52 | #define PPC_MTOCRF stringify_in_c(mtcrf) | 53 | #define PPC_MTOCRF stringify_in_c(mtcrf) |
diff --git a/arch/powerpc/include/asm/bitops.h b/arch/powerpc/include/asm/bitops.h index 56f2f2ea5631..3c7c37bd92e3 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, \ | |||
| 65 | unsigned long *p = (unsigned long *)_p; \ | 65 | unsigned long *p = (unsigned long *)_p; \ |
| 66 | __asm__ __volatile__ ( \ | 66 | __asm__ __volatile__ ( \ |
| 67 | prefix \ | 67 | prefix \ |
| 68 | "1:" PPC_LLARX "%0,0,%3\n" \ | 68 | "1:" PPC_LLARX(%0,0,%3,0) "\n" \ |
| 69 | stringify_in_c(op) "%0,%0,%2\n" \ | 69 | stringify_in_c(op) "%0,%0,%2\n" \ |
| 70 | PPC405_ERR77(0,%3) \ | 70 | PPC405_ERR77(0,%3) \ |
| 71 | PPC_STLCX "%0,0,%3\n" \ | 71 | PPC_STLCX "%0,0,%3\n" \ |
| @@ -103,31 +103,31 @@ static __inline__ void change_bit(int nr, volatile unsigned long *addr) | |||
| 103 | 103 | ||
| 104 | /* Like DEFINE_BITOP(), with changes to the arguments to 'op' and the output | 104 | /* Like DEFINE_BITOP(), with changes to the arguments to 'op' and the output |
| 105 | * operands. */ | 105 | * operands. */ |
| 106 | #define DEFINE_TESTOP(fn, op, prefix, postfix) \ | 106 | #define DEFINE_TESTOP(fn, op, prefix, postfix, eh) \ |
| 107 | static __inline__ unsigned long fn( \ | 107 | static __inline__ unsigned long fn( \ |
| 108 | unsigned long mask, \ | 108 | unsigned long mask, \ |
| 109 | volatile unsigned long *_p) \ | 109 | volatile unsigned long *_p) \ |
| 110 | { \ | 110 | { \ |
| 111 | unsigned long old, t; \ | 111 | unsigned long old, t; \ |
| 112 | unsigned long *p = (unsigned long *)_p; \ | 112 | unsigned long *p = (unsigned long *)_p; \ |
| 113 | __asm__ __volatile__ ( \ | 113 | __asm__ __volatile__ ( \ |
| 114 | prefix \ | 114 | prefix \ |
| 115 | "1:" PPC_LLARX "%0,0,%3\n" \ | 115 | "1:" PPC_LLARX(%0,0,%3,eh) "\n" \ |
| 116 | stringify_in_c(op) "%1,%0,%2\n" \ | 116 | stringify_in_c(op) "%1,%0,%2\n" \ |
| 117 | PPC405_ERR77(0,%3) \ | 117 | PPC405_ERR77(0,%3) \ |
| 118 | PPC_STLCX "%1,0,%3\n" \ | 118 | PPC_STLCX "%1,0,%3\n" \ |
| 119 | "bne- 1b\n" \ | 119 | "bne- 1b\n" \ |
| 120 | postfix \ | 120 | postfix \ |
| 121 | : "=&r" (old), "=&r" (t) \ | 121 | : "=&r" (old), "=&r" (t) \ |
| 122 | : "r" (mask), "r" (p) \ | 122 | : "r" (mask), "r" (p) \ |
| 123 | : "cc", "memory"); \ | 123 | : "cc", "memory"); \ |
| 124 | return (old & mask); \ | 124 | return (old & mask); \ |
| 125 | } | 125 | } |
| 126 | 126 | ||
| 127 | DEFINE_TESTOP(test_and_set_bits, or, LWSYNC_ON_SMP, ISYNC_ON_SMP) | 127 | DEFINE_TESTOP(test_and_set_bits, or, LWSYNC_ON_SMP, ISYNC_ON_SMP, 0) |
| 128 | DEFINE_TESTOP(test_and_set_bits_lock, or, "", ISYNC_ON_SMP) | 128 | DEFINE_TESTOP(test_and_set_bits_lock, or, "", ISYNC_ON_SMP, 1) |
| 129 | DEFINE_TESTOP(test_and_clear_bits, andc, LWSYNC_ON_SMP, ISYNC_ON_SMP) | 129 | DEFINE_TESTOP(test_and_clear_bits, andc, LWSYNC_ON_SMP, ISYNC_ON_SMP, 0) |
| 130 | DEFINE_TESTOP(test_and_change_bits, xor, LWSYNC_ON_SMP, ISYNC_ON_SMP) | 130 | DEFINE_TESTOP(test_and_change_bits, xor, LWSYNC_ON_SMP, ISYNC_ON_SMP, 0) |
| 131 | 131 | ||
| 132 | static __inline__ int test_and_set_bit(unsigned long nr, | 132 | static __inline__ int test_and_set_bit(unsigned long nr, |
| 133 | volatile unsigned long *addr) | 133 | volatile unsigned long *addr) |
diff --git a/arch/powerpc/include/asm/local.h b/arch/powerpc/include/asm/local.h index 84b457a3c1bc..ce58c80e1bcf 100644 --- a/arch/powerpc/include/asm/local.h +++ b/arch/powerpc/include/asm/local.h | |||
| @@ -24,7 +24,7 @@ static __inline__ long local_add_return(long a, local_t *l) | |||
| 24 | long t; | 24 | long t; |
| 25 | 25 | ||
| 26 | __asm__ __volatile__( | 26 | __asm__ __volatile__( |
| 27 | "1:" PPC_LLARX "%0,0,%2 # local_add_return\n\ | 27 | "1:" PPC_LLARX(%0,0,%2,0) " # local_add_return\n\ |
| 28 | add %0,%1,%0\n" | 28 | add %0,%1,%0\n" |
| 29 | PPC405_ERR77(0,%2) | 29 | PPC405_ERR77(0,%2) |
| 30 | PPC_STLCX "%0,0,%2 \n\ | 30 | PPC_STLCX "%0,0,%2 \n\ |
| @@ -43,7 +43,7 @@ static __inline__ long local_sub_return(long a, local_t *l) | |||
| 43 | long t; | 43 | long t; |
| 44 | 44 | ||
| 45 | __asm__ __volatile__( | 45 | __asm__ __volatile__( |
| 46 | "1:" PPC_LLARX "%0,0,%2 # local_sub_return\n\ | 46 | "1:" PPC_LLARX(%0,0,%2,0) " # local_sub_return\n\ |
| 47 | subf %0,%1,%0\n" | 47 | subf %0,%1,%0\n" |
| 48 | PPC405_ERR77(0,%2) | 48 | PPC405_ERR77(0,%2) |
| 49 | PPC_STLCX "%0,0,%2 \n\ | 49 | PPC_STLCX "%0,0,%2 \n\ |
| @@ -60,7 +60,7 @@ static __inline__ long local_inc_return(local_t *l) | |||
| 60 | long t; | 60 | long t; |
| 61 | 61 | ||
| 62 | __asm__ __volatile__( | 62 | __asm__ __volatile__( |
| 63 | "1:" PPC_LLARX "%0,0,%1 # local_inc_return\n\ | 63 | "1:" PPC_LLARX(%0,0,%1,0) " # local_inc_return\n\ |
| 64 | addic %0,%0,1\n" | 64 | addic %0,%0,1\n" |
| 65 | PPC405_ERR77(0,%1) | 65 | PPC405_ERR77(0,%1) |
| 66 | PPC_STLCX "%0,0,%1 \n\ | 66 | PPC_STLCX "%0,0,%1 \n\ |
| @@ -87,7 +87,7 @@ static __inline__ long local_dec_return(local_t *l) | |||
| 87 | long t; | 87 | long t; |
| 88 | 88 | ||
| 89 | __asm__ __volatile__( | 89 | __asm__ __volatile__( |
| 90 | "1:" PPC_LLARX "%0,0,%1 # local_dec_return\n\ | 90 | "1:" PPC_LLARX(%0,0,%1,0) " # local_dec_return\n\ |
| 91 | addic %0,%0,-1\n" | 91 | addic %0,%0,-1\n" |
| 92 | PPC405_ERR77(0,%1) | 92 | PPC405_ERR77(0,%1) |
| 93 | PPC_STLCX "%0,0,%1\n\ | 93 | PPC_STLCX "%0,0,%1\n\ |
| @@ -117,7 +117,7 @@ static __inline__ int local_add_unless(local_t *l, long a, long u) | |||
| 117 | long t; | 117 | long t; |
| 118 | 118 | ||
| 119 | __asm__ __volatile__ ( | 119 | __asm__ __volatile__ ( |
| 120 | "1:" PPC_LLARX "%0,0,%1 # local_add_unless\n\ | 120 | "1:" PPC_LLARX(%0,0,%1,0) " # local_add_unless\n\ |
| 121 | cmpw 0,%0,%3 \n\ | 121 | cmpw 0,%0,%3 \n\ |
| 122 | beq- 2f \n\ | 122 | beq- 2f \n\ |
| 123 | add %0,%2,%0 \n" | 123 | add %0,%2,%0 \n" |
| @@ -147,7 +147,7 @@ static __inline__ long local_dec_if_positive(local_t *l) | |||
| 147 | long t; | 147 | long t; |
| 148 | 148 | ||
| 149 | __asm__ __volatile__( | 149 | __asm__ __volatile__( |
| 150 | "1:" PPC_LLARX "%0,0,%1 # local_dec_if_positive\n\ | 150 | "1:" PPC_LLARX(%0,0,%1,0) " # local_dec_if_positive\n\ |
| 151 | cmpwi %0,1\n\ | 151 | cmpwi %0,1\n\ |
| 152 | addi %0,%0,-1\n\ | 152 | addi %0,%0,-1\n\ |
| 153 | blt- 2f\n" | 153 | blt- 2f\n" |
diff --git a/arch/powerpc/include/asm/ppc-opcode.h b/arch/powerpc/include/asm/ppc-opcode.h index ecec76051184..aea714797590 100644 --- a/arch/powerpc/include/asm/ppc-opcode.h +++ b/arch/powerpc/include/asm/ppc-opcode.h | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #define PPC_INST_DCBZL 0x7c2007ec | 22 | #define PPC_INST_DCBZL 0x7c2007ec |
| 23 | #define PPC_INST_ISEL 0x7c00001e | 23 | #define PPC_INST_ISEL 0x7c00001e |
| 24 | #define PPC_INST_ISEL_MASK 0xfc00003e | 24 | #define PPC_INST_ISEL_MASK 0xfc00003e |
| 25 | #define PPC_INST_LDARX 0x7c0000a8 | ||
| 25 | #define PPC_INST_LSWI 0x7c0004aa | 26 | #define PPC_INST_LSWI 0x7c0004aa |
| 26 | #define PPC_INST_LSWX 0x7c00042a | 27 | #define PPC_INST_LSWX 0x7c00042a |
| 27 | #define PPC_INST_LWARX 0x7c000029 | 28 | #define PPC_INST_LWARX 0x7c000029 |
| @@ -75,6 +76,9 @@ | |||
| 75 | __PPC_RA(a) | __PPC_RB(b)) | 76 | __PPC_RA(a) | __PPC_RB(b)) |
| 76 | #define PPC_DCBZL(a, b) stringify_in_c(.long PPC_INST_DCBZL | \ | 77 | #define PPC_DCBZL(a, b) stringify_in_c(.long PPC_INST_DCBZL | \ |
| 77 | __PPC_RA(a) | __PPC_RB(b)) | 78 | __PPC_RA(a) | __PPC_RB(b)) |
| 79 | #define PPC_LDARX(t, a, b, eh) stringify_in_c(.long PPC_INST_LDARX | \ | ||
| 80 | __PPC_RT(t) | __PPC_RA(a) | \ | ||
| 81 | __PPC_RB(b) | __PPC_EH(eh)) | ||
| 78 | #define PPC_LWARX(t, a, b, eh) stringify_in_c(.long PPC_INST_LWARX | \ | 82 | #define PPC_LWARX(t, a, b, eh) stringify_in_c(.long PPC_INST_LWARX | \ |
| 79 | __PPC_RT(t) | __PPC_RA(a) | \ | 83 | __PPC_RT(t) | __PPC_RA(a) | \ |
| 80 | __PPC_RB(b) | __PPC_EH(eh)) | 84 | __PPC_RB(b) | __PPC_EH(eh)) |
