[PATCH] powerpc: Invalidate ERAT on powersave wakeup for POWER9
Michael Ellerman
mpe at ellerman.id.au
Fri Jun 23 19:33:23 AEST 2017
Michael Neuling <mikey at neuling.org> writes:
> 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.
Incorrect how?
Because with the ERAT flush where you've put it, there's still a good
amount of code executed prior to the flush isn't there?
ie. we come in at 0x100, do some of the prolog, do IDLE_TEST which takes
us to pnv_powersave_wakeup, which then restores state from the paca
(memory), that returns and then we check KVM ... and then finally we end
up at pnv_wakeup_loss.
Or is there some other path? Or is the ERAT incorrect in some specific
way which means we only need to flush there?
cheers
> diff --git a/arch/powerpc/kernel/idle_book3s.S b/arch/powerpc/kernel/idle_book3s.S
> index 1ea14b96f1..ace2ad50c8 100644
> --- a/arch/powerpc/kernel/idle_book3s.S
> +++ b/arch/powerpc/kernel/idle_book3s.S
> @@ -793,6 +793,9 @@ fastsleep_workaround_at_exit:
> */
> .global pnv_wakeup_loss
> pnv_wakeup_loss:
> +BEGIN_FTR_SECTION
> + PPC_INVALIDATE_ERAT
> +END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
> ld r1,PACAR1(r13)
> BEGIN_FTR_SECTION
> CHECK_HMI_INTERRUPT
> --
> 2.11.0
More information about the Linuxppc-dev
mailing list