[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v6 3/6] target/ppc: Handle NMI guest exit
From: |
Aravinda Prasad |
Subject: |
[Qemu-devel] [PATCH v6 3/6] target/ppc: Handle NMI guest exit |
Date: |
Tue, 12 Mar 2019 15:33:18 +0530 |
User-agent: |
StGit/0.17.1-dirty |
Memory error such as bit flips that cannot be corrected
by hardware are passed on to the kernel for handling.
If the memory address in error belongs to guest then
the guest kernel is responsible for taking suitable action.
Patch [1] enhances KVM to exit guest with exit reason
set to KVM_EXIT_NMI in such cases. This patch handles
KVM_EXIT_NMI exit.
[1] https://www.spinics.net/lists/kvm-ppc/msg12637.html
(e20bbd3d and related commits)
Signed-off-by: Aravinda Prasad <address@hidden>
---
hw/ppc/spapr_events.c | 22 ++++++++++++++++++++++
include/hw/ppc/spapr.h | 1 +
target/ppc/kvm.c | 16 ++++++++++++++++
target/ppc/kvm_ppc.h | 2 ++
4 files changed, 41 insertions(+)
diff --git a/hw/ppc/spapr_events.c b/hw/ppc/spapr_events.c
index ab9a1f0..b6f59bf 100644
--- a/hw/ppc/spapr_events.c
+++ b/hw/ppc/spapr_events.c
@@ -620,6 +620,28 @@ void
spapr_hotplug_req_remove_by_count_indexed(sPAPRDRConnectorType drc_type,
RTAS_LOG_V6_HP_ACTION_REMOVE, drc_type, &drc_id);
}
+void spapr_mce_req_event(PowerPCCPU *cpu, bool recovered)
+{
+ sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
+
+ while (spapr->mc_status != -1) {
+ /*
+ * Check whether the same CPU got machine check error
+ * while still handling the mc error (i.e., before
+ * that CPU called "ibm,nmi-interlock"
+ */
+ if (spapr->mc_status == cpu->vcpu_id) {
+ qemu_system_guest_panicked(NULL);
+ }
+ qemu_cond_wait_iothread(&spapr->mc_delivery_cond);
+ /* If the system is reset meanwhile, then just return */
+ if (spapr->mc_reset) {
+ return;
+ }
+ }
+ spapr->mc_status = cpu->vcpu_id;
+}
+
static void check_exception(PowerPCCPU *cpu, sPAPRMachineState *spapr,
uint32_t token, uint32_t nargs,
target_ulong args,
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
index 452f904..1d8e1fa 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -777,6 +777,7 @@ void spapr_reallocate_hpt(sPAPRMachineState *spapr, int
shift,
Error **errp);
void spapr_clear_pending_events(sPAPRMachineState *spapr);
int spapr_max_server_number(sPAPRMachineState *spapr);
+void spapr_mce_req_event(PowerPCCPU *cpu, bool recovered);
/* DRC callbacks. */
void spapr_core_release(DeviceState *dev);
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index d01852f..ba7738e 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -1711,6 +1711,11 @@ int kvm_arch_handle_exit(CPUState *cs, struct kvm_run
*run)
ret = 0;
break;
+ case KVM_EXIT_NMI:
+ DPRINTF("handle NMI exception\n");
+ ret = kvm_handle_nmi(cpu, run);
+ break;
+
default:
fprintf(stderr, "KVM: unknown exit reason %d\n", run->exit_reason);
ret = -1;
@@ -2711,6 +2716,17 @@ int kvm_arch_msi_data_to_gsi(uint32_t data)
return data & 0xffff;
}
+int kvm_handle_nmi(PowerPCCPU *cpu, struct kvm_run *run)
+{
+ bool recovered = run->flags & KVM_RUN_PPC_NMI_DISP_FULLY_RECOV;
+
+ cpu_synchronize_state(CPU(cpu));
+
+ spapr_mce_req_event(cpu, recovered);
+
+ return 0;
+}
+
int kvmppc_enable_hwrng(void)
{
if (!kvm_enabled() || !kvm_check_extension(kvm_state, KVM_CAP_PPC_HWRNG)) {
diff --git a/target/ppc/kvm_ppc.h b/target/ppc/kvm_ppc.h
index bdfaa4e..0f40222 100644
--- a/target/ppc/kvm_ppc.h
+++ b/target/ppc/kvm_ppc.h
@@ -76,6 +76,8 @@ bool kvmppc_hpt_needs_host_contiguous_pages(void);
void kvm_check_mmu(PowerPCCPU *cpu, Error **errp);
void kvmppc_set_reg_ppc_online(PowerPCCPU *cpu, unsigned int online);
+int kvm_handle_nmi(PowerPCCPU *cpu, struct kvm_run *run);
+
#else
static inline uint32_t kvmppc_get_tbfreq(void)
- [Qemu-devel] [PATCH v6 0/6] target-ppc/spapr: Add FWNMI support in QEMU for PowerKVM guests, Aravinda Prasad, 2019/03/12
- [Qemu-devel] [PATCH v6 6/6] migration: Block migration while handling machine check, Aravinda Prasad, 2019/03/12
- [Qemu-devel] [PATCH v6 5/6] ppc: spapr: Enable FWNMI capability, Aravinda Prasad, 2019/03/12
- [Qemu-devel] [PATCH v6 3/6] target/ppc: Handle NMI guest exit,
Aravinda Prasad <=
- [Qemu-devel] [PATCH v6 2/6] Wrapper function to wait on condition for the main loop mutex, Aravinda Prasad, 2019/03/12
- [Qemu-devel] [PATCH v6 4/6] target/ppc: Build rtas error log, Aravinda Prasad, 2019/03/12
- [Qemu-devel] [PATCH v6 1/6] ppc: spapr: Handle "ibm, nmi-register" and "ibm, nmi-interlock" RTAS calls, Aravinda Prasad, 2019/03/12
- Re: [Qemu-devel] [Qemu-ppc] [PATCH v6 0/6] target-ppc/spapr: Add FWNMI support in QEMU for PowerKVM guests, Greg Kurz, 2019/03/12