aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/powerpc/kvm/book3s_hv_ras.c15
-rw-r--r--arch/powerpc/kvm/book3s_hv_rmhandlers.S19
2 files changed, 23 insertions, 11 deletions
diff --git a/arch/powerpc/kvm/book3s_hv_ras.c b/arch/powerpc/kvm/book3s_hv_ras.c
index 768a9f977c00..3a5c568b1e89 100644
--- a/arch/powerpc/kvm/book3s_hv_ras.c
+++ b/arch/powerpc/kvm/book3s_hv_ras.c
@@ -113,10 +113,8 @@ static long kvmppc_realmode_mc_power7(struct kvm_vcpu *vcpu)
113 * We assume that if the condition is recovered then linux host 113 * We assume that if the condition is recovered then linux host
114 * will have generated an error log event that we will pick 114 * will have generated an error log event that we will pick
115 * up and log later. 115 * up and log later.
116 * Don't release mce event now. In case if condition is not 116 * Don't release mce event now. We will queue up the event so that
117 * recovered we do guest exit and go back to linux host machine 117 * we can log the MCE event info on host console.
118 * check handler. Hence we need make sure that current mce event
119 * is available for linux host to consume.
120 */ 118 */
121 if (!get_mce_event(&mce_evt, MCE_EVENT_DONTRELEASE)) 119 if (!get_mce_event(&mce_evt, MCE_EVENT_DONTRELEASE))
122 goto out; 120 goto out;
@@ -128,11 +126,12 @@ static long kvmppc_realmode_mc_power7(struct kvm_vcpu *vcpu)
128 126
129out: 127out:
130 /* 128 /*
131 * If we have handled the error, then release the mce event because 129 * We are now going enter guest either through machine check
132 * we will be delivering machine check to guest. 130 * interrupt (for unhandled errors) or will continue from
131 * current HSRR0 (for handled errors) in guest. Hence
132 * queue up the event so that we can log it from host console later.
133 */ 133 */
134 if (handled) 134 machine_check_queue_event();
135 release_mce_event();
136 135
137 return handled; 136 return handled;
138} 137}
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
index 77356fd25ccc..868347ef09fd 100644
--- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S
+++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
@@ -2257,15 +2257,28 @@ machine_check_realmode:
2257 mr r3, r9 /* get vcpu pointer */ 2257 mr r3, r9 /* get vcpu pointer */
2258 bl kvmppc_realmode_machine_check 2258 bl kvmppc_realmode_machine_check
2259 nop 2259 nop
2260 cmpdi r3, 0 /* continue exiting from guest? */ 2260 cmpdi r3, 0 /* Did we handle MCE ? */
2261 ld r9, HSTATE_KVM_VCPU(r13) 2261 ld r9, HSTATE_KVM_VCPU(r13)
2262 li r12, BOOK3S_INTERRUPT_MACHINE_CHECK 2262 li r12, BOOK3S_INTERRUPT_MACHINE_CHECK
2263 beq mc_cont 2263 /*
2264 * Deliver unhandled/fatal (e.g. UE) MCE errors to guest through
2265 * machine check interrupt (set HSRR0 to 0x200). And for handled
2266 * errors (no-fatal), just go back to guest execution with current
2267 * HSRR0 instead of exiting guest. This new approach will inject
2268 * machine check to guest for fatal error causing guest to crash.
2269 *
2270 * The old code used to return to host for unhandled errors which
2271 * was causing guest to hang with soft lockups inside guest and
2272 * makes it difficult to recover guest instance.
2273 */
2274 ld r10, VCPU_PC(r9)
2275 ld r11, VCPU_MSR(r9)
2276 bne 2f /* Continue guest execution. */
2264 /* If not, deliver a machine check. SRR0/1 are already set */ 2277 /* If not, deliver a machine check. SRR0/1 are already set */
2265 li r10, BOOK3S_INTERRUPT_MACHINE_CHECK 2278 li r10, BOOK3S_INTERRUPT_MACHINE_CHECK
2266 ld r11, VCPU_MSR(r9) 2279 ld r11, VCPU_MSR(r9)
2267 bl kvmppc_msr_interrupt 2280 bl kvmppc_msr_interrupt
2268 b fast_interrupt_c_return 22812: b fast_interrupt_c_return
2269 2282
2270/* 2283/*
2271 * Check the reason we woke from nap, and take appropriate action. 2284 * Check the reason we woke from nap, and take appropriate action.