Skip to content

Commit cdeb5d7

Browse files
committed
KVM: PPC: Book3S HV: Make idle_kvm_start_guest() return 0 if it went to guest
We call idle_kvm_start_guest() from power7_offline() if the thread has been requested to enter KVM. We pass it the SRR1 value that was returned from power7_idle_insn() which tells us what sort of wakeup we're processing. Depending on the SRR1 value we pass in, the KVM code might enter the guest, or it might return to us to do some host action if the wakeup requires it. If idle_kvm_start_guest() is able to handle the wakeup, and enter the guest it is supposed to indicate that by returning a zero SRR1 value to us. That was the behaviour prior to commit 10d9161 ("powerpc/64s: Reimplement book3s idle code in C"), however in that commit the handling of SRR1 was reworked, and the zeroing behaviour was lost. Returning from idle_kvm_start_guest() without zeroing the SRR1 value can confuse the host offline code, causing the guest to crash and other weirdness. Fixes: 10d9161 ("powerpc/64s: Reimplement book3s idle code in C") Cc: stable@vger.kernel.org # v5.2+ Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20211015133929.832061-2-mpe@ellerman.id.au
1 parent 9b4416c commit cdeb5d7

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed

arch/powerpc/kvm/book3s_hv_rmhandlers.S

+7-2
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ _GLOBAL(idle_kvm_start_guest)
264264
stdu r1, -SWITCH_FRAME_SIZE(r4)
265265
// Switch to new frame on emergency stack
266266
mr r1, r4
267+
std r3, 32(r1) // Save SRR1 wakeup value
267268
SAVE_NVGPRS(r1)
268269

269270
/*
@@ -315,6 +316,10 @@ kvm_unsplit_wakeup:
315316

316317
kvm_secondary_got_guest:
317318

319+
// About to go to guest, clear saved SRR1
320+
li r0, 0
321+
std r0, 32(r1)
322+
318323
/* Set HSTATE_DSCR(r13) to something sensible */
319324
ld r6, PACA_DSCR_DEFAULT(r13)
320325
std r6, HSTATE_DSCR(r13)
@@ -394,8 +399,8 @@ kvm_no_guest:
394399
mfspr r4, SPRN_LPCR
395400
rlwimi r4, r3, 0, LPCR_PECE0 | LPCR_PECE1
396401
mtspr SPRN_LPCR, r4
397-
/* set up r3 for return */
398-
mfspr r3,SPRN_SRR1
402+
// Return SRR1 wakeup value, or 0 if we went into the guest
403+
ld r3, 32(r1)
399404
REST_NVGPRS(r1)
400405
ld r1, 0(r1) // Switch back to caller stack
401406
ld r0, 16(r1) // Reload LR

0 commit comments

Comments
 (0)