Commit ba6d334a authored by Benjamin Herrenschmidt's avatar Benjamin Herrenschmidt Committed by Michael Ellerman

powerpc/64s: Invalidate ERAT on powersave wakeup for POWER9

On POWER9 the ERAT may be incorrect on wakeup from some stop states
that lose state. This causes random segvs and illegal instructions
when these stop states are enabled.

This patch invalidates the ERAT on wakeup on POWER9 to prevent this
from causing a problem.
Signed-off-by: default avatarMichael Neuling <mikey@neuling.org>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
Reviewed-by: default avatarNicholas Piggin <npiggin@gmail.com>
[mpe: Merge comment change with upstream changes]
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 74e27c6a
...@@ -99,9 +99,11 @@ EXC_VIRT_NONE(0x4000, 0x100) ...@@ -99,9 +99,11 @@ EXC_VIRT_NONE(0x4000, 0x100)
#ifdef CONFIG_PPC_P7_NAP #ifdef CONFIG_PPC_P7_NAP
/* /*
* If running native on arch 2.06 or later, check if we are waking up * If running native on arch 2.06 or later, check if we are waking up
* from nap/sleep/winkle, and branch to idle handler. The idle wakeup * from nap/sleep/winkle, and branch to idle handler. This tests SRR1
* handler initially runs in real mode, but we branch to the 0xc000... * bits 46:47. A non-0 value indicates that we are coming from a power
* address so we can turn on relocation with mtmsr. * saving state. The idle wakeup handler initially runs in real mode,
* but we branch to the 0xc000... address so we can turn on relocation
* with mtmsr.
*/ */
#define IDLETEST(n) \ #define IDLETEST(n) \
BEGIN_FTR_SECTION ; \ BEGIN_FTR_SECTION ; \
......
...@@ -435,6 +435,13 @@ ALT_FTR_SECTION_END_IFSET(CPU_FTR_ARCH_300) ...@@ -435,6 +435,13 @@ ALT_FTR_SECTION_END_IFSET(CPU_FTR_ARCH_300)
* cr3 - set to gt if waking up with partial/complete hypervisor state loss * cr3 - set to gt if waking up with partial/complete hypervisor state loss
*/ */
pnv_restore_hyp_resource_arch300: pnv_restore_hyp_resource_arch300:
/*
* Workaround for POWER9, if we lost resources, the ERAT
* might have been mixed up and needs flushing.
*/
blt cr3,1f
PPC_INVALIDATE_ERAT
1:
/* /*
* POWER ISA 3. Use PSSCR to determine if we * POWER ISA 3. Use PSSCR to determine if we
* are waking up from deep idle state * are waking up from deep idle state
......
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