powerpc/32: Always save non volatile registers on exception entry
authorChristophe Leroy <christophe.leroy@csgroup.eu>
Fri, 12 Mar 2021 12:50:33 +0000 (12:50 +0000)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 29 Mar 2021 02:22:07 +0000 (13:22 +1100)
In preparation of handling exception entry and exit in C,
in order to simplify the handling, always save non volatile registers
when entering an exception.

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

index bedbca0..f10498e 100644 (file)
@@ -209,16 +209,14 @@ static inline void regs_set_return_value(struct pt_regs *regs, unsigned long rc)
  */
 #define TRAP_FLAGS_MASK                0x1F
 #define TRAP(regs)             ((regs)->trap & ~TRAP_FLAGS_MASK)
-#define FULL_REGS(regs)                (((regs)->trap & 1) == 0)
-#define SET_FULL_REGS(regs)    ((regs)->trap &= ~1)
+#define FULL_REGS(regs)                true
+#define SET_FULL_REGS(regs)    do { } while (0)
 #define IS_CRITICAL_EXC(regs)  (((regs)->trap & 2) != 0)
 #define IS_MCHECK_EXC(regs)    (((regs)->trap & 4) != 0)
 #define IS_DEBUG_EXC(regs)     (((regs)->trap & 8) != 0)
 #define NV_REG_POISON          0xdeadbeef
 #define CHECK_FULL_REGS(regs)                                                \
 do {                                                                         \
-       if ((regs)->trap & 1)                                                 \
-               printk(KERN_CRIT "%s: partial register set\n", __func__); \
 } while (0)
 #endif /* __powerpc64__ */
 
index fb849ef..7084289 100644 (file)
@@ -81,12 +81,12 @@ _ASM_NOKPROBE_SYMBOL(crit_transfer_to_handler)
  */
        .globl  transfer_to_handler_full
 transfer_to_handler_full:
-       SAVE_NVGPRS(r11)
 _ASM_NOKPROBE_SYMBOL(transfer_to_handler_full)
        /* fall through */
 
        .globl  transfer_to_handler
 transfer_to_handler:
+       SAVE_NVGPRS(r11)
        stw     r2,GPR2(r11)
        stw     r12,_NIP(r11)
        stw     r9,_MSR(r11)
@@ -234,10 +234,6 @@ handle_page_fault:
        bl      do_page_fault
        cmpwi   r3,0
        beq+    ret_from_except
-       SAVE_NVGPRS(r1)
-       lwz     r0,_TRAP(r1)
-       clrrwi  r0,r0,1
-       stw     r0,_TRAP(r1)
        mr      r4,r3           /* err arg for bad_page_fault */
        addi    r3,r1,STACK_FRAME_OVERHEAD
        bl      __bad_page_fault
@@ -810,13 +806,6 @@ recheck:
 do_user_signal:                        /* r10 contains MSR_KERNEL here */
        ori     r10,r10,MSR_EE
        mtmsr   r10             /* hard-enable interrupts */
-       /* save r13-r31 in the exception frame, if not already done */
-       lwz     r3,_TRAP(r1)
-       andi.   r0,r3,1
-       beq     2f
-       SAVE_NVGPRS(r1)
-       rlwinm  r3,r3,0,0,30
-       stw     r3,_TRAP(r1)
 2:     addi    r3,r1,STACK_FRAME_OVERHEAD
        mr      r4,r9
        bl      do_notify_resume
index e09585b..087445e 100644 (file)
@@ -198,7 +198,7 @@ label:
                          ret_from_except_full)
 
 #define EXC_XFER_LITE(n, hdlr)         \
-       EXC_XFER_TEMPLATE(hdlr, n+1, MSR_KERNEL, transfer_to_handler, \
+       EXC_XFER_TEMPLATE(hdlr, n, MSR_KERNEL, transfer_to_handler, \
                          ret_from_except)
 
 .macro vmap_stack_overflow_exception
@@ -215,7 +215,6 @@ vmap_stack_overflow:
        lwz     r1, emergency_ctx@l(r1)
        addi    r1, r1, THREAD_SIZE - INT_FRAME_SIZE
        EXCEPTION_PROLOG_2 vmap_stack_overflow
-       SAVE_NVGPRS(r11)
        addi    r3, r1, STACK_FRAME_OVERHEAD
        EXC_XFER_STD(0, stack_overflow_exception)
 .endm
index 3707f49..b31bf9e 100644 (file)
@@ -331,7 +331,7 @@ label:
                          ret_from_except_full)
 
 #define EXC_XFER_LITE(n, hdlr)         \
-       EXC_XFER_TEMPLATE(hdlr, n+1, MSR_KERNEL, transfer_to_handler, \
+       EXC_XFER_TEMPLATE(hdlr, n, MSR_KERNEL, transfer_to_handler, \
                          ret_from_except)
 
 /* Check for a single step debug exception while in an exception