OSDN Git Service

powerpc/32: Save remaining registers in exception prolog
authorChristophe Leroy <christophe.leroy@csgroup.eu>
Fri, 12 Mar 2021 12:50:44 +0000 (12:50 +0000)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 29 Mar 2021 02:22:10 +0000 (13:22 +1100)
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.

And remove the comment which is now completely wrong.

Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/56f0cde9dd0362edf2ddba4d887552013eee7329.1615552867.git.christophe.leroy@csgroup.eu
arch/powerpc/kernel/entry_32.S
arch/powerpc/kernel/head_32.h
arch/powerpc/kernel/head_booke.h

index bcf8452..46b3854 100644 (file)
  */
        .align  12
 
-/*
- * This code finishes saving the registers to the exception frame
- * and jumps to the appropriate handler for the exception, turning
- * on address translation.
- * Note that we rely on the caller having set cr0.eq iff the exception
- * occurred in kernel mode (i.e. MSR:PR = 0).
- */
        .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.   r12,r9,MSR_PR
+       addi    r12,r2,THREAD
        beq     2f
-       addi    r2, r12, -THREAD
 #ifdef CONFIG_PPC_BOOK3S_32
        kuep_lock r11, r12
 #endif
@@ -78,8 +60,7 @@ prepare_transfer_to_handler:
 
        /* if from kernel, check interrupted DOZE/NAP mode */
 2:
-       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
@@ -293,7 +274,7 @@ fast_exception_return:
 
 2:     REST_4GPRS(3, r11)
        lwz     r10,_CCR(r11)
-       REST_GPR(1, r11)
+       REST_2GPRS(1, r11)
        mtcr    r10
        lwz     r10,_LINK(r11)
        mtlr    r10
index ba20bfa..80e45c8 100644 (file)
@@ -117,6 +117,18 @@ _ASM_NOKPROBE_SYMBOL(\name\()_virt)
        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   r10
+       mfspr   r2,SPRN_SPRG_THREAD
+       stw     r10,_CTR(r1)
+       tovirt(r2, r2)
+       mfspr   r10,SPRN_XER
+       addi    r2, r2, -THREAD
+       stw     r10,_XER(r1)
+       addi    r3,r1,STACK_FRAME_OVERHEAD
 .endm
 
 .macro prepare_transfer_to_handler
index 4d583fb..7f3dd5f 100644 (file)
@@ -89,6 +89,18 @@ END_BTB_FLUSH_SECTION
        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   r10
+       mfspr   r2,SPRN_SPRG_THREAD
+       stw     r10,_CTR(r1)
+       tovirt(r2, r2)
+       mfspr   r10,SPRN_XER
+       addi    r2, r2, -THREAD
+       stw     r10,_XER(r1)
+       addi    r3,r1,STACK_FRAME_OVERHEAD
 .endm
 
 .macro prepare_transfer_to_handler