|
@@ -150,6 +150,8 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
|
|
|
cmpwi cr1, r12, BOOK3S_INTERRUPT_MACHINE_CHECK
|
|
|
cmpwi r12, BOOK3S_INTERRUPT_EXTERNAL
|
|
|
beq 11f
|
|
|
+ cmpwi r12, BOOK3S_INTERRUPT_H_DOORBELL
|
|
|
+ beq 15f /* Invoke the H_DOORBELL handler */
|
|
|
cmpwi cr2, r12, BOOK3S_INTERRUPT_HMI
|
|
|
beq cr2, 14f /* HMI check */
|
|
|
|
|
@@ -174,6 +176,10 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
|
|
|
mtspr SPRN_HSRR1, r7
|
|
|
b hmi_exception_after_realmode
|
|
|
|
|
|
+15: mtspr SPRN_HSRR0, r8
|
|
|
+ mtspr SPRN_HSRR1, r7
|
|
|
+ ba 0xe80
|
|
|
+
|
|
|
kvmppc_primary_no_guest:
|
|
|
/* We handle this much like a ceded vcpu */
|
|
|
/* put the HDEC into the DEC, since HDEC interrupts don't wake us */
|
|
@@ -2377,7 +2383,6 @@ machine_check_realmode:
|
|
|
mr r3, r9 /* get vcpu pointer */
|
|
|
bl kvmppc_realmode_machine_check
|
|
|
nop
|
|
|
- cmpdi r3, 0 /* Did we handle MCE ? */
|
|
|
ld r9, HSTATE_KVM_VCPU(r13)
|
|
|
li r12, BOOK3S_INTERRUPT_MACHINE_CHECK
|
|
|
/*
|
|
@@ -2390,13 +2395,18 @@ machine_check_realmode:
|
|
|
* The old code used to return to host for unhandled errors which
|
|
|
* was causing guest to hang with soft lockups inside guest and
|
|
|
* makes it difficult to recover guest instance.
|
|
|
+ *
|
|
|
+ * if we receive machine check with MSR(RI=0) then deliver it to
|
|
|
+ * guest as machine check causing guest to crash.
|
|
|
*/
|
|
|
- ld r10, VCPU_PC(r9)
|
|
|
ld r11, VCPU_MSR(r9)
|
|
|
+ andi. r10, r11, MSR_RI /* check for unrecoverable exception */
|
|
|
+ beq 1f /* Deliver a machine check to guest */
|
|
|
+ ld r10, VCPU_PC(r9)
|
|
|
+ cmpdi r3, 0 /* Did we handle MCE ? */
|
|
|
bne 2f /* Continue guest execution. */
|
|
|
/* If not, deliver a machine check. SRR0/1 are already set */
|
|
|
- li r10, BOOK3S_INTERRUPT_MACHINE_CHECK
|
|
|
- ld r11, VCPU_MSR(r9)
|
|
|
+1: li r10, BOOK3S_INTERRUPT_MACHINE_CHECK
|
|
|
bl kvmppc_msr_interrupt
|
|
|
2: b fast_interrupt_c_return
|
|
|
|
|
@@ -2436,14 +2446,19 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
|
|
|
|
|
|
/* hypervisor doorbell */
|
|
|
3: li r12, BOOK3S_INTERRUPT_H_DOORBELL
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Clear the doorbell as we will invoke the handler
|
|
|
+ * explicitly in the guest exit path.
|
|
|
+ */
|
|
|
+ lis r6, (PPC_DBELL_SERVER << (63-36))@h
|
|
|
+ PPC_MSGCLR(6)
|
|
|
/* see if it's a host IPI */
|
|
|
li r3, 1
|
|
|
lbz r0, HSTATE_HOST_IPI(r13)
|
|
|
cmpwi r0, 0
|
|
|
bnelr
|
|
|
- /* if not, clear it and return -1 */
|
|
|
- lis r6, (PPC_DBELL_SERVER << (63-36))@h
|
|
|
- PPC_MSGCLR(6)
|
|
|
+ /* if not, return -1 */
|
|
|
li r3, -1
|
|
|
blr
|
|
|
|