Commit 2c27d4a4 authored by Rohan McLure's avatar Rohan McLure Committed by Michael Ellerman

powerpc: Save caller r3 prior to system_call_exception

This reverts commit 8875f47b ("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 6f76a011 ("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: default avatarRohan McLure <rmclure@linux.ibm.com>
Reviewed-by: default avatarNicholas Piggin <npiggin@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20220921065605.1051927-3-rmclure@linux.ibm.com
parent 5ba6c9a9
...@@ -101,6 +101,7 @@ __kuep_unlock: ...@@ -101,6 +101,7 @@ __kuep_unlock:
.globl transfer_to_syscall .globl transfer_to_syscall
transfer_to_syscall: transfer_to_syscall:
stw r3, ORIG_GPR3(r1)
stw r11, GPR1(r1) stw r11, GPR1(r1)
stw r11, 0(r1) stw r11, 0(r1)
mflr r12 mflr r12
......
...@@ -81,6 +81,7 @@ _ASM_NOKPROBE_SYMBOL(system_call_vectored_\name) ...@@ -81,6 +81,7 @@ _ASM_NOKPROBE_SYMBOL(system_call_vectored_\name)
li r11,\trapnr li r11,\trapnr
std r11,_TRAP(r1) std r11,_TRAP(r1)
std r12,_CCR(r1) std r12,_CCR(r1)
std r3,ORIG_GPR3(r1)
addi r10,r1,STACK_FRAME_OVERHEAD addi r10,r1,STACK_FRAME_OVERHEAD
ld r11,exception_marker@toc(r2) ld r11,exception_marker@toc(r2)
std r11,-16(r10) /* "regshere" marker */ std r11,-16(r10) /* "regshere" marker */
...@@ -265,6 +266,7 @@ END_BTB_FLUSH_SECTION ...@@ -265,6 +266,7 @@ END_BTB_FLUSH_SECTION
std r10,_LINK(r1) std r10,_LINK(r1)
std r11,_TRAP(r1) std r11,_TRAP(r1)
std r12,_CCR(r1) std r12,_CCR(r1)
std r3,ORIG_GPR3(r1)
addi r10,r1,STACK_FRAME_OVERHEAD addi r10,r1,STACK_FRAME_OVERHEAD
ld r11,exception_marker@toc(r2) ld r11,exception_marker@toc(r2)
std r11,-16(r10) /* "regshere" marker */ std r11,-16(r10) /* "regshere" marker */
......
...@@ -25,7 +25,6 @@ notrace long system_call_exception(long r3, long r4, long r5, ...@@ -25,7 +25,6 @@ notrace long system_call_exception(long r3, long r4, long r5,
kuap_lock(); kuap_lock();
add_random_kstack_offset(); add_random_kstack_offset();
regs->orig_gpr3 = r3;
if (IS_ENABLED(CONFIG_PPC_IRQ_SOFT_MASK_DEBUG)) if (IS_ENABLED(CONFIG_PPC_IRQ_SOFT_MASK_DEBUG))
BUG_ON(irq_soft_mask_return() != IRQS_ALL_DISABLED); BUG_ON(irq_soft_mask_return() != IRQS_ALL_DISABLED);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment