powerpc/64s: Fix idle wakeup potential to clobber registers
authorNicholas Piggin <npiggin@gmail.com>
Fri, 17 Mar 2017 05:13:20 +0000 (15:13 +1000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 30 Mar 2017 07:41:25 +0000 (09:41 +0200)
commit1e360905f61f34acbdc82f88336155db89107485
treea3309131dfa0009fe3161a2555526342a19bb601
parent9a9dc3ec7ce1e31d1e4f553885fd35fbaf207d23
powerpc/64s: Fix idle wakeup potential to clobber registers

commit 6d98ce0be541d4a3cfbb52cd75072c0339ebb500 upstream.

We concluded there may be a window where the idle wakeup code could get
to pnv_wakeup_tb_loss() (which clobbers non-volatile GPRs), but the
hardware may set SRR1[46:47] to 01b (no state loss) which would result
in the wakeup code failing to restore non-volatile GPRs.

I was not able to trigger this condition with trivial tests on real
hardware or simulator, but the ISA (at least 2.07) seems to allow for
it, and Gautham says that it can happen if there is an exception pending
when the sleep/winkle instruction is executed.

Fixes: 1706567117ba ("powerpc/kvm: make hypervisor state restore a function")
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Acked-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/powerpc/kernel/idle_book3s.S