Save non volatile registers, XER, CTR, MSR and NIP in exception prolog.

Also assign proper value to r2 and r3 there.

For now, recalculate thread pointer in prepare_transfer_to_handler.
It will disappear once KUAP is ported to C.

Signed-off-by: Christophe Leroy <christophe.le...@csgroup.eu>
---
 arch/powerpc/kernel/entry_32.S | 18 +++---------------
 arch/powerpc/kernel/head_32.h  | 12 ++++++++++++
 2 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S
index 75ca010bd78d..fd24520b2e0c 100644
--- a/arch/powerpc/kernel/entry_32.S
+++ b/arch/powerpc/kernel/entry_32.S
@@ -57,20 +57,9 @@
  */
        .globl  prepare_transfer_to_handler
 prepare_transfer_to_handler:
-       SAVE_NVGPRS(r11)
-       addi    r3,r1,STACK_FRAME_OVERHEAD
-       stw     r2,GPR2(r11)
-       stw     r12,_NIP(r11)
-       stw     r9,_MSR(r11)
-       andi.   r2,r9,MSR_PR
-       mfctr   r12
-       mfspr   r2,SPRN_XER
-       stw     r12,_CTR(r11)
-       stw     r2,_XER(r11)
-       mfspr   r12,SPRN_SPRG_THREAD
-       tovirt(r12, r12)
+       andi.   r0,r9,MSR_PR
+       addi    r12, r2, THREAD
        beq     2f                      /* if from user, fix up THREAD.regs */
-       addi    r2, r12, -THREAD
        stw     r3,PT_REGS(r12)
 #ifdef CONFIG_PPC_BOOK3S_32
        kuep_lock r11, r12
@@ -80,8 +69,7 @@ prepare_transfer_to_handler:
 2:     /* if from kernel, check interrupted DOZE/NAP mode and
          * check for stack overflow
          */
-       kuap_save_and_lock r11, r12, r9, r2, r6
-       addi    r2, r12, -THREAD
+       kuap_save_and_lock r11, r12, r9, r5, r6
 #if defined(CONFIG_PPC_BOOK3S_32) || defined(CONFIG_E500)
        lwz     r12,TI_LOCAL_FLAGS(r2)
        mtcrf   0x01,r12
diff --git a/arch/powerpc/kernel/head_32.h b/arch/powerpc/kernel/head_32.h
index 12c39178a1d2..b29c13221baa 100644
--- a/arch/powerpc/kernel/head_32.h
+++ b/arch/powerpc/kernel/head_32.h
@@ -116,6 +116,18 @@
        stw     r10,_TRAP(r1)
        SAVE_4GPRS(3, r1)
        SAVE_2GPRS(7, r1)
+       SAVE_NVGPRS(r1)
+       stw     r2,GPR2(r1)
+       stw     r12,_NIP(r1)
+       stw     r9,_MSR(r1)
+       mfctr   r0
+       mfspr   r10,SPRN_XER
+       mfspr   r2,SPRN_SPRG_THREAD
+       stw     r0,_CTR(r1)
+       tovirt(r2, r2)
+       stw     r10,_XER(r1)
+       addi    r2, r2, -THREAD
+       addi    r3,r1,STACK_FRAME_OVERHEAD
 _ASM_NOKPROBE_SYMBOL(\name\()_virt)
 .endm
 
-- 
2.25.0

Reply via email to