powerpc: Optimise the 64bit optimised __clear_user
Subsystems (3)
PATCH 1/1 powerpc: Optimise the 64bit optimised __clear_user
I blame Mikey for this. He elevated my slightly dubious testcase:
# dd if=/dev/zero of=/dev/null bs=1M count=10000
to benchmark status. And naturally we need to be number 1 at creating zeros. So lets improve __clear_user some more.
As Paul suggests we can use dcbz for large lengths. This patch gets the destination 128 byte aligned then uses dcbz on whole cachelines.
Before:
10485760000 bytes (10 GB) copied, 0.414744 s, 25.3 GB/s
After:
10485760000 bytes (10 GB) copied, 0.268597 s, 39.0 GB/s
39 GB/s, a new record.
---
arch/powerpc/lib/string_64.S +58 -4
@@ -78,7 +78,7 @@ _GLOBAL(__clear_user) blt .Lshort_clear mr r8,r3 mtocrf 0x01,r6 - clrldi r6,r6,(64-3) + clrldi r7,r6,(64-3) /* Get the destination 8 byte aligned */ bf cr7*4+3,1f
@@ -93,11 +93,16 @@ err1; sth r0,0(r3) err1; stw r0,0(r3) addi r3,r3,4 -3: sub r4,r4,r6 - srdi r6,r4,5 +3: sub r4,r4,r7 + cmpdi r4,32 + cmpdi cr1,r4,512 blt .Lshort_clear - mtctr r6 + bgt cr1,.Llong_clear + +.Lmedium_clear: + srdi r7,r4,5 + mtctr r7 /* Do 32 byte chunks */ 4:
@@ -139,3 +144,52 @@ err1; stb r0,0(r3) 10: li r3,0 blr + +.Llong_clear: + /* Destination is 8 byte aligned, need to get it 128 byte aligned */ + bf cr7*4+0,11f +err2; std r0,0(r3) + addi r3,r3,8 + addi r4,r4,-8 + +11: srdi r6,r6,4 + mtocrf 0x01,r6 + + bf cr7*4+3,12f +err2; std r0,0(r3) +err2; std r0,8(r3) + addi r3,r3,16 + addi r4,r4,-16 + +12: bf cr7*4+2,13f +err2; std r0,0(r3) +err2; std r0,8(r3) +err2; std r0,16(r3) +err2; std r0,24(r3) + addi r3,r3,32 + addi r4,r4,-32 + +13: bf cr7*4+1,14f +err2; std r0,0(r3) +err2; std r0,8(r3) +err2; std r0,16(r3) +err2; std r0,24(r3) +err2; std r0,32(r3) +err2; std r0,40(r3) +err2; std r0,48(r3) +err2; std r0,56(r3) + addi r3,r3,64 + addi r4,r4,-64 + +14: srdi r6,r4,7 + mtctr r6 + +15: +err2; dcbz r0,r3 + addi r3,r3,128 + addi r4,r4,-128 + bdnz 15b + + cmpdi r4,32 + blt .Lshort_clear + b .Lmedium_clear
Hi,
Quoted 17 lines · Anton Blanchard
I blame Mikey for this. He elevated my slightly dubious testcase:
# dd if=3D/dev/zero of=3D/dev/null bs=3D1M count=3D10000to benchmark status. And naturally we need to be number 1 at creating zeros. So lets improve
__clear_usersome more.As Paul suggests we can use dcbz for large lengths. This patch gets the destination 128 byte aligned then uses dcbz on whole cachelines.
Before:
10485760000 bytes (10 GB) copied, 0.414744 s, 25.3 GB/sAfter:
10485760000 bytes (10 GB) copied, 0.268597 s, 39.0 GB/s
Quoted 7 lines
39 GB/s, a new record.
Signed-off-by Anton Blanchard <[email protected]>---
Index:
linux-build/arch/powerpc/lib/string_64.S=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
Quoted 1 line
---
linux-build.orig/arch/powerpc/lib/string_64.S=A0 =A0 =A0 2012-06-04 =
16:18:56.351604302 +1000
Quoted 1 line
+++
linux-build/arch/powerpc/lib/string_64.S=A0 =A02012-06-04 16:47:10.5=
38500871 +1000
Quoted 1 line
(quoted diff) +0
-0@@ -78,7 +78,7 @@ _GLOBAL(__clear_user)
[..]
Quoted 5 lines
+15:
+err2; =A0dcbz =A0 =A0r0,r3
+ =A0 =A0 =A0 addi =A0 =A0r3,r3,128
+ =A0 =A0 =A0 addi =A0 =A0r4,r4,-128
+ =A0 =A0 =A0 bdnz =A0 =A015b
This breaks architecture spec (and at least one implementation); cache lines are not guaranteed to be 128 bytes.
-Olof
Quoted 3 lines · Olof Johansson
Hi,
=20
On Mon, Jun 4, 2012 at 12:58 AM, Anton Blanchard <[email protected]> =
Quoted 16 lines · wrote:
Quoted 16 lines
=20
I blame Mikey for this. He elevated my slightly dubious testcase:
=20# dd if=3D/dev/zero of=3D/dev/null bs=3D1M count=3D10000 =20 to benchmark status. And naturally we need to be number 1 at creating zeros. So lets improve __clear_user some more. =20 As Paul suggests we can use dcbz for large lengths. This patch gets the destination 128 byte aligned then uses dcbz on whole cachelines. =20 Before: 10485760000 bytes (10 GB) copied, 0.414744 s, 25.3 GB/s =20 After: 10485760000 bytes (10 GB) copied, 0.268597 s, 39.0 GB/s
Quoted 8 lines
Quoted 8 lines
=20
39 GB/s, a new record.
=20Signed-off-by Anton Blanchard <[email protected]>---
=20
Index:linux-build/arch/powerpc/lib/string_64.S=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
Quoted 1 line
Quoted 1 line
---
linux-build.orig/arch/powerpc/lib/string_64.S2012-06-04 =
16:18:56.351604302 +1000
Quoted 1 line
Quoted 1 line
+++
linux-build/arch/powerpc/lib/string_64.S2012-06-04 =
16:47:10.538500871 +1000
Quoted 11 lines
Review _GLOBAL(__clear_user)
Quoted 1 line
(quoted diff) +0
-0@@ -78,7 +78,7 @@ _GLOBAL(__clear_user)[..]
=20arch/powerpc/lib/string_64.S err1; stb r0,0(r3) · line 191
Quoted 5 lines
arch/powerpc/lib/string_64.S +5
-0+15: +err2; dcbz r0,r3 + addi r3,r3,128 + addi r4,r4,-128 + bdnz 15b=20
This breaks architecture spec (and at least one implementation); cache lines are not guaranteed to be 128 bytes.
I'm guessing it breaks more than one (FSL 64-bit is 64byte cache lines).
- k=
PATCH 1/1 powerpc: Optimise the 64bit optimised __clear_user
In reply to Anton BlanchardI blame Mikey for this. He elevated my slightly dubious testcase:
# dd if=/dev/zero of=/dev/null bs=1M count=10000
to benchmark status. And naturally we need to be number 1 at creating zeros. So lets improve __clear_user some more.
As Paul suggests we can use dcbz for large lengths. This patch gets the destination cacheline aligned then uses dcbz on whole cachelines.
Before:
10485760000 bytes (10 GB) copied, 0.414744 s, 25.3 GB/s
After:
10485760000 bytes (10 GB) copied, 0.268597 s, 39.0 GB/s
39 GB/s, a new record.
---
v2: handle any cacheline size
arch/powerpc/lib/string_64.S +62 -1
@@ -19,6 +19,12 @@ */ #include <asm/ppc_asm.h> +#include <asm/asm-offsets.h> + + .section ".toc","aw" +PPC64_CACHES: + .tc ppc64_caches[TC],ppc64_caches + .section ".text" /** * __clear_user: - Zero a block of memory in user space, with less checking.
@@ -94,9 +100,14 @@ err1; stw r0,0(r3) addi r3,r3,4 3: sub r4,r4,r6 - srdi r6,r4,5 + cmpdi r4,32 + cmpdi cr1,r4,512 blt .Lshort_clear + bgt cr1,.Llong_clear + +.Lmedium_clear: + srdi r6,r4,5 mtctr r6 /* Do 32 byte chunks */
@@ -139,3 +150,53 @@ err1; stb r0,0(r3) 10: li r3,0 blr + +.Llong_clear: + ld r5,PPC64_CACHES@toc(r2) + + bf cr7*4+0,11f +err2; std r0,0(r3) + addi r3,r3,8 + addi r4,r4,-8 + + /* Destination is 16 byte aligned, need to get it cacheline aligned */ +11: lwz r7,DCACHEL1LOGLINESIZE(r5) + lwz r9,DCACHEL1LINESIZE(r5) + + /* + * With worst case alignment the long clear loop takes a minimum + * of 1 byte less than 2 cachelines. + */ + sldi r10,r9,2 + cmpd r4,r10 + blt .Lmedium_clear + + neg r6,r3 + addi r10,r9,-1 + and. r5,r6,r10 + beq 13f + + srdi r6,r5,4 + mtctr r6 + mr r8,r3 +12: +err1; std r0,0(r3) +err1; std r0,8(r3) + addi r3,r3,16 + bdnz 12b + + sub r4,r4,r5 + +13: srd r6,r4,r7 + mtctr r6 + mr r8,r3 +14: +err1; dcbz r0,r3 + add r3,r3,r9 + bdnz 14b + + and r4,r4,r10 + + cmpdi r4,32 + blt .Lshort_clear + b .Lmedium_clear
Quoted 1 line
+err1; dcbz r0,r3
There is no such instruction, you probably meant "dcbz 0,r3"?
Segher
Quoted 3 lines · Segher Boessenkool
Quoted 1 line
+err1; dcbz r0,r3
There is no such instruction, you probably meant "dcbz 0,r3"?
This reminds me... what would happen if we changed all our
#define r0 0
#define r1 1
etc... to:
#define r0 %r0
#define r1 %r1
?
I'm thinking it might help catch that sort of nasties (and some of them can be really nasty, such as inverting mfspr/mtspr arguments, or vs ori, etc... ). I'm sure we'd have a problem with a few macros & inline constructs but nothing we can't fix..
(Haven't tested ... still home, officially sick :-)
Cheers,
Ben.
Quoted 15 lines · Benjamin Herrenschmidt
Quoted 3 lines · Segher Boessenkool
Quoted 1 line
+err1; dcbz r0,r3
There is no such instruction, you probably meant "dcbz 0,r3"?
This reminds me... what would happen if we changed all our
#define r0 0
#define r1 1etc... to:
#define r0 %r0
#define r1 %r1
Quoted 6 lines
?
I'm thinking it might help catch that sort of nasties (and some of them can be really nasty, such as inverting mfspr/mtspr arguments, or vs ori, etc... ). I'm sure we'd have a problem with a few macros & inline constructs but nothing we can't fix..
One problem with this is when we construct the instructions, like using anything from ppc-opcode.h. eg. using PPC_POPCNTB would need to go from:
PPC_POPCNTB(r3,r3)
to:
PPC_POPCNTB(3,3) Which is less readable IMHO.
Mikey
Quoted 24 lines · Michael Neuling
Quoted 15 lines · Benjamin Herrenschmidt
Quoted 3 lines · Segher Boessenkool
Quoted 1 line
+err1; dcbz r0,r3
There is no such instruction, you probably meant "dcbz 0,r3"?
This reminds me... what would happen if we changed all our
#define r0 0
#define r1 1etc... to:
#define r0 %r0
#define r1 %r1Quoted 6 lines
?
I'm thinking it might help catch that sort of nasties (and some of them can be really nasty, such as inverting mfspr/mtspr arguments, or vs ori, etc... ). I'm sure we'd have a problem with a few macros & inline constructs but nothing we can't fix..
Quoted 5 lines
One problem with this is when we construct the instructions, like using anything from
ppc-opcode.h. eg. usingPPC_POPCNTBwould need to go from:PPC_POPCNTB(r3,r3) to: PPC_POPCNTB(3,3)
#define R(x) x
#define PPC_POPCNTB(R(3), R(3))
??
cheers
Quoted 25 lines · Michael Ellerman
Quoted 24 lines · Michael Neuling
Quoted 21 lines · Benjamin Herrenschmidt
Quoted 3 lines · Segher Boessenkool
Quoted 1 line
+err1; dcbz r0,r3
There is no such instruction, you probably meant "dcbz 0,r3"?
This reminds me... what would happen if we changed all our
#define r0 0
#define r1 1etc... to:
#define r0 %r0
#define r1 %r1?
I'm thinking it might help catch that sort of nasties (and some of them can be really nasty, such as inverting mfspr/mtspr arguments, or vs ori, etc... ). I'm sure we'd have a problem with a few macros & inline constructs but nothing we can't fix..
Quoted 7 lines
Quoted 5 lines
One problem with this is when we construct the instructions, like using anything from
ppc-opcode.h. eg. usingPPC_POPCNTBwould need to go from:PPC_POPCNTB(r3,r3) to: PPC_POPCNTB(3,3)#define R(x) x
#define R(x) (x)
Quoted 1 line
#define
PPC_POPCNTB(R(3), R(3))
Maybe, looks pretty gross but you're the maintainer! :-)
Mikey
Quoted 33 lines · Michael Neuling
Quoted 31 lines · Michael Ellerman
Quoted 29 lines · Michael Neuling
Quoted 15 lines · Benjamin Herrenschmidt
Quoted 3 lines · Segher Boessenkool
Quoted 1 line
+err1; dcbz r0,r3
There is no such instruction, you probably meant "dcbz 0,r3"?
This reminds me... what would happen if we changed all our
#define r0 0
#define r1 1etc... to:
#define r0 %r0
#define r1 %r1Quoted 6 lines
?
I'm thinking it might help catch that sort of nasties (and some of them can be really nasty, such as inverting mfspr/mtspr arguments, or vs ori, etc... ). I'm sure we'd have a problem with a few macros & inline constructs but nothing we can't fix..
One problem with this is when we construct the instructions, like using anything from
ppc-opcode.h. eg. usingPPC_POPCNTBwould need to go from:PPC_POPCNTB(r3,r3) to: PPC_POPCNTB(3,3)
Quoted 7 lines
Quoted 1 line
#define R(x) x
#define R(x) (x)
Quoted 1 line
#define
PPC_POPCNTB(R(3), R(3))Maybe, looks pretty gross but you're the maintainer! :-)
No I am not!
I agree it's fairly gross. But I'll take gross and correct over ungross and buggy.
cheers
PATCH 1/1 powerpc: Fix sldi to take literal not register name
Fix sldi to take literal not register name.
Was introduced by:
commit 19ccb76a1938ab364a412253daec64613acbf3df
Author: Paul Mackerras <[email protected]>
Date: Sat Jul 23 17:42:46 2011 +1000
---
I got sick off the bike-shedding in a vacuum and started doing the conversion. Found this as a result.
I'll post the full conversion at some point, but this fix is useful now.
arch/powerpc/kvm/book3s_hv_rmhandlers.S +1 -1
@@ -810,7 +810,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201) lwz r3,VCORE_NAPPING_THREADS(r5) lwz r4,VCPU_PTID(r9) li r0,1 - sldi r0,r0,r4 + sldi r0,r0,4 andc. r3,r3,r0 /* no sense IPI'ing ourselves */ beq 43f mulli r4,r4,PACA_SIZE /* get paca for thread 0 */
Re: [PATCH] powerpc: Fix sldi to take literal not register name
Quoted 7 lines · Michael Neuling
Fix sldi to take literal not register name.
Was introduced by:
commit19ccb76a1938ab364a412253daec64613acbf3df
Author: Paul Mackerras <[email protected]>
Date: Sat Jul 23 17:42:46 2011 +1000
Quoted 7 lines
Signed-off-by Michael Neuling <[email protected]>---
I got sick off the bike-shedding in a vacuum and started doing the conversion. Found this as a result.I'll post the full conversion at some point, but this fix is useful now.
Euh... except that:
arch/powerpc/kvm/book3s_hv_rmhandlers.S END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201) · line 813
Quoted 10 lines
arch/powerpc/kvm/book3s_hv_rmhandlers.S +1
-1@@ -810,7 +810,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201) lwz r3,VCORE_NAPPING_THREADS(r5) lwz r4,VCPU_PTID(r9) li r0,1 - sldi r0,r0,r4 + sldi r0,r0,4
Isn't the right fix s/sldi/sld and keep r4 ?
IE. I think Paul meant to shift 1 by the TID not shift 1 by 4
Cheers,
Ben.
Quoted 3 lines
arch/powerpc/kvm/book3s_hv_rmhandlers.S +0
-0andc. r3,r3,r0 /* no sense IPI'ing ourselves */ beq 43f mulli r4,r4,PACA_SIZE /* get paca for thread 0 */
Quoted 6 lines · Michael Neuling
One problem with this is when we construct the instructions, like using anything from
ppc-opcode.h. eg. usingPPC_POPCNTBwould need to go from:PPC_POPCNTB(r3,r3) to: PPC_POPCNTB(3,3)Which is less readable IMHO.
Yes, I know. Not much to do about this, but it might still be worth it, how much time wasted due to mixing up or with ori in asm somewhere ?
One option would be to #define R3 (or _r3) for use in those macros so we still have something nicer than just "3"... oh well.
Cheers,
Ben.
=20
Quoted 3 lines
-----Original Message-----
From: Linuxppc-dev=20 [mailto:[email protected]
abs.org] On Behalf Of Benjamin Herrenschmidt
Quoted 17 lines
Sent: 07 June 2012 07:40
To: Michael Neuling
Cc: [email protected]; [email protected]; Anton=20 Blanchard; [email protected]; [email protected]
Subject: Re: [PATCH] powerpc: Optimise the 64bit optimised=20__clear_user
=20
On Thu, 2012-06-07 at 16:05 +1000, Michael Neuling wrote:
=20Quoted 1 line
One problem with this is when we construct the=20
instructions, like using
Quoted 1 line
anything from
ppc-opcode.h. eg. usingPPC_POPCNTBwould=20need to go from:
Quoted 4 lines
PPC_POPCNTB(r3,r3)=20 to: PPC_POPCNTB(3,3)=20Which is less readable IMHO.
Quoted 7 lines
=20
Yes, I know. Not much to do about this, but it might still be=20 worth it,
how much time wasted due to mixing up or with ori in asm somewhere ? =20
One option would be to #define R3 (or_r3) for use in those macros so we still have something nicer than just "3"... oh well.
You then need to catch all the other bugs where a register is being used instead of a constant.
Time to make the assembler require %r0 (etc)
David
cover powerpc: convert GPR usage to %r0-31 and R0-31
In reply to Benjamin HerrenschmidtFirst 5 patches convert us to %r0-31.
Next 10 patches make using R0-31 required.
PATCH 1/15 powerpc: Add defines for R0-R31
We are going to use these later and convert r0 to %r0 etc.
---
arch/powerpc/include/asm/ppc_asm.h | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+)
arch/powerpc/include/asm/ppc_asm.h +33 -0
@@ -525,6 +525,39 @@ END_FTR_SECTION_IFCLR(CPU_FTR_601)#define r30 30#define r31 31 +#define R0 0 +#define R1 1 +#define R2 2 +#define R3 3 +#define R4 4 +#define R5 5 +#define R6 6 +#define R7 7 +#define R8 8 +#define R9 9 +#define R10 10 +#define R11 11 +#define R12 12 +#define R13 13 +#define R14 14 +#define R15 15 +#define R16 16 +#define R17 17 +#define R18 18 +#define R19 19 +#define R20 20 +#define R21 21 +#define R22 22 +#define R23 23 +#define R24 24 +#define R25 25 +#define R26 26 +#define R27 27 +#define R28 28 +#define R29 29 +#define R30 30 +#define R31 31 +/* Floating Point Registers (FPRs) */
PATCH 2/15 powerpc: modify macro ready for %r0 register change
In reply to Michael NeulingThe assembler doesn't take %r0 register arguments in braces, so remove them.
---
arch/powerpc/include/asm/ppc_asm.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
arch/powerpc/include/asm/ppc_asm.h +9 -9
@@ -295,14 +295,14 @@ n:*/ #ifdef __powerpc64__#define LOAD_REG_IMMEDIATE (reg,expr) \ - lis (reg),(expr)@highest; \ - ori (reg),(reg),(expr)@higher; \ - rldicr (reg),(reg),32,31; \ - oris (reg),(reg),(expr)@h; \ - ori (reg),(reg),(expr)@l; + lis reg,(expr)@highest; \ + ori reg,reg,(expr)@higher; \ + rldicr reg,reg,32,31; \ + oris reg,reg,(expr)@h; \ + ori reg,reg,(expr)@l;#define LOAD_REG_ADDR (reg,name) \ - ld (reg),name@got(r2) + ld reg,name@got(r2)#define LOAD_REG_ADDRBASE (reg,name) LOAD_REG_ADDR(reg,name)#define ADDROFF (name) 0
@@ -313,12 +313,12 @@ n:#else /* 32-bit */ #define LOAD_REG_IMMEDIATE (reg,expr) \ - lis (reg),(expr)@ha; \ - addi (reg),(reg),(expr)@l; + lis reg,(expr)@ha; \ + addi reg,reg,(expr)@l;#define LOAD_REG_ADDR (reg,name) LOAD_REG_IMMEDIATE(reg, name) -#define LOAD_REG_ADDRBASE (reg, name) lis (reg),name@ha +#define LOAD_REG_ADDRBASE (reg, name) lis reg,name@ha#define ADDROFF (name) name@l/* offsets for stack frame layout */
PATCH 3/15 powerpc: fix usage of register macros getting ready for %r0 change
In reply to Michael NeulingAnything that uses a constructed instruction (ie. from ppc-opcode.h), need to use the new R0 macro, as %r0 is not going to work.
Also convert usages of macros where we are just determining an offset (usually for a load/store), like:
std r14,STK_REG(r14)(r1)
Can't use STK_REG(r14) as %r14 doesn't work in the STK_REG macro since it's just calculating an offset.
---
arch/powerpc/kernel/cpu_setup_a2.S | 6 arch/powerpc/kernel/fpu.S | 4 arch/powerpc/kernel/misc_64.S | 4 arch/powerpc/kvm/book3s_hv_rmhandlers.S | 218 ++++++++++++------------- arch/powerpc/lib/checksum_64.S | 24 +- arch/powerpc/lib/copyuser_64.S | 6 arch/powerpc/lib/copyuser_power7.S | 84 ++++----- arch/powerpc/lib/hweight_64.S | 14 - arch/powerpc/lib/ldstfp.S | 12 - arch/powerpc/lib/mem_64.S | 6 arch/powerpc/lib/memcpy_64.S | 6 arch/powerpc/mm/hash_low_64.S | 148 ++++++++-------- arch/powerpc/mm/tlb_low_64e.S | 10 - arch/powerpc/mm/tlb_nohash_low.S | 6 arch/powerpc/platforms/cell/beat_hvCall.S | 26 +- arch/powerpc/platforms/powernv/opal-takeover.S | 8 arch/powerpc/platforms/powernv/opal-wrappers.S | 2 arch/powerpc/platforms/pseries/hvCall.S | 72 ++++---- 18 files changed, 328 insertions(+), 328 deletions(-)
arch/powerpc/kernel/cpu_setup_a2.S +3 -3
@@ -100,19 +100,19 @@ _icswx_skip_guest: lis r4,(MMUCR0_TLBSEL_I|MMUCR0_ECL)@h mtspr SPRN_MMUCR0, r4 li r4,A2_IERAT_SIZE-1 - PPC_ERATWE(r4,r4,3) + PPC_ERATWE(R4,R4,3) /* Now set the D-ERAT watermark to 31 */ lis r4,(MMUCR0_TLBSEL_D|MMUCR0_ECL)@h mtspr SPRN_MMUCR0, r4 li r4,A2_DERAT_SIZE-1 - PPC_ERATWE(r4,r4,3) + PPC_ERATWE(R4,R4,3) /* And invalidate the beast just in case. That won't get rid of * a bolted entry though it will be in LRU and so will go away eventually * but let's not bother for now */ - PPC_ERATILX(0,0,0) + PPC_ERATILX(0,R0,R0) 1: blr
arch/powerpc/kernel/fpu.S +2 -2
@@ -106,7 +106,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX) #endif lfd fr0,THREAD_FPSCR(r5) MTFSF_L(fr0) - REST_32FPVSRS(0, r4, r5) + REST_32FPVSRS(0, R4, R5) #ifndef CONFIG_SMP subi r4,r5,THREAD fromreal(r4)
@@ -140,7 +140,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX) addi r3,r3,THREAD /* want THREAD of task */ PPC_LL r5,PT_REGS(r3) PPC_LCMPI 0,r5,0 - SAVE_32FPVSRS(0, r4 ,r3) + SAVE_32FPVSRS(0, R4 ,R3) mffs fr0 stfd fr0,THREAD_FPSCR(r3) beq 1f
arch/powerpc/kernel/misc_64.S +2 -2
@@ -314,7 +314,7 @@ _GLOBAL(real_205_readb) mtmsrd r0 sync isync - LBZCIX(r3,0,r3) + LBZCIX(R3,0,R3) isync mtmsrd r7 sync
@@ -329,7 +329,7 @@ _GLOBAL(real_205_writeb) mtmsrd r0 sync isync - STBCIX(r3,0,r4) + STBCIX(R3,0,R4) isync mtmsrd r7 sync
arch/powerpc/kvm/book3s_hv_rmhandlers.S +109 -109
316 lines not on this page · raw message
arch/powerpc/lib/checksum_64.S +12 -12
@@ -114,9 +114,9 @@ _GLOBAL(csum_partial) mtctr r6 stdu r1,-STACKFRAMESIZE(r1) - std r14,STK_REG(r14)(r1) - std r15,STK_REG(r15)(r1) - std r16,STK_REG(r16)(r1) + std r14,STK_REG(R14)(r1) + std r15,STK_REG(R15)(r1) + std r16,STK_REG(R16)(r1) ld r6,0(r3) ld r9,8(r3)
@@ -175,9 +175,9 @@ _GLOBAL(csum_partial) adde r0,r0,r15 adde r0,r0,r16 - ld r14,STK_REG(r14)(r1) - ld r15,STK_REG(r15)(r1) - ld r16,STK_REG(r16)(r1) + ld r14,STK_REG(R14)(r1) + ld r15,STK_REG(R15)(r1) + ld r16,STK_REG(R16)(r1) addi r1,r1,STACKFRAMESIZE andi. r4,r4,63
@@ -299,9 +299,9 @@ dest; sth r6,0(r4) mtctr r6 stdu r1,-STACKFRAMESIZE(r1) - std r14,STK_REG(r14)(r1) - std r15,STK_REG(r15)(r1) - std r16,STK_REG(r16)(r1) + std r14,STK_REG(R14)(r1) + std r15,STK_REG(R15)(r1) + std r16,STK_REG(R16)(r1) source; ld r6,0(r3) source; ld r9,8(r3)
@@ -382,9 +382,9 @@ dest; std r16,56(r4) adde r0,r0,r15 adde r0,r0,r16 - ld r14,STK_REG(r14)(r1) - ld r15,STK_REG(r15)(r1) - ld r16,STK_REG(r16)(r1) + ld r14,STK_REG(R14)(r1) + ld r15,STK_REG(R15)(r1) + ld r16,STK_REG(R16)(r1) addi r1,r1,STACKFRAMESIZE andi. r5,r5,63
arch/powerpc/lib/copyuser_64.S +3 -3
@@ -30,7 +30,7 @@ _GLOBAL(__copy_tofrom_user_base) dcbt 0,r4 beq .Lcopy_page_4K andi. r6,r6,7 - PPC_MTOCRF(0x01,r5) + PPC_MTOCRF(0x01,R5) blt cr1,.Lshort_copy /* Below we want to nop out the bne if we're on a CPU that has the * CPU_FTR_UNALIGNED_LD_STD bit set and the CPU_FTR_CP_USE_DCBTZ bit
@@ -186,7 +186,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_ blr .Ldst_unaligned: - PPC_MTOCRF(0x01,r6) /* put #bytes to 8B bdry into cr7 */ + PPC_MTOCRF(0x01,R6) /* put #bytes to 8B bdry into cr7 */ subf r5,r6,r5 li r7,0 cmpldi cr1,r5,16
@@ -201,7 +201,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_ 2: bf cr7*4+1,3f 37: lwzx r0,r7,r4 83: stwx r0,r7,r3 -3: PPC_MTOCRF(0x01,r5) +3: PPC_MTOCRF(0x01,R5) add r4,r6,r4 add r3,r6,r3 b .Ldst_aligned
arch/powerpc/lib/copyuser_power7.S +42 -42
132 lines not on this page · raw message
arch/powerpc/lib/hweight_64.S +7 -7
@@ -28,7 +28,7 @@ BEGIN_FTR_SECTION nop nop FTR_SECTION_ELSE - PPC_POPCNTB(r3,r3) + PPC_POPCNTB(R3,R3) clrldi r3,r3,64-8 blr ALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB)
@@ -42,14 +42,14 @@ BEGIN_FTR_SECTION nop FTR_SECTION_ELSE BEGIN_FTR_SECTION_NESTED(50) - PPC_POPCNTB(r3,r3) + PPC_POPCNTB(R3,R3) srdi r4,r3,8 add r3,r4,r3 clrldi r3,r3,64-8 blr FTR_SECTION_ELSE_NESTED(50) clrlwi r3,r3,16 - PPC_POPCNTW(r3,r3) + PPC_POPCNTW(R3,R3) clrldi r3,r3,64-8 blr ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 50)
@@ -66,7 +66,7 @@ BEGIN_FTR_SECTION nop FTR_SECTION_ELSE BEGIN_FTR_SECTION_NESTED(51) - PPC_POPCNTB(r3,r3) + PPC_POPCNTB(R3,R3) srdi r4,r3,16 add r3,r4,r3 srdi r4,r3,8
@@ -74,7 +74,7 @@ FTR_SECTION_ELSE clrldi r3,r3,64-8 blr FTR_SECTION_ELSE_NESTED(51) - PPC_POPCNTW(r3,r3) + PPC_POPCNTW(R3,R3) clrldi r3,r3,64-8 blr ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 51)
@@ -93,7 +93,7 @@ BEGIN_FTR_SECTION nop FTR_SECTION_ELSE BEGIN_FTR_SECTION_NESTED(52) - PPC_POPCNTB(r3,r3) + PPC_POPCNTB(R3,R3) srdi r4,r3,32 add r3,r4,r3 srdi r4,r3,16
@@ -103,7 +103,7 @@ FTR_SECTION_ELSE clrldi r3,r3,64-8 blr FTR_SECTION_ELSE_NESTED(52) - PPC_POPCNTD(r3,r3) + PPC_POPCNTD(R3,R3) clrldi r3,r3,64-8 blr ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 52)
arch/powerpc/lib/ldstfp.S +6 -6
@@ -330,13 +330,13 @@ _GLOBAL(do_lxvd2x) MTMSRD(r7) isync beq cr7,1f - STXVD2X(0,r1,r8) + STXVD2X(0,R1,R8) 1: li r9,-EFAULT -2: LXVD2X(0,0,r4) +2: LXVD2X(0,0,R4) li r9,0 3: beq cr7,4f bl put_vsr - LXVD2X(0,r1,r8) + LXVD2X(0,R1,R8) 4: PPC_LL r0,STKFRM+PPC_LR_STKOFF(r1) mtlr r0 MTMSRD(r6)
@@ -358,13 +358,13 @@ _GLOBAL(do_stxvd2x) MTMSRD(r7) isync beq cr7,1f - STXVD2X(0,r1,r8) + STXVD2X(0,R1,R8) bl get_vsr 1: li r9,-EFAULT -2: STXVD2X(0,0,r4) +2: STXVD2X(0,0,R4) li r9,0 3: beq cr7,4f - LXVD2X(0,r1,r8) + LXVD2X(0,R1,R8) 4: PPC_LL r0,STKFRM+PPC_LR_STKOFF(r1) mtlr r0 MTMSRD(r6)
arch/powerpc/lib/mem_64.S +3 -3
@@ -19,7 +19,7 @@ _GLOBAL(memset) rlwimi r4,r4,16,0,15 cmplw cr1,r5,r0 /* do we get that far? */ rldimi r4,r4,32,0 - PPC_MTOCRF(1,r0) + PPC_MTOCRF(1,R0) mr r6,r3 blt cr1,8f beq+ 3f /* if already 8-byte aligned */
@@ -49,7 +49,7 @@ _GLOBAL(memset) bdnz 4b 5: srwi. r0,r5,3 clrlwi r5,r5,29 - PPC_MTOCRF(1,r0) + PPC_MTOCRF(1,R0) beq 8f bf 29,6f std r4,0(r6)
@@ -65,7 +65,7 @@ _GLOBAL(memset) std r4,0(r6) addi r6,r6,8 8: cmpwi r5,0 - PPC_MTOCRF(1,r5) + PPC_MTOCRF(1,R5) beqlr+ bf 29,9f stw r4,0(r6)
arch/powerpc/lib/memcpy_64.S +3 -3
@@ -12,7 +12,7 @@ .align 7 _GLOBAL(memcpy) std r3,48(r1) /* save destination pointer for return value */ - PPC_MTOCRF(0x01,r5) + PPC_MTOCRF(0x01,R5) cmpldi cr1,r5,16 neg r6,r3 # LS 3 bits = # bytes to 8-byte dest bdry andi. r6,r6,7
@@ -154,7 +154,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_ blr .Ldst_unaligned: - PPC_MTOCRF(0x01,r6) # put #bytes to 8B bdry into cr7 + PPC_MTOCRF(0x01,R6) # put #bytes to 8B bdry into cr7 subf r5,r6,r5 li r7,0 cmpldi cr1,r5,16
@@ -169,7 +169,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_ 2: bf cr7*4+1,3f lwzx r0,r7,r4 stwx r0,r7,r3 -3: PPC_MTOCRF(0x01,r5) +3: PPC_MTOCRF(0x01,R5) add r4,r6,r4 add r3,r6,r3 b .Ldst_aligned
arch/powerpc/mm/hash_low_64.S +74 -74
340 lines not on this page · raw message
arch/powerpc/mm/tlb_low_64e.S +5 -5
@@ -126,7 +126,7 @@ BEGIN_MMU_FTR_SECTION /* Set the TLB reservation and search for existing entry. Then load * the entry. */ - PPC_TLBSRX_DOT(0,r16) + PPC_TLBSRX_DOT(R0,R16) ldx r14,r14,r15 /* grab pgd entry */ beq normal_tlb_miss_done /* tlb exists already, bail */ MMU_FTR_SECTION_ELSE
@@ -395,7 +395,7 @@ BEGIN_MMU_FTR_SECTION /* Set the TLB reservation and search for existing entry. Then load * the entry. */ - PPC_TLBSRX_DOT(0,r16) + PPC_TLBSRX_DOT(R0,R16) ld r14,0(r10) beq normal_tlb_miss_done MMU_FTR_SECTION_ELSE
@@ -528,7 +528,7 @@ BEGIN_MMU_FTR_SECTION /* Search if we already have a TLB entry for that virtual address, and * if we do, bail out. */ - PPC_TLBSRX_DOT(0,r16) + PPC_TLBSRX_DOT(R0,R16) beq virt_page_table_tlb_miss_done END_MMU_FTR_SECTION_IFSET(MMU_FTR_USE_TLBRSRV)
@@ -779,7 +779,7 @@ htw_tlb_miss: * * MAS1:IND should be already set based on MAS4 */ - PPC_TLBSRX_DOT(0,r16) + PPC_TLBSRX_DOT(R0,R16) beq htw_tlb_miss_done /* Now, we need to walk the page tables. First check if we are in
@@ -919,7 +919,7 @@ tlb_load_linear: mtspr SPRN_MAS1,r15 /* Already somebody there ? */ - PPC_TLBSRX_DOT(0,r16) + PPC_TLBSRX_DOT(R0,R16) beq tlb_load_linear_done /* Now we build the remaining MAS. MAS0 and 2 should be fine
arch/powerpc/mm/tlb_nohash_low.S +3 -3
@@ -313,7 +313,7 @@ BEGIN_MMU_FTR_SECTION mtspr SPRN_MAS1,r4 tlbwe MMU_FTR_SECTION_ELSE - PPC_TLBILX_VA(0,r3) + PPC_TLBILX_VA(R0,R3) ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_USE_TLBILX) msync isync
@@ -364,7 +364,7 @@ _GLOBAL(_tlbil_va) beq 1f rlwimi r4,r6,MAS6_SIND_SHIFT,MAS6_SIND 1: mtspr SPRN_MAS6,r4 /* assume AS=0 for now */ - PPC_TLBILX_VA(0,r3) + PPC_TLBILX_VA(R0,R3) msync isync wrtee r10
@@ -379,7 +379,7 @@ _GLOBAL(_tlbivax_bcast) beq 1f rlwimi r4,r6,MAS6_SIND_SHIFT,MAS6_SIND 1: mtspr SPRN_MAS6,r4 /* assume AS=0 for now */ - PPC_TLBIVAX(0,r3) + PPC_TLBIVAX(R0,R3) eieio tlbsync sync
arch/powerpc/platforms/cell/beat_hvCall.S +13 -13
@@ -74,7 +74,7 @@ _GLOBAL(beat_hcall_norets8) mr r6,r7 mr r7,r8 mr r8,r9 - ld r10,STK_PARM(r10)(r1) + ld r10,STK_PARM(R10)(r1) HVSC /* invoke the hypervisor */
@@ -94,7 +94,7 @@ _GLOBAL(beat_hcall1) HCALL_INST_PRECALL - std r4,STK_PARM(r4)(r1) /* save ret buffer */ + std r4,STK_PARM(R4)(r1) /* save ret buffer */ mr r11,r3 mr r3,r5
@@ -108,7 +108,7 @@ _GLOBAL(beat_hcall1) HCALL_INST_POSTCALL - ld r12,STK_PARM(r4)(r1) + ld r12,STK_PARM(R4)(r1) std r4, 0(r12) lwz r0,8(r1)
@@ -125,7 +125,7 @@ _GLOBAL(beat_hcall2) HCALL_INST_PRECALL - std r4,STK_PARM(r4)(r1) /* save ret buffer */ + std r4,STK_PARM(R4)(r1) /* save ret buffer */ mr r11,r3 mr r3,r5
@@ -139,7 +139,7 @@ _GLOBAL(beat_hcall2) HCALL_INST_POSTCALL - ld r12,STK_PARM(r4)(r1) + ld r12,STK_PARM(R4)(r1) std r4, 0(r12) std r5, 8(r12)
@@ -157,7 +157,7 @@ _GLOBAL(beat_hcall3) HCALL_INST_PRECALL - std r4,STK_PARM(r4)(r1) /* save ret buffer */ + std r4,STK_PARM(R4)(r1) /* save ret buffer */ mr r11,r3 mr r3,r5
@@ -171,7 +171,7 @@ _GLOBAL(beat_hcall3) HCALL_INST_POSTCALL - ld r12,STK_PARM(r4)(r1) + ld r12,STK_PARM(R4)(r1) std r4, 0(r12) std r5, 8(r12) std r6, 16(r12)
@@ -190,7 +190,7 @@ _GLOBAL(beat_hcall4) HCALL_INST_PRECALL - std r4,STK_PARM(r4)(r1) /* save ret buffer */ + std r4,STK_PARM(R4)(r1) /* save ret buffer */ mr r11,r3 mr r3,r5
@@ -204,7 +204,7 @@ _GLOBAL(beat_hcall4) HCALL_INST_POSTCALL - ld r12,STK_PARM(r4)(r1) + ld r12,STK_PARM(R4)(r1) std r4, 0(r12) std r5, 8(r12) std r6, 16(r12)
@@ -224,7 +224,7 @@ _GLOBAL(beat_hcall5) HCALL_INST_PRECALL - std r4,STK_PARM(r4)(r1) /* save ret buffer */ + std r4,STK_PARM(R4)(r1) /* save ret buffer */ mr r11,r3 mr r3,r5
@@ -238,7 +238,7 @@ _GLOBAL(beat_hcall5) HCALL_INST_POSTCALL - ld r12,STK_PARM(r4)(r1) + ld r12,STK_PARM(R4)(r1) std r4, 0(r12) std r5, 8(r12) std r6, 16(r12)
@@ -259,7 +259,7 @@ _GLOBAL(beat_hcall6) HCALL_INST_PRECALL - std r4,STK_PARM(r4)(r1) /* save ret buffer */ + std r4,STK_PARM(R4)(r1) /* save ret buffer */ mr r11,r3 mr r3,r5
@@ -273,7 +273,7 @@ _GLOBAL(beat_hcall6) HCALL_INST_POSTCALL - ld r12,STK_PARM(r4)(r1) + ld r12,STK_PARM(R4)(r1) std r4, 0(r12) std r5, 8(r12) std r6, 16(r12)
arch/powerpc/platforms/powernv/opal-takeover.S +4 -4
@@ -23,14 +23,14 @@ _GLOBAL(opal_query_takeover) mfcr r0 stw r0,8(r1) - std r3,STK_PARAM(r3)(r1) - std r4,STK_PARAM(r4)(r1) + std r3,STK_PARAM(R3)(r1) + std r4,STK_PARAM(R4)(r1) li r3,H_HAL_TAKEOVER li r4,H_HAL_TAKEOVER_QUERY_MAGIC HVSC - ld r10,STK_PARAM(r3)(r1) + ld r10,STK_PARAM(R3)(r1) std r4,0(r10) - ld r10,STK_PARAM(r4)(r1) + ld r10,STK_PARAM(R4)(r1) std r5,0(r10) lwz r0,8(r1) mtcrf 0xff,r0
arch/powerpc/platforms/powernv/opal-wrappers.S +1 -1
@@ -32,7 +32,7 @@ std r12,PACASAVEDMSR(r13); \ andc r12,r12,r0; \ mtmsrd r12,1; \ - LOAD_REG_ADDR(r0,.opal_return); \ + LOAD_REG_ADDR(R0,.opal_return); \ mtlr r0; \ li r0,MSR_DR|MSR_IR; \ andc r12,r12,r0; \
arch/powerpc/platforms/pseries/hvCall.S +36 -36
160 lines not on this page · raw message
PATCH 4/15 powerpc: Fix sldi to take literal not register name
In reply to Michael NeulingWas introduced by:
commit 19ccb76a1938ab364a412253daec64613acbf3df
Author: Paul Mackerras <[email protected]>
Date: Sat Jul 23 17:42:46 2011 +1000
Talking to paulus, this shouldn't be a literal.
---
arch/powerpc/kvm/book3s_hv_rmhandlers.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/kvm/book3s_hv_rmhandlers.S +1 -1
@@ -810,7 +810,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201) lwz r3,VCORE_NAPPING_THREADS(r5) lwz r4,VCPU_PTID(r9) li r0,1 - sldi r0,r0,r4 + sld r0,r0,r4 andc. r3,r3,r0 /* no sense IPI'ing ourselves */ beq 43f mulli r4,r4,PACA_SIZE /* get paca for thread 0 */
PATCH 5/15 powerpc: convert to %r for all GPR usage
In reply to Michael NeulingNow all the fixes are in place, let's rock-n-roll!
---
arch/powerpc/include/asm/ppc_asm.h | 72 ++++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 33 deletions(-)
arch/powerpc/include/asm/ppc_asm.h +39 -33
@@ -490,40 +490,46 @@ END_FTR_SECTION_IFCLR(CPU_FTR_601)#define cr7 7 -/* General Purpose Registers (GPRs) */ +/* +* General Purpose Registers (GPRs) +* +* The lower case r0-r31 should be used in preference to the upper +* case R0-R31 as they provide more error checking in the assembler. +* Use R0-31 only when really nessesary. +*/ -#define r0 0 -#define r1 1 -#define r2 2 -#define r3 3 -#define r4 4 -#define r5 5 -#define r6 6 -#define r7 7 -#define r8 8 -#define r9 9 -#define r10 10 -#define r11 11 -#define r12 12 -#define r13 13 -#define r14 14 -#define r15 15 -#define r16 16 -#define r17 17 -#define r18 18 -#define r19 19 -#define r20 20 -#define r21 21 -#define r22 22 -#define r23 23 -#define r24 24 -#define r25 25 -#define r26 26 -#define r27 27 -#define r28 28 -#define r29 29 -#define r30 30 -#define r31 31 +#define r0 %r0 +#define r1 %r1 +#define r2 %r2 +#define r3 %r3 +#define r4 %r4 +#define r5 %r5 +#define r6 %r6 +#define r7 %r7 +#define r8 %r8 +#define r9 %r9 +#define r10 %r10 +#define r11 %r11 +#define r12 %r12 +#define r13 %r13 +#define r14 %r14 +#define r15 %r15 +#define r16 %r16 +#define r17 %r17 +#define r18 %r18 +#define r19 %r19 +#define r20 %r20 +#define r21 %r21 +#define r22 %r22 +#define r23 %r23 +#define r24 %r24 +#define r25 %r25 +#define r26 %r26 +#define r27 %r27 +#define r28 %r28 +#define r29 %r29 +#define r30 %r30 +#define r31 %r31#define R0 0#define R1 1
Re: [PATCH 5/15] powerpc: convert to %r for all GPR usage
Quoted 66 lines · Michael Neuling
arch/powerpc/include/asm/ppc_asm.h +32
-33-/* General Purpose Registers (GPRs) */ +/* +* General Purpose Registers (GPRs) +* +* The lower case r0-r31 should be used in preference to the upper +* case R0-R31 as they provide more error checking in the assembler. +* Use R0-31 only when really nessesary. +*/ -#define r0 0 -#define r1 1 -#define r2 2 -#define r3 3 -#define r4 4 -#define r5 5 -#define r6 6 -#define r7 7 -#define r8 8 -#define r9 9 -#define r10 10 -#define r11 11 -#define r12 12 -#define r13 13 -#define r14 14 -#define r15 15 -#define r16 16 -#define r17 17 -#define r18 18 -#define r19 19 -#define r20 20 -#define r21 21 -#define r22 22 -#define r23 23 -#define r24 24 -#define r25 25 -#define r26 26 -#define r27 27 -#define r28 28 -#define r29 29 -#define r30 30 -#define r31 31 +#define r0 %r0 +#define r1 %r1 +#define r2 %r2 +#define r3 %r3 +#define r4 %r4 +#define r5 %r5 +#define r6 %r6 +#define r7 %r7 +#define r8 %r8 +#define r9 %r9 +#define r10 %r10 +#define r11 %r11 +#define r12 %r12 +#define r13 %r13 +#define r14 %r14 +#define r15 %r15 +#define r16 %r16 +#define r17 %r17 +#define r18 %r18 +#define r19 %r19 +#define r20 %r20 +#define r21 %r21 +#define r22 %r22 +#define r23 %r23 +#define r24 %r24
arch/powerpc/include/asm/ppc_asm.h END_FTR_SECTION_IFCLR(CPU_FTR_601) · line 535
Quoted 10 lines
arch/powerpc/include/asm/ppc_asm.h +7
-0+#define r25 %r25 +#define r26 %r26 +#define r27 %r27 +#define r28 %r28 +#define r29 %r29 +#define r30 %r30 +#define r31 %r31#define R0 0#define R1 1
I think your patch was truncated somehow.
Quoted 5 lines
_______________________________________________
Linuxppc-dev mailing list
[email protected]
https://lists.ozlabs.org/listinfo/linuxppc-dev
Jesse Larrew
Software Engineer, Linux on Power Kernel Team
IBM Linux Technology Center
Phone: (512) 973-2052 (T/L: 363-2052)
[email protected]
Re: [PATCH 5/15] powerpc: convert to %r for all GPR usage
Quoted 77 lines · Jesse Larrew
Quoted 74 lines · Michael Neuling
arch/powerpc/include/asm/ppc_asm.h +39
-33-/* General Purpose Registers (GPRs) */ +/* +* General Purpose Registers (GPRs) +* +* The lower case r0-r31 should be used in preference to the upper +* case R0-R31 as they provide more error checking in the assembler. +* Use R0-31 only when really nessesary. +*/ -#define r0 0 -#define r1 1 -#define r2 2 -#define r3 3 -#define r4 4 -#define r5 5 -#define r6 6 -#define r7 7 -#define r8 8 -#define r9 9 -#define r10 10 -#define r11 11 -#define r12 12 -#define r13 13 -#define r14 14 -#define r15 15 -#define r16 16 -#define r17 17 -#define r18 18 -#define r19 19 -#define r20 20 -#define r21 21 -#define r22 22 -#define r23 23 -#define r24 24 -#define r25 25 -#define r26 26 -#define r27 27 -#define r28 28 -#define r29 29 -#define r30 30 -#define r31 31 +#define r0 %r0 +#define r1 %r1 +#define r2 %r2 +#define r3 %r3 +#define r4 %r4 +#define r5 %r5 +#define r6 %r6 +#define r7 %r7 +#define r8 %r8 +#define r9 %r9 +#define r10 %r10 +#define r11 %r11 +#define r12 %r12 +#define r13 %r13 +#define r14 %r14 +#define r15 %r15 +#define r16 %r16 +#define r17 %r17 +#define r18 %r18 +#define r19 %r19 +#define r20 %r20 +#define r21 %r21 +#define r22 %r22 +#define r23 %r23 +#define r24 %r24 +#define r25 %r25 +#define r26 %r26 +#define r27 %r27 +#define r28 %r28 +#define r29 %r29 +#define r30 %r30 +#define r31 %r31
Quoted 5 lines
Quoted 2 lines
#define R0 0
#define R1 1I think your patch was truncated somehow.
How so?
Mikey
Re: [PATCH 5/15] powerpc: convert to %r for all GPR usage
Quoted 13 lines · Michael Neuling
Quoted 12 lines · Jesse Larrew
Quoted 9 lines · Michael Neuling
arch/powerpc/include/asm/ppc_asm.h +7
-1-/* General Purpose Registers (GPRs) */ +/* +* General Purpose Registers (GPRs) +* +* The lower case r0-r31 should be used in preference to the upper +* case R0-R31 as they provide more error checking in the assembler. +* Use R0-31 only when really nessesary. +*/
<snip>
Quoted 11 lines
Quoted 6 lines
Quoted 3 lines
#define R0 0
#define R1 1I think your patch was truncated somehow.
How so?
Mikey
Oops. False alarm. I read the comment about the GPRs and expected to see #define statements for R2-31 as well. However, I just realized that your patch didn't actually add them. The R0 and R1 defines are just there for context. My mistake.
Jesse Larrew
Software Engineer, Linux on Power Kernel Team
IBM Linux Technology Center
Phone: (512) 973-2052 (T/L: 363-2052)
[email protected]
PATCH 6/15 powerpc/pasemi: move lbz/stbciz to ppc-opcode.h
In reply to Michael Neulingmove lbz/stbciz to ppc-opcode.h.
---
arch/powerpc/include/asm/ppc-opcode.h | 7 +++++++ arch/powerpc/kernel/misc_64.S | 5 ----- 2 files changed, 7 insertions(+), 5 deletions(-)
arch/powerpc/include/asm/ppc-opcode.h +7 -0
@@ -107,6 +107,8 @@#define PPC_INST_NEG 0x7c0000d0#define PPC_INST_BRANCH 0x48000000#define PPC_INST_BRANCH_COND 0x40800000 +#define PPC_INST_LBZCIX 0x7c0006aa +#define PPC_INST_STBCIX 0x7c0007aa/* macros to insert fields into opcodes */ #define __PPC_RA (a) (((a) & 0x1f) << 16)
@@ -186,6 +188,11 @@ __PPC_RS(t) | __PPC_RA(a) | __PPC_RB(b))#define PPC_SLBFEE_DOT (t, b) stringify_in_c(.long PPC_INST_SLBFEE | \ __PPC_RT(t) | __PPC_RB(b)) +/* PASemi instructions */ +#define LBZCIX (t,a,b) stringify_in_c(.long PPC_INST_LBZCIX | \ + __PPC_RT(t) | __PPC_RA(a) | __PPC_RB(b)) +#define STBCIX (s,a,b) stringify_in_c(.long PPC_INST_STBCIX | \ + __PPC_RS(s) | __PPC_RA(a) | __PPC_RB(b))/* * Define what the VSX XX1 form instructions will look like, then add
arch/powerpc/kernel/misc_64.S +0 -5
@@ -301,11 +301,6 @@ _GLOBAL(real_writeb) #ifdef CONFIG_PPC_PASEMI -/* No support in all binutils for these yet, so use defines */ -#define LBZCIX(RT,RA,RB) .long (0x7c0006aa|(RT<<21)|(RA<<16)|(RB << 11)) -#define STBCIX(RS,RA,RB) .long (0x7c0007aa|(RS<<21)|(RA<<16)|(RB << 11)) - - _GLOBAL(real_205_readb) mfmsr r7 ori r0,r7,MSR_DR
PATCH 7/15 powerpc: merge STK_REG/PARAM/FRAMESIZE
In reply to Michael NeulingMerge the defines of STACKFRAMESIZE, STK_REG, STK_PARAM from different places.
---
arch/powerpc/include/asm/ppc_asm.h | 5 + arch/powerpc/lib/checksum_64.S | 3 arch/powerpc/lib/copyuser_power7.S | 3 arch/powerpc/mm/hash_low_64.S | 88 +++++++++++-------------- arch/powerpc/platforms/cell/beat_hvCall.S | 28 +++---- arch/powerpc/platforms/powernv/opal-takeover.S | 2 arch/powerpc/platforms/pseries/hvCall.S | 72 +++++++++----------- 7 files changed, 93 insertions(+), 108 deletions(-)
arch/powerpc/include/asm/ppc_asm.h +5 -0
@@ -178,6 +178,11 @@ END_FW_FTR_SECTION_IFSET(FW_FEATURE_SPLP#define HMT_HIGH or 3,3,3#define HMT_EXTRA_HIGH or 7,7,7 # power7 only +#define STACKFRAMESIZE 256 +#define STK_REG (i) (112 + ((i)-14)*8) + +#define STK_PARAM (i) (48 + ((i)-3)*8) +#ifdef __KERNEL__#ifdef CONFIG_PPC64
arch/powerpc/lib/checksum_64.S +0 -3
@@ -65,9 +65,6 @@ _GLOBAL(csum_tcpudp_magic) srwi r3,r3,16 blr -#define STACKFRAMESIZE 256 -#define STK_REG(i) (112 + ((i)-14)*8) - /* * Computes the checksum of a memory block at buff, length len, * and adds in "sum" (32-bit).
arch/powerpc/lib/copyuser_power7.S +0 -3
@@ -19,9 +19,6 @@ */ #include <asm/ppc_asm.h> -#define STACKFRAMESIZE 256 -#define STK_REG(i) (112 + ((i)-14)*8) - .macro err1 100: .section __ex_table,"a"
arch/powerpc/mm/hash_low_64.S +40 -48
256 lines not on this page · raw message
arch/powerpc/platforms/cell/beat_hvCall.S +13 -15
@@ -22,8 +22,6 @@ #include <asm/ppc_asm.h> -#define STK_PARM(i) (48 + ((i)-3)*8) - /* Not implemented on Beat, now */ #define HCALL_INST_PRECALL #define HCALL_INST_POSTCALL
@@ -74,7 +72,7 @@ _GLOBAL(beat_hcall_norets8) mr r6,r7 mr r7,r8 mr r8,r9 - ld r10,STK_PARM(R10)(r1) + ld r10,STK_PARAM(R10)(r1) HVSC /* invoke the hypervisor */
@@ -94,7 +92,7 @@ _GLOBAL(beat_hcall1) HCALL_INST_PRECALL - std r4,STK_PARM(R4)(r1) /* save ret buffer */ + std r4,STK_PARAM(R4)(r1) /* save ret buffer */ mr r11,r3 mr r3,r5
@@ -108,7 +106,7 @@ _GLOBAL(beat_hcall1) HCALL_INST_POSTCALL - ld r12,STK_PARM(R4)(r1) + ld r12,STK_PARAM(R4)(r1) std r4, 0(r12) lwz r0,8(r1)
@@ -125,7 +123,7 @@ _GLOBAL(beat_hcall2) HCALL_INST_PRECALL - std r4,STK_PARM(R4)(r1) /* save ret buffer */ + std r4,STK_PARAM(R4)(r1) /* save ret buffer */ mr r11,r3 mr r3,r5
@@ -139,7 +137,7 @@ _GLOBAL(beat_hcall2) HCALL_INST_POSTCALL - ld r12,STK_PARM(R4)(r1) + ld r12,STK_PARAM(R4)(r1) std r4, 0(r12) std r5, 8(r12)
@@ -157,7 +155,7 @@ _GLOBAL(beat_hcall3) HCALL_INST_PRECALL - std r4,STK_PARM(R4)(r1) /* save ret buffer */ + std r4,STK_PARAM(R4)(r1) /* save ret buffer */ mr r11,r3 mr r3,r5
@@ -171,7 +169,7 @@ _GLOBAL(beat_hcall3) HCALL_INST_POSTCALL - ld r12,STK_PARM(R4)(r1) + ld r12,STK_PARAM(R4)(r1) std r4, 0(r12) std r5, 8(r12) std r6, 16(r12)
@@ -190,7 +188,7 @@ _GLOBAL(beat_hcall4) HCALL_INST_PRECALL - std r4,STK_PARM(R4)(r1) /* save ret buffer */ + std r4,STK_PARAM(R4)(r1) /* save ret buffer */ mr r11,r3 mr r3,r5
@@ -204,7 +202,7 @@ _GLOBAL(beat_hcall4) HCALL_INST_POSTCALL - ld r12,STK_PARM(R4)(r1) + ld r12,STK_PARAM(R4)(r1) std r4, 0(r12) std r5, 8(r12) std r6, 16(r12)
@@ -224,7 +222,7 @@ _GLOBAL(beat_hcall5) HCALL_INST_PRECALL - std r4,STK_PARM(R4)(r1) /* save ret buffer */ + std r4,STK_PARAM(R4)(r1) /* save ret buffer */ mr r11,r3 mr r3,r5
@@ -238,7 +236,7 @@ _GLOBAL(beat_hcall5) HCALL_INST_POSTCALL - ld r12,STK_PARM(R4)(r1) + ld r12,STK_PARAM(R4)(r1) std r4, 0(r12) std r5, 8(r12) std r6, 16(r12)
@@ -259,7 +257,7 @@ _GLOBAL(beat_hcall6) HCALL_INST_PRECALL - std r4,STK_PARM(R4)(r1) /* save ret buffer */ + std r4,STK_PARAM(R4)(r1) /* save ret buffer */ mr r11,r3 mr r3,r5
@@ -273,7 +271,7 @@ _GLOBAL(beat_hcall6) HCALL_INST_POSTCALL - ld r12,STK_PARM(R4)(r1) + ld r12,STK_PARAM(R4)(r1) std r4, 0(r12) std r5, 8(r12) std r6, 16(r12)
arch/powerpc/platforms/powernv/opal-takeover.S +0 -2
@@ -14,8 +14,6 @@ #include <asm/asm-offsets.h> #include <asm/opal.h> -#define STK_PARAM(i) (48 + ((i)-3)*8) - #define H_HAL_TAKEOVER 0x5124 #define H_HAL_TAKEOVER_QUERY_MAGIC -1
arch/powerpc/platforms/pseries/hvCall.S +35 -37
163 lines not on this page · raw message
PATCH 8/15 powerpc: change mtcrf to use real register names
In reply to Michael Neulingmtocrf define is just a wrapper around the real instructions so we can just use real register names here (ie. lower case).
Also remove braces in macro so this is possible.
---
arch/powerpc/include/asm/asm-compat.h | 2 +- arch/powerpc/include/asm/ppc_asm.h | 4 ++-- arch/powerpc/lib/copyuser_64.S | 6 +++--- arch/powerpc/lib/mem_64.S | 6 +++--- arch/powerpc/lib/memcpy_64.S | 6 +++--- 5 files changed, 12 insertions(+), 12 deletions(-)
arch/powerpc/include/asm/asm-compat.h +1 -1
@@ -29,7 +29,7 @@#define PPC_LLARX (t, a, b, eh) PPC_LDARX(t, a, b, eh)#define PPC_STLCX stringify_in_c(stdcx.)#define PPC_CNTLZL stringify_in_c(cntlzd) -#define PPC_MTOCRF (FXM ,RS ) MTOCRF((FXM), (RS)) +#define PPC_MTOCRF (FXM ,RS ) MTOCRF((FXM), RS)#define PPC_LR_STKOFF 16#define PPC_MIN_STKFRM 112#else /* 32-bit */
arch/powerpc/include/asm/ppc_asm.h +2 -2
@@ -377,9 +377,9 @@ END_FTR_SECTION_IFCLR(CPU_FTR_601)#ifdef CONFIG_PPC64 #define MTOCRF (FXM ,RS ) \ BEGIN_FTR_SECTION_NESTED(848); \ - mtcrf (FXM), (RS); \ + mtcrf (FXM), RS; \ FTR_SECTION_ELSE_NESTED(848); \ - mtocrf (FXM), (RS); \ + mtocrf (FXM), RS; \ ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_NOEXECUTE, 848)#endif
arch/powerpc/lib/copyuser_64.S +3 -3
@@ -30,7 +30,7 @@ _GLOBAL(__copy_tofrom_user_base) dcbt 0,r4 beq .Lcopy_page_4K andi. r6,r6,7 - PPC_MTOCRF(0x01,R5) + PPC_MTOCRF(0x01,r5) blt cr1,.Lshort_copy /* Below we want to nop out the bne if we're on a CPU that has the * CPU_FTR_UNALIGNED_LD_STD bit set and the CPU_FTR_CP_USE_DCBTZ bit
@@ -186,7 +186,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_ blr .Ldst_unaligned: - PPC_MTOCRF(0x01,R6) /* put #bytes to 8B bdry into cr7 */ + PPC_MTOCRF(0x01,r6) /* put #bytes to 8B bdry into cr7 */ subf r5,r6,r5 li r7,0 cmpldi cr1,r5,16
@@ -201,7 +201,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_ 2: bf cr7*4+1,3f 37: lwzx r0,r7,r4 83: stwx r0,r7,r3 -3: PPC_MTOCRF(0x01,R5) +3: PPC_MTOCRF(0x01,r5) add r4,r6,r4 add r3,r6,r3 b .Ldst_aligned
arch/powerpc/lib/mem_64.S +3 -3
@@ -19,7 +19,7 @@ _GLOBAL(memset) rlwimi r4,r4,16,0,15 cmplw cr1,r5,r0 /* do we get that far? */ rldimi r4,r4,32,0 - PPC_MTOCRF(1,R0) + PPC_MTOCRF(1,r0) mr r6,r3 blt cr1,8f beq+ 3f /* if already 8-byte aligned */
@@ -49,7 +49,7 @@ _GLOBAL(memset) bdnz 4b 5: srwi. r0,r5,3 clrlwi r5,r5,29 - PPC_MTOCRF(1,R0) + PPC_MTOCRF(1,r0) beq 8f bf 29,6f std r4,0(r6)
@@ -65,7 +65,7 @@ _GLOBAL(memset) std r4,0(r6) addi r6,r6,8 8: cmpwi r5,0 - PPC_MTOCRF(1,R5) + PPC_MTOCRF(1,r5) beqlr+ bf 29,9f stw r4,0(r6)
arch/powerpc/lib/memcpy_64.S +3 -3
@@ -12,7 +12,7 @@ .align 7 _GLOBAL(memcpy) std r3,48(r1) /* save destination pointer for return value */ - PPC_MTOCRF(0x01,R5) + PPC_MTOCRF(0x01,r5) cmpldi cr1,r5,16 neg r6,r3 # LS 3 bits = # bytes to 8-byte dest bdry andi. r6,r6,7
@@ -154,7 +154,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_ blr .Ldst_unaligned: - PPC_MTOCRF(0x01,R6) # put #bytes to 8B bdry into cr7 + PPC_MTOCRF(0x01,r6) # put #bytes to 8B bdry into cr7 subf r5,r6,r5 li r7,0 cmpldi cr1,r5,16
@@ -169,7 +169,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_ 2: bf cr7*4+1,3f lwzx r0,r7,r4 stwx r0,r7,r3 -3: PPC_MTOCRF(0x01,R5) +3: PPC_MTOCRF(0x01,r5) add r4,r6,r4 add r3,r6,r3 b .Ldst_aligned
PATCH 9/15 powerpc: change LOAD_REG_ADDR to use real register names
In reply to Michael NeulingLOAD_REG_ADDR define is just a wrapper around real instructions so we can just use real register names here (ie. lower case).
---
arch/powerpc/platforms/powernv/opal-wrappers.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/platforms/powernv/opal-wrappers.S +1 -1
@@ -32,7 +32,7 @@ std r12,PACASAVEDMSR(r13); \ andc r12,r12,r0; \ mtmsrd r12,1; \ - LOAD_REG_ADDR(R0,.opal_return); \ + LOAD_REG_ADDR(r0,.opal_return); \ mtlr r0; \ li r0,MSR_DR|MSR_IR; \ andc r12,r12,r0; \
PATCH 10/15 powerpc: fixes for instructions not using correct register naming
In reply to Michael NeulingThese macros are using integers where they could be using logical names since they take registers.
We are going to enforce this soon, so fix these up now.
---
arch/powerpc/kernel/exceptions-64e.S | 8 ++++---- arch/powerpc/kernel/misc_64.S | 4 ++-- arch/powerpc/lib/ldstfp.S | 4 ++-- arch/powerpc/mm/tlb_nohash_low.S | 10 +++++----- 4 files changed, 13 insertions(+), 13 deletions(-)
arch/powerpc/kernel/exceptions-64e.S +4 -4
@@ -903,7 +903,7 @@ skpinv: addi r6,r6,1 /* Increment */ bne 1b /* If not, repeat */ /* Invalidate all TLBs */ - PPC_TLBILX_ALL(0,0) + PPC_TLBILX_ALL(R0,R0) sync isync
@@ -961,7 +961,7 @@ skpinv: addi r6,r6,1 /* Increment */ tlbwe /* Invalidate TLB1 */ - PPC_TLBILX_ALL(0,0) + PPC_TLBILX_ALL(R0,R0) sync isync
@@ -1020,7 +1020,7 @@ skpinv: addi r6,r6,1 /* Increment */ tlbwe /* Invalidate TLB1 */ - PPC_TLBILX_ALL(0,0) + PPC_TLBILX_ALL(R0,R0) sync isync
@@ -1138,7 +1138,7 @@ a2_tlbinit_after_iprot_flush: tlbwe #endif /* CONFIG_PPC_EARLY_DEBUG_WSP */ - PPC_TLBILX(0,0,0) + PPC_TLBILX(0,R0,R0) sync isync
arch/powerpc/kernel/misc_64.S +2 -2
@@ -309,7 +309,7 @@ _GLOBAL(real_205_readb) mtmsrd r0 sync isync - LBZCIX(R3,0,R3) + LBZCIX(R3,R0,R3) isync mtmsrd r7 sync
@@ -324,7 +324,7 @@ _GLOBAL(real_205_writeb) mtmsrd r0 sync isync - STBCIX(R3,0,R4) + STBCIX(R3,R0,R4) isync mtmsrd r7 sync
arch/powerpc/lib/ldstfp.S +2 -2
@@ -332,7 +332,7 @@ _GLOBAL(do_lxvd2x) beq cr7,1f STXVD2X(0,R1,R8) 1: li r9,-EFAULT -2: LXVD2X(0,0,R4) +2: LXVD2X(0,R0,R4) li r9,0 3: beq cr7,4f bl put_vsr
@@ -361,7 +361,7 @@ _GLOBAL(do_stxvd2x) STXVD2X(0,R1,R8) bl get_vsr 1: li r9,-EFAULT -2: STXVD2X(0,0,R4) +2: STXVD2X(0,R0,R4) li r9,0 3: beq cr7,4f LXVD2X(0,R1,R8)
arch/powerpc/mm/tlb_nohash_low.S +5 -5
@@ -266,7 +266,7 @@ BEGIN_MMU_FTR_SECTION andi. r3,r3,MMUCSR0_TLBFI@l bne 1b MMU_FTR_SECTION_ELSE - PPC_TLBILX_ALL(0,0) + PPC_TLBILX_ALL(R0,R0) ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_USE_TLBILX) msync isync
@@ -279,7 +279,7 @@ BEGIN_MMU_FTR_SECTION wrteei 0 mfspr r4,SPRN_MAS6 /* save MAS6 */ mtspr SPRN_MAS6,r3 - PPC_TLBILX_PID(0,0) + PPC_TLBILX_PID(R0,R0) mtspr SPRN_MAS6,r4 /* restore MAS6 */ wrtee r10 MMU_FTR_SECTION_ELSE
@@ -331,7 +331,7 @@ _GLOBAL(_tlbil_pid) mfmsr r10 wrteei 0 mtspr SPRN_MAS6,r4 - PPC_TLBILX_PID(0,0) + PPC_TLBILX_PID(R0,R0) wrtee r10 msync isync
@@ -343,14 +343,14 @@ _GLOBAL(_tlbil_pid_noind) ori r4,r4,MAS6_SIND wrteei 0 mtspr SPRN_MAS6,r4 - PPC_TLBILX_PID(0,0) + PPC_TLBILX_PID(R0,R0) wrtee r10 msync isync blr _GLOBAL(_tlbil_all) - PPC_TLBILX_ALL(0,0) + PPC_TLBILX_ALL(R0,R0) msync isync blr
PATCH 11/15 powerpc: fix VSX macros so register names aren't wrapped
In reply to Michael NeulingWe need to do this so we can enforce the name of a and b in called macros PPC_RA/B later.
---
arch/powerpc/include/asm/ppc-opcode.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/powerpc/include/asm/ppc-opcode.h +3 -3
@@ -201,11 +201,11 @@#define VSX_XX1 (s, a, b) (__PPC_XS(s) | __PPC_RA(a) | __PPC_RB(b))#define VSX_XX3 (t, a, b) (__PPC_XT(t) | __PPC_XA(a) | __PPC_XB(b))#define STXVD2X (s, a, b) stringify_in_c(.long PPC_INST_STXVD2X | \ - VSX_XX1((s), (a), (b))) + VSX_XX1((s), a, b))#define LXVD2X (s, a, b) stringify_in_c(.long PPC_INST_LXVD2X | \ - VSX_XX1((s), (a), (b))) + VSX_XX1((s), a, b))#define XXLOR (t, a, b) stringify_in_c(.long PPC_INST_XXLOR | \ - VSX_XX3((t), (a), (b))) + VSX_XX3((t), a, b))#define PPC_NAP stringify_in_c(.long PPC_INST_NAP)#define PPC_SLEEP stringify_in_c(.long PPC_INST_SLEEP)
PATCH 12/15 powerpc: introduce new ___PPC_RA/B/S/T macros
In reply to Michael NeulingThese are currently the same as __PPC_RA/B/S/T but we'll wrap them soon.
---
arch/powerpc/include/asm/ppc-opcode.h | 4 ++++ 1 file changed, 4 insertions(+)
arch/powerpc/include/asm/ppc-opcode.h +4 -0
@@ -111,6 +111,10 @@#define PPC_INST_STBCIX 0x7c0007aa/* macros to insert fields into opcodes */ +#define ___PPC_RA (a) (((a) & 0x1f) << 16) +#define ___PPC_RB (b) (((b) & 0x1f) << 11) +#define ___PPC_RS (s) (((s) & 0x1f) << 21) +#define ___PPC_RT (t) ___PPC_RS(t)#define __PPC_RA (a) (((a) & 0x1f) << 16)#define __PPC_RB (b) (((b) & 0x1f) << 11)#define __PPC_RS (s) (((s) & 0x1f) << 21)
PATCH 13/15 powerpc: start using ___PPC_RA/B/S/T where necessary
In reply to Michael NeulingNow have ___PPC_RA/B/S/T we can use it in some places. These are places where we can't use the existing defines which will soon enforce R0-R31 usage.
The macros being changed here are being used in inline asm, which can't convert to enforce the R0-R31 usage.
---
arch/powerpc/include/asm/ppc-opcode.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
arch/powerpc/include/asm/ppc-opcode.h +6 -6
@@ -147,13 +147,13 @@#define PPC_DCBZL (a, b) stringify_in_c(.long PPC_INST_DCBZL | \ __PPC_RA(a) | __PPC_RB(b))#define PPC_LDARX (t, a, b, eh) stringify_in_c(.long PPC_INST_LDARX | \ - __PPC_RT(t) | __PPC_RA(a) | \ - __PPC_RB(b) | __PPC_EH(eh)) + ___PPC_RT(t) | ___PPC_RA(a) | \ + ___PPC_RB(b) | __PPC_EH(eh))#define PPC_LWARX (t, a, b, eh) stringify_in_c(.long PPC_INST_LWARX | \ - __PPC_RT(t) | __PPC_RA(a) | \ - __PPC_RB(b) | __PPC_EH(eh)) + ___PPC_RT(t) | ___PPC_RA(a) | \ + ___PPC_RB(b) | __PPC_EH(eh))#define PPC_MSGSND (b) stringify_in_c(.long PPC_INST_MSGSND | \ - __PPC_RB(b)) + ___PPC_RB(b))#define PPC_POPCNTB (a, s) stringify_in_c(.long PPC_INST_POPCNTB | \ __PPC_RA(a) | __PPC_RS(s))#define PPC_POPCNTD (a, s) stringify_in_c(.long PPC_INST_POPCNTD | \
@@ -171,7 +171,7 @@#define PPC_WAIT (w) stringify_in_c(.long PPC_INST_WAIT | \ __PPC_WC(w))#define PPC_TLBIE (lp,a) stringify_in_c(.long PPC_INST_TLBIE | \ - __PPC_RB(a) | __PPC_RS(lp)) + ___PPC_RB(a) | ___PPC_RS(lp))#define PPC_TLBSRX_DOT (a,b) stringify_in_c(.long PPC_INST_TLBSRX_DOT | \ __PPC_RA(a) | __PPC_RB(b))#define PPC_TLBIVAX (a,b) stringify_in_c(.long PPC_INST_TLBIVAX | \
PATCH 14/15 powerpc: Introduce new __REG_R macros
In reply to Michael Neuling---
arch/powerpc/include/asm/ppc_asm.h | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+)
arch/powerpc/include/asm/ppc_asm.h +32 -0
@@ -569,6 +569,38 @@ END_FTR_SECTION_IFCLR(CPU_FTR_601)#define R30 30#define R31 31 +#define __REG_R0 0 +#define __REG_R1 1 +#define __REG_R2 2 +#define __REG_R3 3 +#define __REG_R4 4 +#define __REG_R5 5 +#define __REG_R6 6 +#define __REG_R7 7 +#define __REG_R8 8 +#define __REG_R9 9 +#define __REG_R10 10 +#define __REG_R11 11 +#define __REG_R12 12 +#define __REG_R13 13 +#define __REG_R14 14 +#define __REG_R15 15 +#define __REG_R16 16 +#define __REG_R17 17 +#define __REG_R18 18 +#define __REG_R19 19 +#define __REG_R20 20 +#define __REG_R21 21 +#define __REG_R22 22 +#define __REG_R23 23 +#define __REG_R24 24 +#define __REG_R25 25 +#define __REG_R26 26 +#define __REG_R27 27 +#define __REG_R28 28 +#define __REG_R29 29 +#define __REG_R30 30 +#define __REG_R31 31/* Floating Point Registers (FPRs) */
PATCH 15/15 powerpc: enforce usage of R0-R31 where possible
In reply to Michael NeulingEnforce the use of R0-R31 in macros where possible now we have all the fixes in.
R0-R31 macros are removed here so that can't be used anymore. They should not be defined anywhere.
---
arch/powerpc/include/asm/ppc-opcode.h | 8 ++--- arch/powerpc/include/asm/ppc_asm.h | 47 +++++--------------------------- arch/powerpc/kernel/fpu.S | 12 ++++---- arch/powerpc/kvm/book3s_hv_rmhandlers.S | 3 +- 4 files changed, 21 insertions(+), 49 deletions(-)
arch/powerpc/include/asm/ppc-opcode.h +4 -4
@@ -115,10 +115,10 @@#define ___PPC_RB (b) (((b) & 0x1f) << 11)#define ___PPC_RS (s) (((s) & 0x1f) << 21)#define ___PPC_RT (t) ___PPC_RS(t) -#define __PPC_RA (a) (((a) & 0x1f) << 16) -#define __PPC_RB (b) (((b) & 0x1f) << 11) -#define __PPC_RS (s) (((s) & 0x1f) << 21) -#define __PPC_RT (s) __PPC_RS(s) +#define __PPC_RA (a) ___PPC_RA(__REG_##a) +#define __PPC_RB (b) ___PPC_RB(__REG_##b) +#define __PPC_RS (s) ___PPC_RS(__REG_##s) +#define __PPC_RT (t) ___PPC_RT(__REG_##t)#define __PPC_XA (a) ((((a) & 0x1f) << 16) | (((a) & 0x20) >> 3))#define __PPC_XB (b) ((((b) & 0x1f) << 11) | (((b) & 0x20) >> 4))#define __PPC_XS (s) ((((s) & 0x1f) << 21) | (((s) & 0x20) >> 5))
arch/powerpc/include/asm/ppc_asm.h +8 -39
82 lines not on this page · raw message
arch/powerpc/kernel/fpu.S +7 -5
@@ -26,7 +26,7 @@ #include <asm/ptrace.h> #ifdef CONFIG_VSX -#define REST_32FPVSRS(n,c,base) \ +#define __REST_32FPVSRS(n,c,base) \ BEGIN_FTR_SECTION \ b 2f; \ END_FTR_SECTION_IFSET(CPU_FTR_VSX); \
@@ -35,7 +35,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX); 2: REST_32VSRS(n,c,base); \ 3: -#define SAVE_32FPVSRS(n,c,base) \ +#define __SAVE_32FPVSRS(n,c,base) \ BEGIN_FTR_SECTION \ b 2f; \ END_FTR_SECTION_IFSET(CPU_FTR_VSX); \
@@ -44,9 +44,11 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX); 2: SAVE_32VSRS(n,c,base); \ 3: #else -#define REST_32FPVSRS(n,b,base) REST_32FPRS(n, base) -#define SAVE_32FPVSRS(n,b,base) SAVE_32FPRS(n, base) +#define __REST_32FPVSRS(n,b,base) REST_32FPRS(n, base) +#define __SAVE_32FPVSRS(n,b,base) SAVE_32FPRS(n, base) #endif +#define REST_32FPVSRS(n,c,base) __REST_32FPVSRS(n,__REG_##c,__REG_##base) +#define SAVE_32FPVSRS(n,c,base) __SAVE_32FPVSRS(n,__REG_##c,__REG_##base) /* * This task wants to use the FPU now.
@@ -79,7 +81,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX) beq 1f toreal(r4) addi r4,r4,THREAD /* want last_task_used_math->thread */ - SAVE_32FPVSRS(0, r5, r4) + SAVE_32FPVSRS(0, R5, R4) mffs fr0 stfd fr0,THREAD_FPSCR(r4) PPC_LL r5,PT_REGS(r4)
arch/powerpc/kvm/book3s_hv_rmhandlers.S +2 -1
@@ -73,7 +73,8 @@ _GLOBAL(kvmppc_hv_entry_trampoline) RFI #define ULONG_SIZE 8 -#define VCPU_GPR(n) (VCPU_GPRS + (n * ULONG_SIZE)) +#define __VCPU_GPR(n) (VCPU_GPRS + (n * ULONG_SIZE)) +#define VCPU_GPR(n) __VCPU_GPR(__REG_##n) /****************************************************************************** * *
A message that is not in the archive (sent off-list or not yet received): 20120608113605.80B73D43B2B__2857.47079547054$1339155968$gmane$org@localhost.localdomain
Re: [PATCH 7/15] powerpc: merge STK_REG/PARAM/FRAMESIZE
arch/powerpc/include/asm/ppc_asm.h END_FW_FTR_SECTION_IFSET(FW_FEATURE_SPLP · line 184
Quoted 12 lines · Michael Neuling
Index:
clone3/arch/powerpc/include/asm/ppc_asm.h
===================================================================arch/powerpc/include/asm/ppc_asm.h +4
-0@@ -178,6 +178,11 @@ END_FW_FTR_SECTION_IFSET(FW_FEATURE_SPLP#define HMT_HIGH or 3,3,3#define HMT_EXTRA_HIGH or 7,7,7 # power7 only +#define STACKFRAMESIZE 256 +#define STK_REG (i) (112 + ((i)-14)*8) + +#define STK_PARAM (i) (48 + ((i)-3)*8)
That should probably be bracketed by CONFIG_PPC64, since it is only applicable to 64-bit code.
Andreas.
Signature · 3 lines
Andreas Schwab, [email protected] GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different."
A message that is not in the archive (sent off-list or not yet received): 20120608113605.91B88D43B2F__24549.446340143$1339156128$gmane$org@localhost.localdomain
Re: [PATCH 10/15] powerpc: fixes for instructions not using correct register naming
Review
Quoted 3 lines · Michael Neuling
(quoted diff) +1
-1/* Invalidate all TLBs */ - PPC_TLBILX_ALL(0,0) + PPC_TLBILX_ALL(R0,R0)
The first argument is (RA|0), so 0 is zero, not r0.
Andreas.
Signature · 3 lines
Andreas Schwab, [email protected] GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different."
Re: [PATCH 10/15] powerpc: fixes for instructions not using correct register naming
Quoted 7 lines · Andreas Schwab
Review
Quoted 3 lines · Michael Neuling
(quoted diff) +1
-1/* Invalidate all TLBs */ - PPC_TLBILX_ALL(0,0) + PPC_TLBILX_ALL(R0,R0)The first argument is (RA|0), so 0 is zero, not r0.
The macro system we use cannot do that (it will prefix with REG_), since both arguments are registers we must use R0 in this case.
Cheers,
Ben.
Re: [PATCH 10/15] powerpc: fixes for instructions not using correct register naming
Quoted 2 lines · Benjamin Herrenschmidt
The macro system we use cannot do that (it will prefix with
REG_), since both arguments are registers we must use R0 in this case.
So define a ___PPC_RA0 macro that doesn't do that.
Andreas.
Signature · 3 lines
Andreas Schwab, [email protected] GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different."
Re: [PATCH 10/15] powerpc: fixes for instructions not using correct register naming
Quoted 6 lines · Andreas Schwab
Quoted 2 lines
The macro system we use cannot do that (it will prefix with
REG_),since
Quoted 1 line
both arguments are registers we must use R0 in this case.
So define a
___PPC_RA0macro that doesn't do that.
But then we lose the checking for other instructions :-) Unless we start being nasty and defining a different macro form for RA which can be 0...
I'd rather not go there unless we absolutely have to...
What would be nice also would be if we had a gas option to enforce the use of % for register names. We'd probably have to struggle a little bit with gcc inline asm in a case or two though.
Cheers,
Ben.
Re: [PATCH 10/15] powerpc: fixes for instructions not using correct register naming
Quoted 9 lines · Benjamin Herrenschmidt
Quoted 6 lines · Andreas Schwab
Quoted 2 lines
The macro system we use cannot do that (it will prefix with
REG_),since
Quoted 1 line
both arguments are registers we must use R0 in this case.
So define a
___PPC_RA0macro that doesn't do that.But then we lose the checking for other instructions :-)
??? There is no loss of checking for instructions that do not use ___PPC_RA0.
Quoted 2 lines
Unless we start being nasty and defining a different macro form for RA which can be 0...
That's what ___PPC_RA0 is all about.
Quoted 1 line
I'd rather not go there unless we absolutely have to...
Having to use R0 for an insn that does *not* use r0 is clearly a step backwards.
Quoted 2 lines
What would be nice also would be if we had a gas option to enforce the use of % for register names.
If gas is ever changed that way you have to be explict about 0 vs. %r0 anyway.
Andreas.
Signature · 3 lines
Andreas Schwab, [email protected] GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different."
cover powerpc: convert GPR usage to %r0-31 and R0-31
First 5 patches convert us to %r0-31.
Next 12 convert make using R0-31 required in macros.
Last 2 convert instructions where ra = r0 we use 0 rather than the register value (as suggested by Andreas).
Version 2 adds:
ra = 0 idea (as Andreas suggested)
Fixes for 32bit KVM (added ppc44x_defconfig to my testing) Based on mpe's next tree which has Antons power7 copy patches which
needed fixes for this
PATCH 1/18 powerpc: Add defines for R0-R31
We are going to use these later and convert r0 to %r0 etc.
---
arch/powerpc/include/asm/ppc_asm.h | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+)
arch/powerpc/include/asm/ppc_asm.h +33 -0
@@ -525,6 +525,39 @@ END_FTR_SECTION_IFCLR(CPU_FTR_601)#define r30 30#define r31 31 +#define R0 0 +#define R1 1 +#define R2 2 +#define R3 3 +#define R4 4 +#define R5 5 +#define R6 6 +#define R7 7 +#define R8 8 +#define R9 9 +#define R10 10 +#define R11 11 +#define R12 12 +#define R13 13 +#define R14 14 +#define R15 15 +#define R16 16 +#define R17 17 +#define R18 18 +#define R19 19 +#define R20 20 +#define R21 21 +#define R22 22 +#define R23 23 +#define R24 24 +#define R25 25 +#define R26 26 +#define R27 27 +#define R28 28 +#define R29 29 +#define R30 30 +#define R31 31 +/* Floating Point Registers (FPRs) */
PATCH 2/18 powerpc: modify macro ready for %r0 register change
In reply to Michael NeulingThe assembler doesn't take %r0 register arguments in braces, so remove them.
---
arch/powerpc/include/asm/ppc_asm.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
arch/powerpc/include/asm/ppc_asm.h +9 -9
@@ -295,14 +295,14 @@ n:*/ #ifdef __powerpc64__#define LOAD_REG_IMMEDIATE (reg,expr) \ - lis (reg),(expr)@highest; \ - ori (reg),(reg),(expr)@higher; \ - rldicr (reg),(reg),32,31; \ - oris (reg),(reg),(expr)@h; \ - ori (reg),(reg),(expr)@l; + lis reg,(expr)@highest; \ + ori reg,reg,(expr)@higher; \ + rldicr reg,reg,32,31; \ + oris reg,reg,(expr)@h; \ + ori reg,reg,(expr)@l;#define LOAD_REG_ADDR (reg,name) \ - ld (reg),name@got(r2) + ld reg,name@got(r2)#define LOAD_REG_ADDRBASE (reg,name) LOAD_REG_ADDR(reg,name)#define ADDROFF (name) 0
@@ -313,12 +313,12 @@ n:#else /* 32-bit */ #define LOAD_REG_IMMEDIATE (reg,expr) \ - lis (reg),(expr)@ha; \ - addi (reg),(reg),(expr)@l; + lis reg,(expr)@ha; \ + addi reg,reg,(expr)@l;#define LOAD_REG_ADDR (reg,name) LOAD_REG_IMMEDIATE(reg, name) -#define LOAD_REG_ADDRBASE (reg, name) lis (reg),name@ha +#define LOAD_REG_ADDRBASE (reg, name) lis reg,name@ha#define ADDROFF (name) name@l/* offsets for stack frame layout */
PATCH 3/18 powerpc: fix usage of register macros getting ready for %r0 change
In reply to Michael NeulingAnything that uses a constructed instruction (ie. from ppc-opcode.h), need to use the new R0 macro, as %r0 is not going to work.
Also convert usages of macros where we are just determining an offset (usually for a load/store), like:
std r14,STK_REG(r14)(r1)
Can't use STK_REG(r14) as %r14 doesn't work in the STK_REG macro since it's just calculating an offset.
---
arch/powerpc/kernel/cpu_setup_a2.S | 6 arch/powerpc/kernel/fpu.S | 4 arch/powerpc/kernel/misc_64.S | 4 arch/powerpc/kvm/book3s_hv_rmhandlers.S | 218 ++++++++++---------- arch/powerpc/kvm/book3s_interrupts.S | 72 +++--- arch/powerpc/kvm/booke_interrupts.S | 272 ++++++++++++------------- arch/powerpc/kvm/bookehv_interrupts.S | 220 ++++++++++---------- arch/powerpc/lib/checksum_64.S | 24 +- arch/powerpc/lib/copypage_power7.S | 28 +- arch/powerpc/lib/copyuser_64.S | 6 arch/powerpc/lib/copyuser_power7.S | 84 +++---- arch/powerpc/lib/hweight_64.S | 14 - arch/powerpc/lib/ldstfp.S | 12 - arch/powerpc/lib/mem_64.S | 6 arch/powerpc/lib/memcpy_64.S | 6 arch/powerpc/lib/memcpy_power7.S | 60 ++--- arch/powerpc/mm/hash_low_64.S | 148 ++++++------- arch/powerpc/mm/tlb_low_64e.S | 10 arch/powerpc/mm/tlb_nohash_low.S | 6 arch/powerpc/platforms/cell/beat_hvCall.S | 26 +- arch/powerpc/platforms/powernv/opal-takeover.S | 8 arch/powerpc/platforms/powernv/opal-wrappers.S | 2 arch/powerpc/platforms/pseries/hvCall.S | 72 +++--- 23 files changed, 654 insertions(+), 654 deletions(-)
arch/powerpc/kernel/cpu_setup_a2.S +3 -3
@@ -100,19 +100,19 @@ _icswx_skip_guest: lis r4,(MMUCR0_TLBSEL_I|MMUCR0_ECL)@h mtspr SPRN_MMUCR0, r4 li r4,A2_IERAT_SIZE-1 - PPC_ERATWE(r4,r4,3) + PPC_ERATWE(R4,R4,3) /* Now set the D-ERAT watermark to 31 */ lis r4,(MMUCR0_TLBSEL_D|MMUCR0_ECL)@h mtspr SPRN_MMUCR0, r4 li r4,A2_DERAT_SIZE-1 - PPC_ERATWE(r4,r4,3) + PPC_ERATWE(R4,R4,3) /* And invalidate the beast just in case. That won't get rid of * a bolted entry though it will be in LRU and so will go away eventually * but let's not bother for now */ - PPC_ERATILX(0,0,0) + PPC_ERATILX(0,R0,R0) 1: blr
arch/powerpc/kernel/fpu.S +2 -2
@@ -106,7 +106,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX) #endif lfd fr0,THREAD_FPSCR(r5) MTFSF_L(fr0) - REST_32FPVSRS(0, r4, r5) + REST_32FPVSRS(0, R4, R5) #ifndef CONFIG_SMP subi r4,r5,THREAD fromreal(r4)
@@ -140,7 +140,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX) addi r3,r3,THREAD /* want THREAD of task */ PPC_LL r5,PT_REGS(r3) PPC_LCMPI 0,r5,0 - SAVE_32FPVSRS(0, r4 ,r3) + SAVE_32FPVSRS(0, R4 ,R3) mffs fr0 stfd fr0,THREAD_FPSCR(r3) beq 1f
arch/powerpc/kernel/misc_64.S +2 -2
@@ -314,7 +314,7 @@ _GLOBAL(real_205_readb) mtmsrd r0 sync isync - LBZCIX(r3,0,r3) + LBZCIX(R3,0,R3) isync mtmsrd r7 sync
@@ -329,7 +329,7 @@ _GLOBAL(real_205_writeb) mtmsrd r0 sync isync - STBCIX(r3,0,r4) + STBCIX(R3,0,R4) isync mtmsrd r7 sync
arch/powerpc/kvm/book3s_hv_rmhandlers.S +109 -109
316 lines not on this page · raw message
arch/powerpc/kvm/book3s_interrupts.S +36 -36
84 lines not on this page · raw message
arch/powerpc/kvm/booke_interrupts.S +136 -136
359 lines not on this page · raw message
arch/powerpc/kvm/bookehv_interrupts.S +110 -110
307 lines not on this page · raw message
arch/powerpc/lib/checksum_64.S +12 -12
@@ -114,9 +114,9 @@ _GLOBAL(csum_partial) mtctr r6 stdu r1,-STACKFRAMESIZE(r1) - std r14,STK_REG(r14)(r1) - std r15,STK_REG(r15)(r1) - std r16,STK_REG(r16)(r1) + std r14,STK_REG(R14)(r1) + std r15,STK_REG(R15)(r1) + std r16,STK_REG(R16)(r1) ld r6,0(r3) ld r9,8(r3)
@@ -175,9 +175,9 @@ _GLOBAL(csum_partial) adde r0,r0,r15 adde r0,r0,r16 - ld r14,STK_REG(r14)(r1) - ld r15,STK_REG(r15)(r1) - ld r16,STK_REG(r16)(r1) + ld r14,STK_REG(R14)(r1) + ld r15,STK_REG(R15)(r1) + ld r16,STK_REG(R16)(r1) addi r1,r1,STACKFRAMESIZE andi. r4,r4,63
@@ -299,9 +299,9 @@ dest; sth r6,0(r4) mtctr r6 stdu r1,-STACKFRAMESIZE(r1) - std r14,STK_REG(r14)(r1) - std r15,STK_REG(r15)(r1) - std r16,STK_REG(r16)(r1) + std r14,STK_REG(R14)(r1) + std r15,STK_REG(R15)(r1) + std r16,STK_REG(R16)(r1) source; ld r6,0(r3) source; ld r9,8(r3)
@@ -382,9 +382,9 @@ dest; std r16,56(r4) adde r0,r0,r15 adde r0,r0,r16 - ld r14,STK_REG(r14)(r1) - ld r15,STK_REG(r15)(r1) - ld r16,STK_REG(r16)(r1) + ld r14,STK_REG(R14)(r1) + ld r15,STK_REG(R15)(r1) + ld r16,STK_REG(R16)(r1) addi r1,r1,STACKFRAMESIZE andi. r5,r5,63
arch/powerpc/lib/copypage_power7.S +14 -14
@@ -113,13 +113,13 @@ _GLOBAL(copypage_power7) #endif .Lnonvmx_copy: - std r14,STK_REG(r14)(r1) - std r15,STK_REG(r15)(r1) - std r16,STK_REG(r16)(r1) - std r17,STK_REG(r17)(r1) - std r18,STK_REG(r18)(r1) - std r19,STK_REG(r19)(r1) - std r20,STK_REG(r20)(r1) + std r14,STK_REG(R14)(r1) + std r15,STK_REG(R15)(r1) + std r16,STK_REG(R16)(r1) + std r17,STK_REG(R17)(r1) + std r18,STK_REG(R18)(r1) + std r19,STK_REG(R19)(r1) + std r20,STK_REG(R20)(r1) 1: ld r0,0(r4) ld r5,8(r4)
@@ -157,12 +157,12 @@ _GLOBAL(copypage_power7) addi r3,r3,128 bdnz 1b - ld r14,STK_REG(r14)(r1) - ld r15,STK_REG(r15)(r1) - ld r16,STK_REG(r16)(r1) - ld r17,STK_REG(r17)(r1) - ld r18,STK_REG(r18)(r1) - ld r19,STK_REG(r19)(r1) - ld r20,STK_REG(r20)(r1) + ld r14,STK_REG(R14)(r1) + ld r15,STK_REG(R15)(r1) + ld r16,STK_REG(R16)(r1) + ld r17,STK_REG(R17)(r1) + ld r18,STK_REG(R18)(r1) + ld r19,STK_REG(R19)(r1) + ld r20,STK_REG(R20)(r1) addi r1,r1,STACKFRAMESIZE blr
arch/powerpc/lib/copyuser_64.S +3 -3
@@ -30,7 +30,7 @@ _GLOBAL(__copy_tofrom_user_base) dcbt 0,r4 beq .Lcopy_page_4K andi. r6,r6,7 - PPC_MTOCRF(0x01,r5) + PPC_MTOCRF(0x01,R5) blt cr1,.Lshort_copy /* Below we want to nop out the bne if we're on a CPU that has the * CPU_FTR_UNALIGNED_LD_STD bit set and the CPU_FTR_CP_USE_DCBTZ bit
@@ -186,7 +186,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_ blr .Ldst_unaligned: - PPC_MTOCRF(0x01,r6) /* put #bytes to 8B bdry into cr7 */ + PPC_MTOCRF(0x01,R6) /* put #bytes to 8B bdry into cr7 */ subf r5,r6,r5 li r7,0 cmpldi cr1,r5,16
@@ -201,7 +201,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_ 2: bf cr7*4+1,3f 37: lwzx r0,r7,r4 83: stwx r0,r7,r3 -3: PPC_MTOCRF(0x01,r5) +3: PPC_MTOCRF(0x01,R5) add r4,r6,r4 add r3,r6,r3 b .Ldst_aligned
arch/powerpc/lib/copyuser_power7.S +42 -42
132 lines not on this page · raw message
arch/powerpc/lib/hweight_64.S +7 -7
@@ -28,7 +28,7 @@ BEGIN_FTR_SECTION nop nop FTR_SECTION_ELSE - PPC_POPCNTB(r3,r3) + PPC_POPCNTB(R3,R3) clrldi r3,r3,64-8 blr ALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB)
@@ -42,14 +42,14 @@ BEGIN_FTR_SECTION nop FTR_SECTION_ELSE BEGIN_FTR_SECTION_NESTED(50) - PPC_POPCNTB(r3,r3) + PPC_POPCNTB(R3,R3) srdi r4,r3,8 add r3,r4,r3 clrldi r3,r3,64-8 blr FTR_SECTION_ELSE_NESTED(50) clrlwi r3,r3,16 - PPC_POPCNTW(r3,r3) + PPC_POPCNTW(R3,R3) clrldi r3,r3,64-8 blr ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 50)
@@ -66,7 +66,7 @@ BEGIN_FTR_SECTION nop FTR_SECTION_ELSE BEGIN_FTR_SECTION_NESTED(51) - PPC_POPCNTB(r3,r3) + PPC_POPCNTB(R3,R3) srdi r4,r3,16 add r3,r4,r3 srdi r4,r3,8
@@ -74,7 +74,7 @@ FTR_SECTION_ELSE clrldi r3,r3,64-8 blr FTR_SECTION_ELSE_NESTED(51) - PPC_POPCNTW(r3,r3) + PPC_POPCNTW(R3,R3) clrldi r3,r3,64-8 blr ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 51)
@@ -93,7 +93,7 @@ BEGIN_FTR_SECTION nop FTR_SECTION_ELSE BEGIN_FTR_SECTION_NESTED(52) - PPC_POPCNTB(r3,r3) + PPC_POPCNTB(R3,R3) srdi r4,r3,32 add r3,r4,r3 srdi r4,r3,16
@@ -103,7 +103,7 @@ FTR_SECTION_ELSE clrldi r3,r3,64-8 blr FTR_SECTION_ELSE_NESTED(52) - PPC_POPCNTD(r3,r3) + PPC_POPCNTD(R3,R3) clrldi r3,r3,64-8 blr ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 52)
arch/powerpc/lib/ldstfp.S +6 -6
@@ -330,13 +330,13 @@ _GLOBAL(do_lxvd2x) MTMSRD(r7) isync beq cr7,1f - STXVD2X(0,r1,r8) + STXVD2X(0,R1,R8) 1: li r9,-EFAULT -2: LXVD2X(0,0,r4) +2: LXVD2X(0,0,R4) li r9,0 3: beq cr7,4f bl put_vsr - LXVD2X(0,r1,r8) + LXVD2X(0,R1,R8) 4: PPC_LL r0,STKFRM+PPC_LR_STKOFF(r1) mtlr r0 MTMSRD(r6)
@@ -358,13 +358,13 @@ _GLOBAL(do_stxvd2x) MTMSRD(r7) isync beq cr7,1f - STXVD2X(0,r1,r8) + STXVD2X(0,R1,R8) bl get_vsr 1: li r9,-EFAULT -2: STXVD2X(0,0,r4) +2: STXVD2X(0,0,R4) li r9,0 3: beq cr7,4f - LXVD2X(0,r1,r8) + LXVD2X(0,R1,R8) 4: PPC_LL r0,STKFRM+PPC_LR_STKOFF(r1) mtlr r0 MTMSRD(r6)
arch/powerpc/lib/mem_64.S +3 -3
@@ -19,7 +19,7 @@ _GLOBAL(memset) rlwimi r4,r4,16,0,15 cmplw cr1,r5,r0 /* do we get that far? */ rldimi r4,r4,32,0 - PPC_MTOCRF(1,r0) + PPC_MTOCRF(1,R0) mr r6,r3 blt cr1,8f beq+ 3f /* if already 8-byte aligned */
@@ -49,7 +49,7 @@ _GLOBAL(memset) bdnz 4b 5: srwi. r0,r5,3 clrlwi r5,r5,29 - PPC_MTOCRF(1,r0) + PPC_MTOCRF(1,R0) beq 8f bf 29,6f std r4,0(r6)
@@ -65,7 +65,7 @@ _GLOBAL(memset) std r4,0(r6) addi r6,r6,8 8: cmpwi r5,0 - PPC_MTOCRF(1,r5) + PPC_MTOCRF(1,R5) beqlr+ bf 29,9f stw r4,0(r6)
arch/powerpc/lib/memcpy_64.S +3 -3
@@ -16,7 +16,7 @@ BEGIN_FTR_SECTION FTR_SECTION_ELSE b memcpy_power7 ALT_FTR_SECTION_END_IFCLR(CPU_FTR_VMX_COPY) - PPC_MTOCRF(0x01,r5) + PPC_MTOCRF(0x01,R5) cmpldi cr1,r5,16 neg r6,r3 # LS 3 bits = # bytes to 8-byte dest bdry andi. r6,r6,7
@@ -158,7 +158,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_ blr .Ldst_unaligned: - PPC_MTOCRF(0x01,r6) # put #bytes to 8B bdry into cr7 + PPC_MTOCRF(0x01,R6) # put #bytes to 8B bdry into cr7 subf r5,r6,r5 li r7,0 cmpldi cr1,r5,16
@@ -173,7 +173,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_ 2: bf cr7*4+1,3f lwzx r0,r7,r4 stwx r0,r7,r3 -3: PPC_MTOCRF(0x01,r5) +3: PPC_MTOCRF(0x01,R5) add r4,r6,r4 add r3,r6,r3 b .Ldst_aligned
arch/powerpc/lib/memcpy_power7.S +30 -30
96 lines not on this page · raw message
arch/powerpc/mm/hash_low_64.S +74 -74
340 lines not on this page · raw message
arch/powerpc/mm/tlb_low_64e.S +5 -5
@@ -126,7 +126,7 @@ BEGIN_MMU_FTR_SECTION /* Set the TLB reservation and search for existing entry. Then load * the entry. */ - PPC_TLBSRX_DOT(0,r16) + PPC_TLBSRX_DOT(R0,R16) ldx r14,r14,r15 /* grab pgd entry */ beq normal_tlb_miss_done /* tlb exists already, bail */ MMU_FTR_SECTION_ELSE
@@ -395,7 +395,7 @@ BEGIN_MMU_FTR_SECTION /* Set the TLB reservation and search for existing entry. Then load * the entry. */ - PPC_TLBSRX_DOT(0,r16) + PPC_TLBSRX_DOT(R0,R16) ld r14,0(r10) beq normal_tlb_miss_done MMU_FTR_SECTION_ELSE
@@ -528,7 +528,7 @@ BEGIN_MMU_FTR_SECTION /* Search if we already have a TLB entry for that virtual address, and * if we do, bail out. */ - PPC_TLBSRX_DOT(0,r16) + PPC_TLBSRX_DOT(R0,R16) beq virt_page_table_tlb_miss_done END_MMU_FTR_SECTION_IFSET(MMU_FTR_USE_TLBRSRV)
@@ -779,7 +779,7 @@ htw_tlb_miss: * * MAS1:IND should be already set based on MAS4 */ - PPC_TLBSRX_DOT(0,r16) + PPC_TLBSRX_DOT(R0,R16) beq htw_tlb_miss_done /* Now, we need to walk the page tables. First check if we are in
@@ -919,7 +919,7 @@ tlb_load_linear: mtspr SPRN_MAS1,r15 /* Already somebody there ? */ - PPC_TLBSRX_DOT(0,r16) + PPC_TLBSRX_DOT(R0,R16) beq tlb_load_linear_done /* Now we build the remaining MAS. MAS0 and 2 should be fine
arch/powerpc/mm/tlb_nohash_low.S +3 -3
@@ -313,7 +313,7 @@ BEGIN_MMU_FTR_SECTION mtspr SPRN_MAS1,r4 tlbwe MMU_FTR_SECTION_ELSE - PPC_TLBILX_VA(0,r3) + PPC_TLBILX_VA(R0,R3) ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_USE_TLBILX) msync isync
@@ -364,7 +364,7 @@ _GLOBAL(_tlbil_va) beq 1f rlwimi r4,r6,MAS6_SIND_SHIFT,MAS6_SIND 1: mtspr SPRN_MAS6,r4 /* assume AS=0 for now */ - PPC_TLBILX_VA(0,r3) + PPC_TLBILX_VA(R0,R3) msync isync wrtee r10
@@ -379,7 +379,7 @@ _GLOBAL(_tlbivax_bcast) beq 1f rlwimi r4,r6,MAS6_SIND_SHIFT,MAS6_SIND 1: mtspr SPRN_MAS6,r4 /* assume AS=0 for now */ - PPC_TLBIVAX(0,r3) + PPC_TLBIVAX(R0,R3) eieio tlbsync sync
arch/powerpc/platforms/cell/beat_hvCall.S +13 -13
@@ -74,7 +74,7 @@ _GLOBAL(beat_hcall_norets8) mr r6,r7 mr r7,r8 mr r8,r9 - ld r10,STK_PARM(r10)(r1) + ld r10,STK_PARM(R10)(r1) HVSC /* invoke the hypervisor */
@@ -94,7 +94,7 @@ _GLOBAL(beat_hcall1) HCALL_INST_PRECALL - std r4,STK_PARM(r4)(r1) /* save ret buffer */ + std r4,STK_PARM(R4)(r1) /* save ret buffer */ mr r11,r3 mr r3,r5
@@ -108,7 +108,7 @@ _GLOBAL(beat_hcall1) HCALL_INST_POSTCALL - ld r12,STK_PARM(r4)(r1) + ld r12,STK_PARM(R4)(r1) std r4, 0(r12) lwz r0,8(r1)
@@ -125,7 +125,7 @@ _GLOBAL(beat_hcall2) HCALL_INST_PRECALL - std r4,STK_PARM(r4)(r1) /* save ret buffer */ + std r4,STK_PARM(R4)(r1) /* save ret buffer */ mr r11,r3 mr r3,r5
@@ -139,7 +139,7 @@ _GLOBAL(beat_hcall2) HCALL_INST_POSTCALL - ld r12,STK_PARM(r4)(r1) + ld r12,STK_PARM(R4)(r1) std r4, 0(r12) std r5, 8(r12)
@@ -157,7 +157,7 @@ _GLOBAL(beat_hcall3) HCALL_INST_PRECALL - std r4,STK_PARM(r4)(r1) /* save ret buffer */ + std r4,STK_PARM(R4)(r1) /* save ret buffer */ mr r11,r3 mr r3,r5
@@ -171,7 +171,7 @@ _GLOBAL(beat_hcall3) HCALL_INST_POSTCALL - ld r12,STK_PARM(r4)(r1) + ld r12,STK_PARM(R4)(r1) std r4, 0(r12) std r5, 8(r12) std r6, 16(r12)
@@ -190,7 +190,7 @@ _GLOBAL(beat_hcall4) HCALL_INST_PRECALL - std r4,STK_PARM(r4)(r1) /* save ret buffer */ + std r4,STK_PARM(R4)(r1) /* save ret buffer */ mr r11,r3 mr r3,r5
@@ -204,7 +204,7 @@ _GLOBAL(beat_hcall4) HCALL_INST_POSTCALL - ld r12,STK_PARM(r4)(r1) + ld r12,STK_PARM(R4)(r1) std r4, 0(r12) std r5, 8(r12) std r6, 16(r12)
@@ -224,7 +224,7 @@ _GLOBAL(beat_hcall5) HCALL_INST_PRECALL - std r4,STK_PARM(r4)(r1) /* save ret buffer */ + std r4,STK_PARM(R4)(r1) /* save ret buffer */ mr r11,r3 mr r3,r5
@@ -238,7 +238,7 @@ _GLOBAL(beat_hcall5) HCALL_INST_POSTCALL - ld r12,STK_PARM(r4)(r1) + ld r12,STK_PARM(R4)(r1) std r4, 0(r12) std r5, 8(r12) std r6, 16(r12)
@@ -259,7 +259,7 @@ _GLOBAL(beat_hcall6) HCALL_INST_PRECALL - std r4,STK_PARM(r4)(r1) /* save ret buffer */ + std r4,STK_PARM(R4)(r1) /* save ret buffer */ mr r11,r3 mr r3,r5
@@ -273,7 +273,7 @@ _GLOBAL(beat_hcall6) HCALL_INST_POSTCALL - ld r12,STK_PARM(r4)(r1) + ld r12,STK_PARM(R4)(r1) std r4, 0(r12) std r5, 8(r12) std r6, 16(r12)
arch/powerpc/platforms/powernv/opal-takeover.S +4 -4
@@ -23,14 +23,14 @@ _GLOBAL(opal_query_takeover) mfcr r0 stw r0,8(r1) - std r3,STK_PARAM(r3)(r1) - std r4,STK_PARAM(r4)(r1) + std r3,STK_PARAM(R3)(r1) + std r4,STK_PARAM(R4)(r1) li r3,H_HAL_TAKEOVER li r4,H_HAL_TAKEOVER_QUERY_MAGIC HVSC - ld r10,STK_PARAM(r3)(r1) + ld r10,STK_PARAM(R3)(r1) std r4,0(r10) - ld r10,STK_PARAM(r4)(r1) + ld r10,STK_PARAM(R4)(r1) std r5,0(r10) lwz r0,8(r1) mtcrf 0xff,r0
arch/powerpc/platforms/powernv/opal-wrappers.S +1 -1
@@ -32,7 +32,7 @@ std r12,PACASAVEDMSR(r13); \ andc r12,r12,r0; \ mtmsrd r12,1; \ - LOAD_REG_ADDR(r0,.opal_return); \ + LOAD_REG_ADDR(R0,.opal_return); \ mtlr r0; \ li r0,MSR_DR|MSR_IR; \ andc r12,r12,r0; \
arch/powerpc/platforms/pseries/hvCall.S +36 -36
160 lines not on this page · raw message
PATCH 4/18 powerpc: Fix sldi to take literal not register name
In reply to Michael NeulingWas introduced by:
commit 19ccb76a1938ab364a412253daec64613acbf3df
Author: Paul Mackerras <[email protected]>
Date: Sat Jul 23 17:42:46 2011 +1000
Talking to paulus, this shouldn't be a literal.
---
arch/powerpc/kvm/book3s_hv_rmhandlers.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/kvm/book3s_hv_rmhandlers.S +1 -1
@@ -810,7 +810,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201) lwz r3,VCORE_NAPPING_THREADS(r5) lwz r4,VCPU_PTID(r9) li r0,1 - sldi r0,r0,r4 + sld r0,r0,r4 andc. r3,r3,r0 /* no sense IPI'ing ourselves */ beq 43f mulli r4,r4,PACA_SIZE /* get paca for thread 0 */
PATCH 5/18 powerpc: convert to %r for all GPR usage
In reply to Michael NeulingNow all the fixes are in place, let's rock-n-roll!
---
arch/powerpc/include/asm/ppc_asm.h | 72 ++++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 33 deletions(-)
arch/powerpc/include/asm/ppc_asm.h +39 -33
@@ -490,40 +490,46 @@ END_FTR_SECTION_IFCLR(CPU_FTR_601)#define cr7 7 -/* General Purpose Registers (GPRs) */ +/* +* General Purpose Registers (GPRs) +* +* The lower case r0-r31 should be used in preference to the upper +* case R0-R31 as they provide more error checking in the assembler. +* Use R0-31 only when really nessesary. +*/ -#define r0 0 -#define r1 1 -#define r2 2 -#define r3 3 -#define r4 4 -#define r5 5 -#define r6 6 -#define r7 7 -#define r8 8 -#define r9 9 -#define r10 10 -#define r11 11 -#define r12 12 -#define r13 13 -#define r14 14 -#define r15 15 -#define r16 16 -#define r17 17 -#define r18 18 -#define r19 19 -#define r20 20 -#define r21 21 -#define r22 22 -#define r23 23 -#define r24 24 -#define r25 25 -#define r26 26 -#define r27 27 -#define r28 28 -#define r29 29 -#define r30 30 -#define r31 31 +#define r0 %r0 +#define r1 %r1 +#define r2 %r2 +#define r3 %r3 +#define r4 %r4 +#define r5 %r5 +#define r6 %r6 +#define r7 %r7 +#define r8 %r8 +#define r9 %r9 +#define r10 %r10 +#define r11 %r11 +#define r12 %r12 +#define r13 %r13 +#define r14 %r14 +#define r15 %r15 +#define r16 %r16 +#define r17 %r17 +#define r18 %r18 +#define r19 %r19 +#define r20 %r20 +#define r21 %r21 +#define r22 %r22 +#define r23 %r23 +#define r24 %r24 +#define r25 %r25 +#define r26 %r26 +#define r27 %r27 +#define r28 %r28 +#define r29 %r29 +#define r30 %r30 +#define r31 %r31#define R0 0#define R1 1
PATCH 6/18 powerpc/pasemi: move lbz/stbciz to ppc-opcode.h
In reply to Michael Neulingmove lbz/stbciz to ppc-opcode.h.
---
arch/powerpc/include/asm/ppc-opcode.h | 7 +++++++ arch/powerpc/kernel/misc_64.S | 5 ----- 2 files changed, 7 insertions(+), 5 deletions(-)
arch/powerpc/include/asm/ppc-opcode.h +7 -0
@@ -107,6 +107,8 @@#define PPC_INST_NEG 0x7c0000d0#define PPC_INST_BRANCH 0x48000000#define PPC_INST_BRANCH_COND 0x40800000 +#define PPC_INST_LBZCIX 0x7c0006aa +#define PPC_INST_STBCIX 0x7c0007aa/* macros to insert fields into opcodes */ #define __PPC_RA (a) (((a) & 0x1f) << 16)
@@ -186,6 +188,11 @@ __PPC_RS(t) | __PPC_RA(a) | __PPC_RB(b))#define PPC_SLBFEE_DOT (t, b) stringify_in_c(.long PPC_INST_SLBFEE | \ __PPC_RT(t) | __PPC_RB(b)) +/* PASemi instructions */ +#define LBZCIX (t,a,b) stringify_in_c(.long PPC_INST_LBZCIX | \ + __PPC_RT(t) | __PPC_RA(a) | __PPC_RB(b)) +#define STBCIX (s,a,b) stringify_in_c(.long PPC_INST_STBCIX | \ + __PPC_RS(s) | __PPC_RA(a) | __PPC_RB(b))/* * Define what the VSX XX1 form instructions will look like, then add
arch/powerpc/kernel/misc_64.S +0 -5
@@ -301,11 +301,6 @@ _GLOBAL(real_writeb) #ifdef CONFIG_PPC_PASEMI -/* No support in all binutils for these yet, so use defines */ -#define LBZCIX(RT,RA,RB) .long (0x7c0006aa|(RT<<21)|(RA<<16)|(RB << 11)) -#define STBCIX(RS,RA,RB) .long (0x7c0007aa|(RS<<21)|(RA<<16)|(RB << 11)) - - _GLOBAL(real_205_readb) mfmsr r7 ori r0,r7,MSR_DR
PATCH 7/18 powerpc: merge STK_REG/PARAM/FRAMESIZE
In reply to Michael NeulingMerge the defines of STACKFRAMESIZE, STK_REG, STK_PARAM from different places.
---
arch/powerpc/include/asm/ppc_asm.h | 5 + arch/powerpc/lib/checksum_64.S | 3 arch/powerpc/lib/copypage_power7.S | 3 arch/powerpc/lib/copyuser_power7.S | 3 arch/powerpc/lib/memcpy_power7.S | 3 arch/powerpc/mm/hash_low_64.S | 88 +++++++++++-------------- arch/powerpc/platforms/cell/beat_hvCall.S | 28 +++---- arch/powerpc/platforms/powernv/opal-takeover.S | 2 arch/powerpc/platforms/pseries/hvCall.S | 72 +++++++++----------- 9 files changed, 93 insertions(+), 114 deletions(-)
arch/powerpc/include/asm/ppc_asm.h +5 -0
@@ -181,6 +181,11 @@ END_FW_FTR_SECTION_IFSET(FW_FEATURE_SPLP#ifdef __KERNEL__#ifdef CONFIG_PPC64 +#define STACKFRAMESIZE 256 +#define STK_REG (i) (112 + ((i)-14)*8) + +#define STK_PARAM (i) (48 + ((i)-3)*8) +#define XGLUE (a,b) a##b#define GLUE (a,b) XGLUE(a,b)
arch/powerpc/lib/checksum_64.S +0 -3
@@ -65,9 +65,6 @@ _GLOBAL(csum_tcpudp_magic) srwi r3,r3,16 blr -#define STACKFRAMESIZE 256 -#define STK_REG(i) (112 + ((i)-14)*8) - /* * Computes the checksum of a memory block at buff, length len, * and adds in "sum" (32-bit).
arch/powerpc/lib/copypage_power7.S +0 -3
@@ -20,9 +20,6 @@ #include <asm/page.h> #include <asm/ppc_asm.h> -#define STACKFRAMESIZE 256 -#define STK_REG(i) (112 + ((i)-14)*8) - _GLOBAL(copypage_power7) /* * We prefetch both the source and destination using enhanced touch
arch/powerpc/lib/copyuser_power7.S +0 -3
@@ -19,9 +19,6 @@ */ #include <asm/ppc_asm.h> -#define STACKFRAMESIZE 256 -#define STK_REG(i) (112 + ((i)-14)*8) - .macro err1 100: .section __ex_table,"a"
arch/powerpc/lib/memcpy_power7.S +0 -3
@@ -19,9 +19,6 @@ */ #include <asm/ppc_asm.h> -#define STACKFRAMESIZE 256 -#define STK_REG(i) (112 + ((i)-14)*8) - _GLOBAL(memcpy_power7) #ifdef CONFIG_ALTIVEC cmpldi r5,16
arch/powerpc/mm/hash_low_64.S +40 -48
256 lines not on this page · raw message
arch/powerpc/platforms/cell/beat_hvCall.S +13 -15
@@ -22,8 +22,6 @@ #include <asm/ppc_asm.h> -#define STK_PARM(i) (48 + ((i)-3)*8) - /* Not implemented on Beat, now */ #define HCALL_INST_PRECALL #define HCALL_INST_POSTCALL
@@ -74,7 +72,7 @@ _GLOBAL(beat_hcall_norets8) mr r6,r7 mr r7,r8 mr r8,r9 - ld r10,STK_PARM(R10)(r1) + ld r10,STK_PARAM(R10)(r1) HVSC /* invoke the hypervisor */
@@ -94,7 +92,7 @@ _GLOBAL(beat_hcall1) HCALL_INST_PRECALL - std r4,STK_PARM(R4)(r1) /* save ret buffer */ + std r4,STK_PARAM(R4)(r1) /* save ret buffer */ mr r11,r3 mr r3,r5
@@ -108,7 +106,7 @@ _GLOBAL(beat_hcall1) HCALL_INST_POSTCALL - ld r12,STK_PARM(R4)(r1) + ld r12,STK_PARAM(R4)(r1) std r4, 0(r12) lwz r0,8(r1)
@@ -125,7 +123,7 @@ _GLOBAL(beat_hcall2) HCALL_INST_PRECALL - std r4,STK_PARM(R4)(r1) /* save ret buffer */ + std r4,STK_PARAM(R4)(r1) /* save ret buffer */ mr r11,r3 mr r3,r5
@@ -139,7 +137,7 @@ _GLOBAL(beat_hcall2) HCALL_INST_POSTCALL - ld r12,STK_PARM(R4)(r1) + ld r12,STK_PARAM(R4)(r1) std r4, 0(r12) std r5, 8(r12)
@@ -157,7 +155,7 @@ _GLOBAL(beat_hcall3) HCALL_INST_PRECALL - std r4,STK_PARM(R4)(r1) /* save ret buffer */ + std r4,STK_PARAM(R4)(r1) /* save ret buffer */ mr r11,r3 mr r3,r5
@@ -171,7 +169,7 @@ _GLOBAL(beat_hcall3) HCALL_INST_POSTCALL - ld r12,STK_PARM(R4)(r1) + ld r12,STK_PARAM(R4)(r1) std r4, 0(r12) std r5, 8(r12) std r6, 16(r12)
@@ -190,7 +188,7 @@ _GLOBAL(beat_hcall4) HCALL_INST_PRECALL - std r4,STK_PARM(R4)(r1) /* save ret buffer */ + std r4,STK_PARAM(R4)(r1) /* save ret buffer */ mr r11,r3 mr r3,r5
@@ -204,7 +202,7 @@ _GLOBAL(beat_hcall4) HCALL_INST_POSTCALL - ld r12,STK_PARM(R4)(r1) + ld r12,STK_PARAM(R4)(r1) std r4, 0(r12) std r5, 8(r12) std r6, 16(r12)
@@ -224,7 +222,7 @@ _GLOBAL(beat_hcall5) HCALL_INST_PRECALL - std r4,STK_PARM(R4)(r1) /* save ret buffer */ + std r4,STK_PARAM(R4)(r1) /* save ret buffer */ mr r11,r3 mr r3,r5
@@ -238,7 +236,7 @@ _GLOBAL(beat_hcall5) HCALL_INST_POSTCALL - ld r12,STK_PARM(R4)(r1) + ld r12,STK_PARAM(R4)(r1) std r4, 0(r12) std r5, 8(r12) std r6, 16(r12)
@@ -259,7 +257,7 @@ _GLOBAL(beat_hcall6) HCALL_INST_PRECALL - std r4,STK_PARM(R4)(r1) /* save ret buffer */ + std r4,STK_PARAM(R4)(r1) /* save ret buffer */ mr r11,r3 mr r3,r5
@@ -273,7 +271,7 @@ _GLOBAL(beat_hcall6) HCALL_INST_POSTCALL - ld r12,STK_PARM(R4)(r1) + ld r12,STK_PARAM(R4)(r1) std r4, 0(r12) std r5, 8(r12) std r6, 16(r12)
arch/powerpc/platforms/powernv/opal-takeover.S +0 -2
@@ -14,8 +14,6 @@ #include <asm/asm-offsets.h> #include <asm/opal.h> -#define STK_PARAM(i) (48 + ((i)-3)*8) - #define H_HAL_TAKEOVER 0x5124 #define H_HAL_TAKEOVER_QUERY_MAGIC -1
arch/powerpc/platforms/pseries/hvCall.S +35 -37
163 lines not on this page · raw message
PATCH 8/18 powerpc: merge VCPU_GPR
In reply to Michael NeulingMerge the defines of VCPU_GPR from different places.
---
arch/powerpc/include/asm/ppc_asm.h | 7 +++++++ arch/powerpc/kvm/book3s_hv_rmhandlers.S | 3 --- arch/powerpc/kvm/book3s_interrupts.S | 8 -------- arch/powerpc/kvm/booke_interrupts.S | 2 -- arch/powerpc/kvm/bookehv_interrupts.S | 1 - 5 files changed, 7 insertions(+), 14 deletions(-)
arch/powerpc/include/asm/ppc_asm.h +7 -0
@@ -178,6 +178,13 @@ END_FW_FTR_SECTION_IFSET(FW_FEATURE_SPLP#define HMT_HIGH or 3,3,3#define HMT_EXTRA_HIGH or 7,7,7 # power7 only +#ifdef CONFIG_PPC64 +#define ULONG_SIZE 8 +#else +#define ULONG_SIZE 4 +#endif +#define VCPU_GPR (n) (VCPU_GPRS + (n * ULONG_SIZE)) +#ifdef __KERNEL__#ifdef CONFIG_PPC64
arch/powerpc/kvm/book3s_hv_rmhandlers.S +0 -3
@@ -72,9 +72,6 @@ _GLOBAL(kvmppc_hv_entry_trampoline) mtsrr1 r6 RFI -#define ULONG_SIZE 8 -#define VCPU_GPR(n) (VCPU_GPRS + (n * ULONG_SIZE)) - /****************************************************************************** * * * Entry code *
arch/powerpc/kvm/book3s_interrupts.S +0 -8
@@ -25,19 +25,11 @@ #include <asm/exception-64s.h> #if defined(CONFIG_PPC_BOOK3S_64) - -#define ULONG_SIZE 8 #define FUNC(name) GLUE(.,name) - #elif defined(CONFIG_PPC_BOOK3S_32) - -#define ULONG_SIZE 4 #define FUNC(name) name - #endif /* CONFIG_PPC_BOOK3S_XX */ - -#define VCPU_GPR(n) (VCPU_GPRS + (n * ULONG_SIZE)) #define VCPU_LOAD_NVGPRS(vcpu) \ PPC_LL r14, VCPU_GPR(R14)(vcpu); \ PPC_LL r15, VCPU_GPR(R15)(vcpu); \
arch/powerpc/kvm/booke_interrupts.S +0 -2
@@ -25,8 +25,6 @@ #include <asm/page.h> #include <asm/asm-offsets.h> -#define VCPU_GPR(n) (VCPU_GPRS + (n * 4)) - /* The host stack layout: */ #define HOST_R1 0 /* Implied by stwu. */ #define HOST_CALLEE_LR 4
arch/powerpc/kvm/bookehv_interrupts.S +0 -1
@@ -37,7 +37,6 @@ #define LONGBYTES (BITS_PER_LONG / 8) -#define VCPU_GPR(n) (VCPU_GPRS + (n * LONGBYTES)) #define VCPU_GUEST_SPRG(n) (VCPU_GUEST_SPRGS + (n * LONGBYTES)) /* The host stack layout: */
PATCH 9/18 powerpc: change mtcrf to use real register names
In reply to Michael Neulingmtocrf define is just a wrapper around the real instructions so we can just use real register names here (ie. lower case).
Also remove braces in macro so this is possible.
---
arch/powerpc/include/asm/asm-compat.h | 2 +- arch/powerpc/include/asm/ppc_asm.h | 4 ++-- arch/powerpc/lib/copyuser_64.S | 6 +++--- arch/powerpc/lib/mem_64.S | 6 +++--- arch/powerpc/lib/memcpy_64.S | 6 +++--- 5 files changed, 12 insertions(+), 12 deletions(-)
arch/powerpc/include/asm/asm-compat.h +1 -1
@@ -29,7 +29,7 @@#define PPC_LLARX (t, a, b, eh) PPC_LDARX(t, a, b, eh)#define PPC_STLCX stringify_in_c(stdcx.)#define PPC_CNTLZL stringify_in_c(cntlzd) -#define PPC_MTOCRF (FXM ,RS ) MTOCRF((FXM), (RS)) +#define PPC_MTOCRF (FXM ,RS ) MTOCRF((FXM), RS)#define PPC_LR_STKOFF 16#define PPC_MIN_STKFRM 112#else /* 32-bit */
arch/powerpc/include/asm/ppc_asm.h +2 -2
@@ -384,9 +384,9 @@ END_FTR_SECTION_IFCLR(CPU_FTR_601)#ifdef CONFIG_PPC64 #define MTOCRF (FXM ,RS ) \ BEGIN_FTR_SECTION_NESTED(848); \ - mtcrf (FXM), (RS); \ + mtcrf (FXM), RS; \ FTR_SECTION_ELSE_NESTED(848); \ - mtocrf (FXM), (RS); \ + mtocrf (FXM), RS; \ ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_NOEXECUTE, 848)#endif
arch/powerpc/lib/copyuser_64.S +3 -3
@@ -30,7 +30,7 @@ _GLOBAL(__copy_tofrom_user_base) dcbt 0,r4 beq .Lcopy_page_4K andi. r6,r6,7 - PPC_MTOCRF(0x01,R5) + PPC_MTOCRF(0x01,r5) blt cr1,.Lshort_copy /* Below we want to nop out the bne if we're on a CPU that has the * CPU_FTR_UNALIGNED_LD_STD bit set and the CPU_FTR_CP_USE_DCBTZ bit
@@ -186,7 +186,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_ blr .Ldst_unaligned: - PPC_MTOCRF(0x01,R6) /* put #bytes to 8B bdry into cr7 */ + PPC_MTOCRF(0x01,r6) /* put #bytes to 8B bdry into cr7 */ subf r5,r6,r5 li r7,0 cmpldi cr1,r5,16
@@ -201,7 +201,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_ 2: bf cr7*4+1,3f 37: lwzx r0,r7,r4 83: stwx r0,r7,r3 -3: PPC_MTOCRF(0x01,R5) +3: PPC_MTOCRF(0x01,r5) add r4,r6,r4 add r3,r6,r3 b .Ldst_aligned
arch/powerpc/lib/mem_64.S +3 -3
@@ -19,7 +19,7 @@ _GLOBAL(memset) rlwimi r4,r4,16,0,15 cmplw cr1,r5,r0 /* do we get that far? */ rldimi r4,r4,32,0 - PPC_MTOCRF(1,R0) + PPC_MTOCRF(1,r0) mr r6,r3 blt cr1,8f beq+ 3f /* if already 8-byte aligned */
@@ -49,7 +49,7 @@ _GLOBAL(memset) bdnz 4b 5: srwi. r0,r5,3 clrlwi r5,r5,29 - PPC_MTOCRF(1,R0) + PPC_MTOCRF(1,r0) beq 8f bf 29,6f std r4,0(r6)
@@ -65,7 +65,7 @@ _GLOBAL(memset) std r4,0(r6) addi r6,r6,8 8: cmpwi r5,0 - PPC_MTOCRF(1,R5) + PPC_MTOCRF(1,r5) beqlr+ bf 29,9f stw r4,0(r6)
arch/powerpc/lib/memcpy_64.S +3 -3
@@ -16,7 +16,7 @@ BEGIN_FTR_SECTION FTR_SECTION_ELSE b memcpy_power7 ALT_FTR_SECTION_END_IFCLR(CPU_FTR_VMX_COPY) - PPC_MTOCRF(0x01,R5) + PPC_MTOCRF(0x01,r5) cmpldi cr1,r5,16 neg r6,r3 # LS 3 bits = # bytes to 8-byte dest bdry andi. r6,r6,7
@@ -158,7 +158,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_ blr .Ldst_unaligned: - PPC_MTOCRF(0x01,R6) # put #bytes to 8B bdry into cr7 + PPC_MTOCRF(0x01,r6) # put #bytes to 8B bdry into cr7 subf r5,r6,r5 li r7,0 cmpldi cr1,r5,16
@@ -173,7 +173,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_ 2: bf cr7*4+1,3f lwzx r0,r7,r4 stwx r0,r7,r3 -3: PPC_MTOCRF(0x01,R5) +3: PPC_MTOCRF(0x01,r5) add r4,r6,r4 add r3,r6,r3 b .Ldst_aligned
PATCH 10/18 powerpc: change LOAD_REG_ADDR to use real register names
In reply to Michael NeulingLOAD_REG_ADDR define is just a wrapper around real instructions so we can just use real register names here (ie. lower case).
---
arch/powerpc/platforms/powernv/opal-wrappers.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/platforms/powernv/opal-wrappers.S +1 -1
@@ -32,7 +32,7 @@ std r12,PACASAVEDMSR(r13); \ andc r12,r12,r0; \ mtmsrd r12,1; \ - LOAD_REG_ADDR(R0,.opal_return); \ + LOAD_REG_ADDR(r0,.opal_return); \ mtlr r0; \ li r0,MSR_DR|MSR_IR; \ andc r12,r12,r0; \
PATCH 11/18 powerpc: fixes for instructions not using correct register naming
In reply to Michael NeulingThese macros are using integers where they could be using logical names since they take registers.
We are going to enforce this soon, so fix these up now.
---
arch/powerpc/kernel/exceptions-64e.S | 8 ++++---- arch/powerpc/kernel/misc_64.S | 4 ++-- arch/powerpc/lib/ldstfp.S | 4 ++-- arch/powerpc/mm/tlb_nohash_low.S | 10 +++++----- 4 files changed, 13 insertions(+), 13 deletions(-)
arch/powerpc/kernel/exceptions-64e.S +4 -4
@@ -903,7 +903,7 @@ skpinv: addi r6,r6,1 /* Increment */ bne 1b /* If not, repeat */ /* Invalidate all TLBs */ - PPC_TLBILX_ALL(0,0) + PPC_TLBILX_ALL(R0,R0) sync isync
@@ -961,7 +961,7 @@ skpinv: addi r6,r6,1 /* Increment */ tlbwe /* Invalidate TLB1 */ - PPC_TLBILX_ALL(0,0) + PPC_TLBILX_ALL(R0,R0) sync isync
@@ -1020,7 +1020,7 @@ skpinv: addi r6,r6,1 /* Increment */ tlbwe /* Invalidate TLB1 */ - PPC_TLBILX_ALL(0,0) + PPC_TLBILX_ALL(R0,R0) sync isync
@@ -1138,7 +1138,7 @@ a2_tlbinit_after_iprot_flush: tlbwe #endif /* CONFIG_PPC_EARLY_DEBUG_WSP */ - PPC_TLBILX(0,0,0) + PPC_TLBILX(0,R0,R0) sync isync
arch/powerpc/kernel/misc_64.S +2 -2
@@ -309,7 +309,7 @@ _GLOBAL(real_205_readb) mtmsrd r0 sync isync - LBZCIX(R3,0,R3) + LBZCIX(R3,R0,R3) isync mtmsrd r7 sync
@@ -324,7 +324,7 @@ _GLOBAL(real_205_writeb) mtmsrd r0 sync isync - STBCIX(R3,0,R4) + STBCIX(R3,R0,R4) isync mtmsrd r7 sync
arch/powerpc/lib/ldstfp.S +2 -2
@@ -332,7 +332,7 @@ _GLOBAL(do_lxvd2x) beq cr7,1f STXVD2X(0,R1,R8) 1: li r9,-EFAULT -2: LXVD2X(0,0,R4) +2: LXVD2X(0,R0,R4) li r9,0 3: beq cr7,4f bl put_vsr
@@ -361,7 +361,7 @@ _GLOBAL(do_stxvd2x) STXVD2X(0,R1,R8) bl get_vsr 1: li r9,-EFAULT -2: STXVD2X(0,0,R4) +2: STXVD2X(0,R0,R4) li r9,0 3: beq cr7,4f LXVD2X(0,R1,R8)
arch/powerpc/mm/tlb_nohash_low.S +5 -5
@@ -266,7 +266,7 @@ BEGIN_MMU_FTR_SECTION andi. r3,r3,MMUCSR0_TLBFI@l bne 1b MMU_FTR_SECTION_ELSE - PPC_TLBILX_ALL(0,0) + PPC_TLBILX_ALL(R0,R0) ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_USE_TLBILX) msync isync
@@ -279,7 +279,7 @@ BEGIN_MMU_FTR_SECTION wrteei 0 mfspr r4,SPRN_MAS6 /* save MAS6 */ mtspr SPRN_MAS6,r3 - PPC_TLBILX_PID(0,0) + PPC_TLBILX_PID(R0,R0) mtspr SPRN_MAS6,r4 /* restore MAS6 */ wrtee r10 MMU_FTR_SECTION_ELSE
@@ -331,7 +331,7 @@ _GLOBAL(_tlbil_pid) mfmsr r10 wrteei 0 mtspr SPRN_MAS6,r4 - PPC_TLBILX_PID(0,0) + PPC_TLBILX_PID(R0,R0) wrtee r10 msync isync
@@ -343,14 +343,14 @@ _GLOBAL(_tlbil_pid_noind) ori r4,r4,MAS6_SIND wrteei 0 mtspr SPRN_MAS6,r4 - PPC_TLBILX_PID(0,0) + PPC_TLBILX_PID(R0,R0) wrtee r10 msync isync blr _GLOBAL(_tlbil_all) - PPC_TLBILX_ALL(0,0) + PPC_TLBILX_ALL(R0,R0) msync isync blr
PATCH 12/18 powerpc: fix VSX macros so register names aren't wrapped
In reply to Michael NeulingWe need to do this so we can enforce the name of a and b in called macros PPC_RA/B later.
---
arch/powerpc/include/asm/ppc-opcode.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/powerpc/include/asm/ppc-opcode.h +3 -3
@@ -201,11 +201,11 @@#define VSX_XX1 (s, a, b) (__PPC_XS(s) | __PPC_RA(a) | __PPC_RB(b))#define VSX_XX3 (t, a, b) (__PPC_XT(t) | __PPC_XA(a) | __PPC_XB(b))#define STXVD2X (s, a, b) stringify_in_c(.long PPC_INST_STXVD2X | \ - VSX_XX1((s), (a), (b))) + VSX_XX1((s), a, b))#define LXVD2X (s, a, b) stringify_in_c(.long PPC_INST_LXVD2X | \ - VSX_XX1((s), (a), (b))) + VSX_XX1((s), a, b))#define XXLOR (t, a, b) stringify_in_c(.long PPC_INST_XXLOR | \ - VSX_XX3((t), (a), (b))) + VSX_XX3((t), a, b))#define PPC_NAP stringify_in_c(.long PPC_INST_NAP)#define PPC_SLEEP stringify_in_c(.long PPC_INST_SLEEP)
PATCH 13/18 powerpc: introduce new ___PPC_RA/B/S/T macros
In reply to Michael NeulingThese are currently the same as __PPC_RA/B/S/T but we'll wrap them soon.
---
arch/powerpc/include/asm/ppc-opcode.h | 4 ++++ 1 file changed, 4 insertions(+)
arch/powerpc/include/asm/ppc-opcode.h +4 -0
@@ -111,6 +111,10 @@#define PPC_INST_STBCIX 0x7c0007aa/* macros to insert fields into opcodes */ +#define ___PPC_RA (a) (((a) & 0x1f) << 16) +#define ___PPC_RB (b) (((b) & 0x1f) << 11) +#define ___PPC_RS (s) (((s) & 0x1f) << 21) +#define ___PPC_RT (t) ___PPC_RS(t)#define __PPC_RA (a) (((a) & 0x1f) << 16)#define __PPC_RB (b) (((b) & 0x1f) << 11)#define __PPC_RS (s) (((s) & 0x1f) << 21)
PATCH 14/18 powerpc: start using ___PPC_RA/B/S/T where necessary
In reply to Michael NeulingNow have ___PPC_RA/B/S/T we can use it in some places. These are places where we can't use the existing defines which will soon enforce R0-R31 usage.
The macros being changed here are being used in inline asm, which can't convert to enforce the R0-R31 usage.
---
arch/powerpc/include/asm/ppc-opcode.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
arch/powerpc/include/asm/ppc-opcode.h +6 -6
@@ -147,13 +147,13 @@#define PPC_DCBZL (a, b) stringify_in_c(.long PPC_INST_DCBZL | \ __PPC_RA(a) | __PPC_RB(b))#define PPC_LDARX (t, a, b, eh) stringify_in_c(.long PPC_INST_LDARX | \ - __PPC_RT(t) | __PPC_RA(a) | \ - __PPC_RB(b) | __PPC_EH(eh)) + ___PPC_RT(t) | ___PPC_RA(a) | \ + ___PPC_RB(b) | __PPC_EH(eh))#define PPC_LWARX (t, a, b, eh) stringify_in_c(.long PPC_INST_LWARX | \ - __PPC_RT(t) | __PPC_RA(a) | \ - __PPC_RB(b) | __PPC_EH(eh)) + ___PPC_RT(t) | ___PPC_RA(a) | \ + ___PPC_RB(b) | __PPC_EH(eh))#define PPC_MSGSND (b) stringify_in_c(.long PPC_INST_MSGSND | \ - __PPC_RB(b)) + ___PPC_RB(b))#define PPC_POPCNTB (a, s) stringify_in_c(.long PPC_INST_POPCNTB | \ __PPC_RA(a) | __PPC_RS(s))#define PPC_POPCNTD (a, s) stringify_in_c(.long PPC_INST_POPCNTD | \
@@ -171,7 +171,7 @@#define PPC_WAIT (w) stringify_in_c(.long PPC_INST_WAIT | \ __PPC_WC(w))#define PPC_TLBIE (lp,a) stringify_in_c(.long PPC_INST_TLBIE | \ - __PPC_RB(a) | __PPC_RS(lp)) + ___PPC_RB(a) | ___PPC_RS(lp))#define PPC_TLBSRX_DOT (a,b) stringify_in_c(.long PPC_INST_TLBSRX_DOT | \ __PPC_RA(a) | __PPC_RB(b))#define PPC_TLBIVAX (a,b) stringify_in_c(.long PPC_INST_TLBIVAX | \
PATCH 15/18 powerpc: Introduce new __REG_R macros
In reply to Michael Neuling---
arch/powerpc/include/asm/ppc_asm.h | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+)
arch/powerpc/include/asm/ppc_asm.h +32 -0
@@ -576,6 +576,38 @@ END_FTR_SECTION_IFCLR(CPU_FTR_601)#define R30 30#define R31 31 +#define __REG_R0 0 +#define __REG_R1 1 +#define __REG_R2 2 +#define __REG_R3 3 +#define __REG_R4 4 +#define __REG_R5 5 +#define __REG_R6 6 +#define __REG_R7 7 +#define __REG_R8 8 +#define __REG_R9 9 +#define __REG_R10 10 +#define __REG_R11 11 +#define __REG_R12 12 +#define __REG_R13 13 +#define __REG_R14 14 +#define __REG_R15 15 +#define __REG_R16 16 +#define __REG_R17 17 +#define __REG_R18 18 +#define __REG_R19 19 +#define __REG_R20 20 +#define __REG_R21 21 +#define __REG_R22 22 +#define __REG_R23 23 +#define __REG_R24 24 +#define __REG_R25 25 +#define __REG_R26 26 +#define __REG_R27 27 +#define __REG_R28 28 +#define __REG_R29 29 +#define __REG_R30 30 +#define __REG_R31 31/* Floating Point Registers (FPRs) */
PATCH 16/18 powerpc: enforce usage of R0-R31 where possible
In reply to Michael NeulingEnforce the use of R0-R31 in macros where possible now we have all the fixes in.
R0-R31 macros are removed here so that can't be used anymore. They should not be defined anywhere.
---
arch/powerpc/include/asm/ppc-opcode.h | 8 ++--- arch/powerpc/include/asm/ppc_asm.h | 50 ++++++---------------------------- arch/powerpc/kernel/fpu.S | 12 ++++---- arch/powerpc/kvm/booke_interrupts.S | 3 +- 4 files changed, 23 insertions(+), 50 deletions(-)
arch/powerpc/include/asm/ppc-opcode.h +4 -4
@@ -115,10 +115,10 @@#define ___PPC_RB (b) (((b) & 0x1f) << 11)#define ___PPC_RS (s) (((s) & 0x1f) << 21)#define ___PPC_RT (t) ___PPC_RS(t) -#define __PPC_RA (a) (((a) & 0x1f) << 16) -#define __PPC_RB (b) (((b) & 0x1f) << 11) -#define __PPC_RS (s) (((s) & 0x1f) << 21) -#define __PPC_RT (s) __PPC_RS(s) +#define __PPC_RA (a) ___PPC_RA(__REG_##a) +#define __PPC_RB (b) ___PPC_RB(__REG_##b) +#define __PPC_RS (s) ___PPC_RS(__REG_##s) +#define __PPC_RT (t) ___PPC_RT(__REG_##t)#define __PPC_XA (a) ((((a) & 0x1f) << 16) | (((a) & 0x20) >> 3))#define __PPC_XB (b) ((((b) & 0x1f) << 11) | (((b) & 0x20) >> 4))#define __PPC_XS (s) ((((s) & 0x1f) << 21) | (((s) & 0x20) >> 5))
arch/powerpc/include/asm/ppc_asm.h +10 -40
90 lines not on this page · raw message
arch/powerpc/kernel/fpu.S +7 -5
@@ -26,7 +26,7 @@ #include <asm/ptrace.h> #ifdef CONFIG_VSX -#define REST_32FPVSRS(n,c,base) \ +#define __REST_32FPVSRS(n,c,base) \ BEGIN_FTR_SECTION \ b 2f; \ END_FTR_SECTION_IFSET(CPU_FTR_VSX); \
@@ -35,7 +35,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX); 2: REST_32VSRS(n,c,base); \ 3: -#define SAVE_32FPVSRS(n,c,base) \ +#define __SAVE_32FPVSRS(n,c,base) \ BEGIN_FTR_SECTION \ b 2f; \ END_FTR_SECTION_IFSET(CPU_FTR_VSX); \
@@ -44,9 +44,11 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX); 2: SAVE_32VSRS(n,c,base); \ 3: #else -#define REST_32FPVSRS(n,b,base) REST_32FPRS(n, base) -#define SAVE_32FPVSRS(n,b,base) SAVE_32FPRS(n, base) +#define __REST_32FPVSRS(n,b,base) REST_32FPRS(n, base) +#define __SAVE_32FPVSRS(n,b,base) SAVE_32FPRS(n, base) #endif +#define REST_32FPVSRS(n,c,base) __REST_32FPVSRS(n,__REG_##c,__REG_##base) +#define SAVE_32FPVSRS(n,c,base) __SAVE_32FPVSRS(n,__REG_##c,__REG_##base) /* * This task wants to use the FPU now.
@@ -79,7 +81,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX) beq 1f toreal(r4) addi r4,r4,THREAD /* want last_task_used_math->thread */ - SAVE_32FPVSRS(0, r5, r4) + SAVE_32FPVSRS(0, R5, R4) mffs fr0 stfd fr0,THREAD_FPSCR(r4) PPC_LL r5,PT_REGS(r4)
arch/powerpc/kvm/booke_interrupts.S +2 -1
@@ -34,7 +34,8 @@ #define HOST_R2 12 #define HOST_CR 16 #define HOST_NV_GPRS 20 -#define HOST_NV_GPR(n) (HOST_NV_GPRS + ((n - 14) * 4)) +#define __HOST_NV_GPR(n) (HOST_NV_GPRS + ((n - 14) * 4)) +#define HOST_NV_GPR(n) __HOST_NV_GPR(__REG_##n) #define HOST_MIN_STACK_SIZE (HOST_NV_GPR(R31) + 4) #define HOST_STACK_SIZE (((HOST_MIN_STACK_SIZE + 15) / 16) * 16) /* Align. */ #define HOST_STACK_LR (HOST_STACK_SIZE + 4) /* In caller stack frame. */
PATCH 17/18 powerpc: Add defines for RA 0-R31
In reply to Michael NeulingR0 is special since it'll be 0.
---
arch/powerpc/include/asm/ppc-opcode.h | 1 + arch/powerpc/include/asm/ppc_asm.h | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+)
arch/powerpc/include/asm/ppc-opcode.h +1 -0
@@ -116,6 +116,7 @@#define ___PPC_RS (s) (((s) & 0x1f) << 21)#define ___PPC_RT (t) ___PPC_RS(t)#define __PPC_RA (a) ___PPC_RA(__REG_##a) +#define __PPC_RA0 (a) ___PPC_RA(__REGA0_##a)#define __PPC_RB (b) ___PPC_RB(__REG_##b)#define __PPC_RS (s) ___PPC_RS(__REG_##s)#define __PPC_RT (t) ___PPC_RT(__REG_##t)
arch/powerpc/include/asm/ppc_asm.h +33 -0
@@ -579,6 +579,39 @@ END_FTR_SECTION_IFCLR(CPU_FTR_601)#define __REG_R30 30#define __REG_R31 31 +#define __REGA0_0 0 +#define __REGA0_R1 1 +#define __REGA0_R2 2 +#define __REGA0_R3 3 +#define __REGA0_R4 4 +#define __REGA0_R5 5 +#define __REGA0_R6 6 +#define __REGA0_R7 7 +#define __REGA0_R8 8 +#define __REGA0_R9 9 +#define __REGA0_R10 10 +#define __REGA0_R11 11 +#define __REGA0_R12 12 +#define __REGA0_R13 13 +#define __REGA0_R14 14 +#define __REGA0_R15 15 +#define __REGA0_R16 16 +#define __REGA0_R17 17 +#define __REGA0_R18 18 +#define __REGA0_R19 19 +#define __REGA0_R20 20 +#define __REGA0_R21 21 +#define __REGA0_R22 22 +#define __REGA0_R23 23 +#define __REGA0_R24 24 +#define __REGA0_R25 25 +#define __REGA0_R26 26 +#define __REGA0_R27 27 +#define __REGA0_R28 28 +#define __REGA0_R29 29 +#define __REGA0_R30 30 +#define __REGA0_R31 31 +/* Floating Point Registers (FPRs) */ #define fr0 0
PATCH 18/18 powerpc: enforce usage of RA 0-R31 where possible
In reply to Michael NeulingSome macros use RA where when RA=R0 the values is 0, so make this the enforced mnemonic in the macro.
Idea suggested by Andreas Schwab.
---
arch/powerpc/include/asm/ppc-opcode.h | 14 +++++++------- arch/powerpc/kernel/cpu_setup_a2.S | 2 +- arch/powerpc/kernel/exceptions-64e.S | 8 ++++---- arch/powerpc/mm/tlb_low_64e.S | 10 +++++----- arch/powerpc/mm/tlb_nohash_low.S | 16 ++++++++-------- 5 files changed, 25 insertions(+), 25 deletions(-)
arch/powerpc/include/asm/ppc-opcode.h +7 -7
@@ -165,7 +165,7 @@#define PPC_RFDI stringify_in_c(.long PPC_INST_RFDI)#define PPC_RFMCI stringify_in_c(.long PPC_INST_RFMCI)#define PPC_TLBILX (t, a, b) stringify_in_c(.long PPC_INST_TLBILX | \ - __PPC_T_TLB(t) | __PPC_RA(a) | __PPC_RB(b)) + __PPC_T_TLB(t) | __PPC_RA0(a) | __PPC_RB(b))#define PPC_TLBILX_ALL (a, b) PPC_TLBILX(0, a, b)#define PPC_TLBILX_PID (a, b) PPC_TLBILX(1, a, b)#define PPC_TLBILX_VA (a, b) PPC_TLBILX(3, a, b)
@@ -174,23 +174,23 @@#define PPC_TLBIE (lp,a) stringify_in_c(.long PPC_INST_TLBIE | \ ___PPC_RB(a) | ___PPC_RS(lp))#define PPC_TLBSRX_DOT (a,b) stringify_in_c(.long PPC_INST_TLBSRX_DOT | \ - __PPC_RA(a) | __PPC_RB(b)) + __PPC_RA0(a) | __PPC_RB(b))#define PPC_TLBIVAX (a,b) stringify_in_c(.long PPC_INST_TLBIVAX | \ - __PPC_RA(a) | __PPC_RB(b)) + __PPC_RA0(a) | __PPC_RB(b))#define PPC_ERATWE (s, a, w) stringify_in_c(.long PPC_INST_ERATWE | \ __PPC_RS(s) | __PPC_RA(a) | __PPC_WS(w))#define PPC_ERATRE (s, a, w) stringify_in_c(.long PPC_INST_ERATRE | \ __PPC_RS(s) | __PPC_RA(a) | __PPC_WS(w))#define PPC_ERATILX (t, a, b) stringify_in_c(.long PPC_INST_ERATILX | \ - __PPC_T_TLB(t) | __PPC_RA(a) | \ + __PPC_T_TLB(t) | __PPC_RA0(a) | \ __PPC_RB(b))#define PPC_ERATIVAX (s, a, b) stringify_in_c(.long PPC_INST_ERATIVAX | \ - __PPC_RS(s) | __PPC_RA(a) | __PPC_RB(b)) + __PPC_RS(s) | __PPC_RA0(a) | __PPC_RB(b))#define PPC_ERATSX (t, a, w) stringify_in_c(.long PPC_INST_ERATSX | \ - __PPC_RS(t) | __PPC_RA(a) | __PPC_RB(b)) + __PPC_RS(t) | __PPC_RA0(a) | __PPC_RB(b))#define PPC_ERATSX_DOT (t, a, w) stringify_in_c(.long PPC_INST_ERATSX_DOT | \ - __PPC_RS(t) | __PPC_RA(a) | __PPC_RB(b)) + __PPC_RS(t) | __PPC_RA0(a) | __PPC_RB(b))#define PPC_SLBFEE_DOT (t, b) stringify_in_c(.long PPC_INST_SLBFEE | \ __PPC_RT(t) | __PPC_RB(b))/* PASemi instructions */
arch/powerpc/kernel/cpu_setup_a2.S +1 -1
@@ -112,7 +112,7 @@ _icswx_skip_guest: * a bolted entry though it will be in LRU and so will go away eventually * but let's not bother for now */ - PPC_ERATILX(0,R0,R0) + PPC_ERATILX(0,0,R0) 1: blr
arch/powerpc/kernel/exceptions-64e.S +4 -4
@@ -903,7 +903,7 @@ skpinv: addi r6,r6,1 /* Increment */ bne 1b /* If not, repeat */ /* Invalidate all TLBs */ - PPC_TLBILX_ALL(R0,R0) + PPC_TLBILX_ALL(0,R0) sync isync
@@ -961,7 +961,7 @@ skpinv: addi r6,r6,1 /* Increment */ tlbwe /* Invalidate TLB1 */ - PPC_TLBILX_ALL(R0,R0) + PPC_TLBILX_ALL(0,R0) sync isync
@@ -1020,7 +1020,7 @@ skpinv: addi r6,r6,1 /* Increment */ tlbwe /* Invalidate TLB1 */ - PPC_TLBILX_ALL(R0,R0) + PPC_TLBILX_ALL(0,R0) sync isync
@@ -1138,7 +1138,7 @@ a2_tlbinit_after_iprot_flush: tlbwe #endif /* CONFIG_PPC_EARLY_DEBUG_WSP */ - PPC_TLBILX(0,R0,R0) + PPC_TLBILX(0,0,R0) sync isync
arch/powerpc/mm/tlb_low_64e.S +5 -5
@@ -126,7 +126,7 @@ BEGIN_MMU_FTR_SECTION /* Set the TLB reservation and search for existing entry. Then load * the entry. */ - PPC_TLBSRX_DOT(R0,R16) + PPC_TLBSRX_DOT(0,R16) ldx r14,r14,r15 /* grab pgd entry */ beq normal_tlb_miss_done /* tlb exists already, bail */ MMU_FTR_SECTION_ELSE
@@ -395,7 +395,7 @@ BEGIN_MMU_FTR_SECTION /* Set the TLB reservation and search for existing entry. Then load * the entry. */ - PPC_TLBSRX_DOT(R0,R16) + PPC_TLBSRX_DOT(0,R16) ld r14,0(r10) beq normal_tlb_miss_done MMU_FTR_SECTION_ELSE
@@ -528,7 +528,7 @@ BEGIN_MMU_FTR_SECTION /* Search if we already have a TLB entry for that virtual address, and * if we do, bail out. */ - PPC_TLBSRX_DOT(R0,R16) + PPC_TLBSRX_DOT(0,R16) beq virt_page_table_tlb_miss_done END_MMU_FTR_SECTION_IFSET(MMU_FTR_USE_TLBRSRV)
@@ -779,7 +779,7 @@ htw_tlb_miss: * * MAS1:IND should be already set based on MAS4 */ - PPC_TLBSRX_DOT(R0,R16) + PPC_TLBSRX_DOT(0,R16) beq htw_tlb_miss_done /* Now, we need to walk the page tables. First check if we are in
@@ -919,7 +919,7 @@ tlb_load_linear: mtspr SPRN_MAS1,r15 /* Already somebody there ? */ - PPC_TLBSRX_DOT(R0,R16) + PPC_TLBSRX_DOT(0,R16) beq tlb_load_linear_done /* Now we build the remaining MAS. MAS0 and 2 should be fine
arch/powerpc/mm/tlb_nohash_low.S +8 -8
@@ -266,7 +266,7 @@ BEGIN_MMU_FTR_SECTION andi. r3,r3,MMUCSR0_TLBFI@l bne 1b MMU_FTR_SECTION_ELSE - PPC_TLBILX_ALL(R0,R0) + PPC_TLBILX_ALL(0,R0) ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_USE_TLBILX) msync isync
@@ -279,7 +279,7 @@ BEGIN_MMU_FTR_SECTION wrteei 0 mfspr r4,SPRN_MAS6 /* save MAS6 */ mtspr SPRN_MAS6,r3 - PPC_TLBILX_PID(R0,R0) + PPC_TLBILX_PID(0,R0) mtspr SPRN_MAS6,r4 /* restore MAS6 */ wrtee r10 MMU_FTR_SECTION_ELSE
@@ -313,7 +313,7 @@ BEGIN_MMU_FTR_SECTION mtspr SPRN_MAS1,r4 tlbwe MMU_FTR_SECTION_ELSE - PPC_TLBILX_VA(R0,R3) + PPC_TLBILX_VA(0,R3) ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_USE_TLBILX) msync isync
@@ -331,7 +331,7 @@ _GLOBAL(_tlbil_pid) mfmsr r10 wrteei 0 mtspr SPRN_MAS6,r4 - PPC_TLBILX_PID(R0,R0) + PPC_TLBILX_PID(0,R0) wrtee r10 msync isync
@@ -343,14 +343,14 @@ _GLOBAL(_tlbil_pid_noind) ori r4,r4,MAS6_SIND wrteei 0 mtspr SPRN_MAS6,r4 - PPC_TLBILX_PID(R0,R0) + PPC_TLBILX_PID(0,R0) wrtee r10 msync isync blr _GLOBAL(_tlbil_all) - PPC_TLBILX_ALL(R0,R0) + PPC_TLBILX_ALL(0,R0) msync isync blr
@@ -364,7 +364,7 @@ _GLOBAL(_tlbil_va) beq 1f rlwimi r4,r6,MAS6_SIND_SHIFT,MAS6_SIND 1: mtspr SPRN_MAS6,r4 /* assume AS=0 for now */ - PPC_TLBILX_VA(R0,R3) + PPC_TLBILX_VA(0,R3) msync isync wrtee r10
@@ -379,7 +379,7 @@ _GLOBAL(_tlbivax_bcast) beq 1f rlwimi r4,r6,MAS6_SIND_SHIFT,MAS6_SIND 1: mtspr SPRN_MAS6,r4 /* assume AS=0 for now */ - PPC_TLBIVAX(R0,R3) + PPC_TLBIVAX(0,R3) eieio tlbsync sync
Quoted 3 lines · Segher Boessenkool
Quoted 1 line
+err1; dcbz r0,r3
There is no such instruction, you probably meant "dcbz 0,r3"?
There certainly is such an instruction, though it doesn't do exactly what a naive reader might expect. Using 0 rather than r0 or %r0 improves readability but makes no difference to the assembler or the cpu.
Paul.
Quoted 9 lines · Paul Mackerras
Quoted 3 lines · Segher Boessenkool
Quoted 1 line
+err1; dcbz r0,r3
There is no such instruction, you probably meant "dcbz 0,r3"?
There certainly is such an instruction, though it doesn't do exactly what a naive reader might expect. Using 0 rather than r0 or %r0 improves readability but makes no difference to the assembler or the cpu.
The assembler can't tell that you used r0 rather than 0, because that's handled by the preprocessor, but it seems like a bug (or at least lax error checking) that it accepts %r0 there, and that objdump decodes it as "dcbz r0,r3" rather than "dcbz 0,r3".
It's also odd that objdump produces output containing "r3" (not %r3) when the assembler won't directly accept it.
-Scott
Quoted 6 lines · Scott Wood
The assembler can't tell that you used r0 rather than 0, because that's
handled by the preprocessor, but it seems like a bug (or at least lax error checking) that it accepts %r0 there, and that objdump decodes it as "dcbz r0,r3" rather than "dcbz 0,r3".
Well, this is the domain of bike shed painting :-) the syntax of the instruction is:
dcbz RA,RB
Now, of course, like other RA,RB pairs it has the semantic that
if RA = 0 then b <- 0
else b <- (RA)
EA <- b + (RB)
If we were to be pendantic and our assembly could also enforce the use of % for registers, I suppose it would make sense to require 0 rather than %0 for those "RA" forms to make it absolutely clear that we are talking about 0 and not r0 in this specific case, I agree, but in the current shape of the asm, I don't think that's something to expect.
Cheers,
Ben.
Quoted 1 line · Scott Wood
and that objdump decodes it as "dcbz r0,r3" rather than "dcbz 0,r3".
<http://permalink.gmane.org/gmane.comp.gnu.binutils/57870>
Andreas.
Signature · 3 lines
Andreas Schwab, [email protected] GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different."
Quoted 14 lines · Anton Blanchard
I blame Mikey for this. He elevated my slightly dubious testcase:
# dd if=/dev/zero of=/dev/null bs=1M count=10000to benchmark status. And naturally we need to be number 1 at creating zeros. So lets improve
__clear_usersome more.As Paul suggests we can use dcbz for large lengths. This patch gets the destination cacheline aligned then uses dcbz on whole cachelines.
Before:
10485760000 bytes (10 GB) copied, 0.414744 s, 25.3 GB/s
Quoted 6 lines
After:
10485760000 bytes (10 GB) copied, 0.268597 s, 39.0 GB/s39 GB/s, a new record.
Signed-off-by Anton Blanchard <[email protected]>
Besides the comments from Segher, feel free to add:
Didn't help performance all that much on pa6t, but it didn't go down. Too low on cycles to actually analyze why at this time.
-OIof