powerpc: Save caller r3 prior to system_call_exception
This reverts commit8875f47b76
("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 commit6f76a01173
("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
This commit is contained in:
parent
5ba6c9a912
commit
2c27d4a419
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue