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 /arch/powerpc | |
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>
Diffstat (limited to 'arch/powerpc')
-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)) |