OSDN Git Service

powerpc: Save caller r3 prior to system_call_exception
authorRohan McLure <rmclure@linux.ibm.com>
Wed, 21 Sep 2022 06:55:42 +0000 (16:55 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 26 Sep 2022 13:00:14 +0000 (23:00 +1000)
This reverts commit 8875f47b7681 ("powerpc/syscall: Save r3 in regs->orig_r3
").

Save caller's original r3 state to the kernel stackframe before entering
system_call_exception. This allows for user registers to be cleared by
the time system_call_exception is entered, reducing the influence of
user registers on speculation within the kernel.

Prior to this commit, orig_r3 was saved at the beginning of
system_call_exception. Instead, save orig_r3 while the user value is
still live in r3.

Also replicate this early save in 32-bit. A similar save was removed in
commit 6f76a01173cc ("powerpc/syscall: implement system call entry/exit
logic in C for PPC32") when 32-bit adopted system_call_exception. Revert
its removal of orig_r3 saves.

Signed-off-by: Rohan McLure <rmclure@linux.ibm.com>
Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20220921065605.1051927-3-rmclure@linux.ibm.com
arch/powerpc/kernel/entry_32.S
arch/powerpc/kernel/interrupt_64.S
arch/powerpc/kernel/syscall.c

index 2b5b067..497f04c 100644 (file)
@@ -101,6 +101,7 @@ __kuep_unlock:
 
        .globl  transfer_to_syscall
 transfer_to_syscall:
+       stw     r3, ORIG_GPR3(r1)
        stw     r11, GPR1(r1)
        stw     r11, 0(r1)
        mflr    r12
index a2d3abb..9d6c8c5 100644 (file)
@@ -81,6 +81,7 @@ _ASM_NOKPROBE_SYMBOL(system_call_vectored_\name)
        li      r11,\trapnr
        std     r11,_TRAP(r1)
        std     r12,_CCR(r1)
+       std     r3,ORIG_GPR3(r1)
        addi    r10,r1,STACK_FRAME_OVERHEAD
        ld      r11,exception_marker@toc(r2)
        std     r11,-16(r10)            /* "regshere" marker */
@@ -265,6 +266,7 @@ END_BTB_FLUSH_SECTION
        std     r10,_LINK(r1)
        std     r11,_TRAP(r1)
        std     r12,_CCR(r1)
+       std     r3,ORIG_GPR3(r1)
        addi    r10,r1,STACK_FRAME_OVERHEAD
        ld      r11,exception_marker@toc(r2)
        std     r11,-16(r10)            /* "regshere" marker */
index 81ace9e..64102a6 100644 (file)
@@ -25,7 +25,6 @@ notrace long system_call_exception(long r3, long r4, long r5,
        kuap_lock();
 
        add_random_kstack_offset();
-       regs->orig_gpr3 = r3;
 
        if (IS_ENABLED(CONFIG_PPC_IRQ_SOFT_MASK_DEBUG))
                BUG_ON(irq_soft_mask_return() != IRQS_ALL_DISABLED);