Commit fcd4b43c authored by Christophe Leroy's avatar Christophe Leroy Committed by Michael Ellerman
Browse files

powerpc/40x: Save SRR0/SRR1 and r10/r11 earlier in critical exception



In order to be able to switch MMU on in exception prolog, save
SRR0 and SRR1 earlier.

Also save r10 and r11 into stack earlier to better match with the
normal exception prolog.

Signed-off-by: default avatarChristophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/79a93f253d72dc97ac968c9c62b5066960b688ed.1615552866.git.christophe.leroy@csgroup.eu
parent 9d3c18a1
Loading
Loading
Loading
Loading
+0 −9
Original line number Original line Diff line number Diff line
@@ -107,15 +107,6 @@ _ASM_NOKPROBE_SYMBOL(crit_transfer_to_handler)
#ifdef CONFIG_40x
#ifdef CONFIG_40x
	.globl	crit_transfer_to_handler
	.globl	crit_transfer_to_handler
crit_transfer_to_handler:
crit_transfer_to_handler:
	lwz	r0,crit_r10@l(0)
	stw	r0,GPR10(r11)
	lwz	r0,crit_r11@l(0)
	stw	r0,GPR11(r11)
	mfspr	r0,SPRN_SRR0
	stw	r0,crit_srr0@l(0)
	mfspr	r0,SPRN_SRR1
	stw	r0,crit_srr1@l(0)

	/* set the stack limit to the current stack */
	/* set the stack limit to the current stack */
	mfspr	r8,SPRN_SPRG_THREAD
	mfspr	r8,SPRN_SPRG_THREAD
	lwz	r0,KSP_LIMIT(r8)
	lwz	r0,KSP_LIMIT(r8)
+8 −0
Original line number Original line Diff line number Diff line
@@ -103,6 +103,10 @@ _ENTRY(saved_ksp_limit)
.macro CRITICAL_EXCEPTION_PROLOG
.macro CRITICAL_EXCEPTION_PROLOG
	stw	r10,crit_r10@l(0)	/* save two registers to work with */
	stw	r10,crit_r10@l(0)	/* save two registers to work with */
	stw	r11,crit_r11@l(0)
	stw	r11,crit_r11@l(0)
	mfspr	r10,SPRN_SRR0
	mfspr	r11,SPRN_SRR1
	stw	r10,crit_srr0@l(0)
	stw	r11,crit_srr1@l(0)
	mfcr	r10			/* save CR in r10 for now	   */
	mfcr	r10			/* save CR in r10 for now	   */
	mfspr	r11,SPRN_SRR3		/* check whether user or kernel    */
	mfspr	r11,SPRN_SRR3		/* check whether user or kernel    */
	andi.	r11,r11,MSR_PR
	andi.	r11,r11,MSR_PR
@@ -120,6 +124,10 @@ _ENTRY(saved_ksp_limit)
	stw	r9,GPR9(r11)
	stw	r9,GPR9(r11)
	mflr	r10
	mflr	r10
	stw	r10,_LINK(r11)
	stw	r10,_LINK(r11)
	lwz	r10,crit_r10@l(0)
	lwz	r12,crit_r11@l(0)
	stw	r10,GPR10(r11)
	stw	r12,GPR11(r11)
	mfspr	r12,SPRN_DEAR		/* save DEAR and ESR in the frame  */
	mfspr	r12,SPRN_DEAR		/* save DEAR and ESR in the frame  */
	stw	r12,_DEAR(r11)		/* since they may have had stuff   */
	stw	r12,_DEAR(r11)		/* since they may have had stuff   */
	mfspr	r9,SPRN_ESR		/* in them at the point where the  */
	mfspr	r9,SPRN_ESR		/* in them at the point where the  */