Commit 5ae8fabc authored by Christophe Leroy's avatar Christophe Leroy Committed by Michael Ellerman

powerpc/32: move MSR_PR test into EXCEPTION_PROLOG_0

In order to simplify  VMAP stack implementation, move
MSR_PR test into EXCEPTION_PROLOG_0.

This requires to not modify cr0 between EXCEPTION_PROLOG_0
and EXCEPTION_PROLOG_1.
Signed-off-by: default avatarChristophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/5c8b5bba692b92654dbd363a229a1ba91db725bb.1576916812.git.christophe.leroy@c-s.fr
parent 1ca9db5b
...@@ -19,12 +19,12 @@ ...@@ -19,12 +19,12 @@
.macro EXCEPTION_PROLOG_0 .macro EXCEPTION_PROLOG_0
mtspr SPRN_SPRG_SCRATCH0,r10 mtspr SPRN_SPRG_SCRATCH0,r10
mtspr SPRN_SPRG_SCRATCH1,r11 mtspr SPRN_SPRG_SCRATCH1,r11
mfspr r11, SPRN_SRR1 /* check whether user or kernel */
mfcr r10 mfcr r10
andi. r11, r11, MSR_PR
.endm .endm
.macro EXCEPTION_PROLOG_1 .macro EXCEPTION_PROLOG_1
mfspr r11,SPRN_SRR1 /* check whether user or kernel */
andi. r11,r11,MSR_PR
tophys(r11,r1) /* use tophys(r1) if kernel */ tophys(r11,r1) /* use tophys(r1) if kernel */
beq 1f beq 1f
mfspr r11,SPRN_SPRG_THREAD mfspr r11,SPRN_SPRG_THREAD
......
...@@ -497,8 +497,8 @@ InstructionTLBError: ...@@ -497,8 +497,8 @@ InstructionTLBError:
DataTLBError: DataTLBError:
EXCEPTION_PROLOG_0 EXCEPTION_PROLOG_0
mfspr r11, SPRN_DAR mfspr r11, SPRN_DAR
cmpwi cr0, r11, RPN_PATTERN cmpwi cr1, r11, RPN_PATTERN
beq- FixupDAR /* must be a buggy dcbX, icbi insn. */ beq- cr1, FixupDAR /* must be a buggy dcbX, icbi insn. */
DARFixed:/* Return from dcbx instruction bug workaround */ DARFixed:/* Return from dcbx instruction bug workaround */
EXCEPTION_PROLOG_1 EXCEPTION_PROLOG_1
EXCEPTION_PROLOG_2 EXCEPTION_PROLOG_2
...@@ -531,9 +531,9 @@ DARFixed:/* Return from dcbx instruction bug workaround */ ...@@ -531,9 +531,9 @@ DARFixed:/* Return from dcbx instruction bug workaround */
DataBreakpoint: DataBreakpoint:
EXCEPTION_PROLOG_0 EXCEPTION_PROLOG_0
mfspr r11, SPRN_SRR0 mfspr r11, SPRN_SRR0
cmplwi cr0, r11, (.Ldtlbie - PAGE_OFFSET)@l cmplwi cr1, r11, (.Ldtlbie - PAGE_OFFSET)@l
cmplwi cr7, r11, (.Litlbie - PAGE_OFFSET)@l cmplwi cr7, r11, (.Litlbie - PAGE_OFFSET)@l
beq- cr0, 11f beq- cr1, 11f
beq- cr7, 11f beq- cr7, 11f
EXCEPTION_PROLOG_1 EXCEPTION_PROLOG_1
EXCEPTION_PROLOG_2 EXCEPTION_PROLOG_2
...@@ -578,9 +578,9 @@ FixupDAR:/* Entry point for dcbx workaround. */ ...@@ -578,9 +578,9 @@ FixupDAR:/* Entry point for dcbx workaround. */
mfspr r10, SPRN_SRR0 mfspr r10, SPRN_SRR0
mtspr SPRN_MD_EPN, r10 mtspr SPRN_MD_EPN, r10
rlwinm r11, r10, 16, 0xfff8 rlwinm r11, r10, 16, 0xfff8
cmpli cr0, r11, PAGE_OFFSET@h cmpli cr1, r11, PAGE_OFFSET@h
mfspr r11, SPRN_M_TWB /* Get level 1 table */ mfspr r11, SPRN_M_TWB /* Get level 1 table */
blt+ 3f blt+ cr1, 3f
rlwinm r11, r10, 16, 0xfff8 rlwinm r11, r10, 16, 0xfff8
0: cmpli cr7, r11, (PAGE_OFFSET + 0x1800000)@h 0: cmpli cr7, r11, (PAGE_OFFSET + 0x1800000)@h
...@@ -595,7 +595,7 @@ FixupDAR:/* Entry point for dcbx workaround. */ ...@@ -595,7 +595,7 @@ FixupDAR:/* Entry point for dcbx workaround. */
3: 3:
lwz r11, (swapper_pg_dir-PAGE_OFFSET)@l(r11) /* Get the level 1 entry */ lwz r11, (swapper_pg_dir-PAGE_OFFSET)@l(r11) /* Get the level 1 entry */
mtspr SPRN_MD_TWC, r11 mtspr SPRN_MD_TWC, r11
mtcr r11 mtcrf 0x01, r11
mfspr r11, SPRN_MD_TWC mfspr r11, SPRN_MD_TWC
lwz r11, 0(r11) /* Get the pte */ lwz r11, 0(r11) /* Get the pte */
bt 28,200f /* bit 28 = Large page (8M) */ bt 28,200f /* bit 28 = Large page (8M) */
...@@ -608,16 +608,16 @@ FixupDAR:/* Entry point for dcbx workaround. */ ...@@ -608,16 +608,16 @@ FixupDAR:/* Entry point for dcbx workaround. */
* no need to include them here */ * no need to include them here */
xoris r10, r11, 0x7c00 /* check if major OP code is 31 */ xoris r10, r11, 0x7c00 /* check if major OP code is 31 */
rlwinm r10, r10, 0, 21, 5 rlwinm r10, r10, 0, 21, 5
cmpwi cr0, r10, 2028 /* Is dcbz? */ cmpwi cr1, r10, 2028 /* Is dcbz? */
beq+ 142f beq+ cr1, 142f
cmpwi cr0, r10, 940 /* Is dcbi? */ cmpwi cr1, r10, 940 /* Is dcbi? */
beq+ 142f beq+ cr1, 142f
cmpwi cr0, r10, 108 /* Is dcbst? */ cmpwi cr1, r10, 108 /* Is dcbst? */
beq+ 144f /* Fix up store bit! */ beq+ cr1, 144f /* Fix up store bit! */
cmpwi cr0, r10, 172 /* Is dcbf? */ cmpwi cr1, r10, 172 /* Is dcbf? */
beq+ 142f beq+ cr1, 142f
cmpwi cr0, r10, 1964 /* Is icbi? */ cmpwi cr1, r10, 1964 /* Is icbi? */
beq+ 142f beq+ cr1, 142f
141: mfspr r10,SPRN_M_TW 141: mfspr r10,SPRN_M_TW
b DARFixed /* Nope, go back to normal TLB processing */ b DARFixed /* Nope, go back to normal TLB processing */
...@@ -676,8 +676,9 @@ FixupDAR:/* Entry point for dcbx workaround. */ ...@@ -676,8 +676,9 @@ FixupDAR:/* Entry point for dcbx workaround. */
add r10, r10, r30 ;b 151f add r10, r10, r30 ;b 151f
add r10, r10, r31 add r10, r10, r31
151: 151:
rlwinm. r11,r11,19,24,28 /* offset into jump table for reg RA */ rlwinm r11,r11,19,24,28 /* offset into jump table for reg RA */
beq 152f /* if reg RA is zero, don't add it */ cmpwi cr1, r11, 0
beq cr1, 152f /* if reg RA is zero, don't add it */
addi r11, r11, 150b@l /* add start of table */ addi r11, r11, 150b@l /* add start of table */
mtctr r11 /* load ctr with jump address */ mtctr r11 /* load ctr with jump address */
rlwinm r11,r11,0,16,10 /* make sure we don't execute this more than once */ rlwinm r11,r11,0,16,10 /* make sure we don't execute this more than once */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment