summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorRohan McLure <rmclure@linux.ibm.com>2022-12-01 18:10:18 +1100
committerMichael Ellerman <mpe@ellerman.id.au>2022-12-02 20:46:08 +1100
commitefe1691ac814e4cf3653538b701662cbd905bddc (patch)
tree57891587f077e10214fa75f0f6bad13ee35e895f /arch
parent1df45d78b8a89da6544fab5267e8f5da15073d28 (diff)
downloadlinux-stable-efe1691ac814e4cf3653538b701662cbd905bddc.tar.gz
linux-stable-efe1691ac814e4cf3653538b701662cbd905bddc.tar.bz2
linux-stable-efe1691ac814e4cf3653538b701662cbd905bddc.zip
powerpc/64e: Clear gprs on interrupt routine entry on Book3E
Zero GPRS r14-r31 on entry into the kernel for interrupt sources to limit influence of user-space values in potential speculation gadgets. Prior to this commit, all other GPRS are reassigned during the common prologue to interrupt handlers and so need not be zeroised explicitly. This may be done safely, without loss of register state prior to the interrupt, as the common prologue saves the initial values of non-volatiles, which are unconditionally restored in interrupt_64.S. Mitigation defaults to enabled by INTERRUPT_SANITIZE_REGISTERS. Reviewed-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Rohan McLure <rmclure@linux.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20221201071019.1953023-6-rmclure@linux.ibm.com
Diffstat (limited to 'arch')
-rw-r--r--arch/powerpc/kernel/exceptions-64e.S4
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S
index b9cec22df9f9..3f86091e68b3 100644
--- a/arch/powerpc/kernel/exceptions-64e.S
+++ b/arch/powerpc/kernel/exceptions-64e.S
@@ -358,7 +358,6 @@ ret_from_mc_except:
std r14,PACA_EXMC+EX_R14(r13); \
std r15,PACA_EXMC+EX_R15(r13)
-
/* Core exception code for all exceptions except TLB misses. */
#define EXCEPTION_COMMON_LVL(n, scratch, excf) \
exc_##n##_common: \
@@ -394,7 +393,8 @@ exc_##n##_common: \
std r12,STACK_INT_FRAME_MARKER(r1); /* mark the frame */ \
std r3,_TRAP(r1); /* set trap number */ \
std r0,RESULT(r1); /* clear regs->result */ \
- SAVE_NVGPRS(r1);
+ SAVE_NVGPRS(r1); \
+ SANITIZE_NVGPRS(); /* minimise speculation influence */
#define EXCEPTION_COMMON(n) \
EXCEPTION_COMMON_LVL(n, SPRN_SPRG_GEN_SCRATCH, PACA_EXGEN)