aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicholas Piggin <npiggin@gmail.com>2017-03-17 01:13:20 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-03-30 03:41:25 -0400
commit1e360905f61f34acbdc82f88336155db89107485 (patch)
treea3309131dfa0009fe3161a2555526342a19bb601
parent9a9dc3ec7ce1e31d1e4f553885fd35fbaf207d23 (diff)
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>
-rw-r--r--arch/powerpc/kernel/idle_book3s.S20
1 files changed, 17 insertions, 3 deletions
diff --git a/arch/powerpc/kernel/idle_book3s.S b/arch/powerpc/kernel/idle_book3s.S
index 72dac0b58061..b350ac5e3111 100644
--- a/arch/powerpc/kernel/idle_book3s.S
+++ b/arch/powerpc/kernel/idle_book3s.S
@@ -439,9 +439,23 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
439_GLOBAL(pnv_wakeup_tb_loss) 439_GLOBAL(pnv_wakeup_tb_loss)
440 ld r1,PACAR1(r13) 440 ld r1,PACAR1(r13)
441 /* 441 /*
442 * Before entering any idle state, the NVGPRs are saved in the stack 442 * Before entering any idle state, the NVGPRs are saved in the stack.
443 * and they are restored before switching to the process context. Hence 443 * If there was a state loss, or PACA_NAPSTATELOST was set, then the
444 * until they are restored, they are free to be used. 444 * NVGPRs are restored. If we are here, it is likely that state is lost,
445 * but not guaranteed -- neither ISA207 nor ISA300 tests to reach
446 * here are the same as the test to restore NVGPRS:
447 * PACA_THREAD_IDLE_STATE test for ISA207, PSSCR test for ISA300,
448 * and SRR1 test for restoring NVGPRs.
449 *
450 * We are about to clobber NVGPRs now, so set NAPSTATELOST to
451 * guarantee they will always be restored. This might be tightened
452 * with careful reading of specs (particularly for ISA300) but this
453 * is already a slow wakeup path and it's simpler to be safe.
454 */
455 li r0,1
456 stb r0,PACA_NAPSTATELOST(r13)
457
458 /*
445 * 459 *
446 * Save SRR1 and LR in NVGPRs as they might be clobbered in 460 * Save SRR1 and LR in NVGPRs as they might be clobbered in
447 * opal_call() (called in CHECK_HMI_INTERRUPT). SRR1 is required 461 * opal_call() (called in CHECK_HMI_INTERRUPT). SRR1 is required