[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 2/7] KVM: x86: cleanup SIGBUS handlers
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH 2/7] KVM: x86: cleanup SIGBUS handlers |
Date: |
Fri, 10 Feb 2017 10:50:07 +0100 |
This patch should have no semantic change.
Signed-off-by: Paolo Bonzini <address@hidden>
---
target/i386/kvm.c | 81 ++++++++++++++++++++++++++++---------------------------
1 file changed, 42 insertions(+), 39 deletions(-)
diff --git a/target/i386/kvm.c b/target/i386/kvm.c
index 27fd050..0c48dfd 100644
--- a/target/i386/kvm.c
+++ b/target/i386/kvm.c
@@ -469,31 +469,34 @@ int kvm_arch_on_sigbus_vcpu(CPUState *c, int code, void
*addr)
ram_addr_t ram_addr;
hwaddr paddr;
- if ((env->mcg_cap & MCG_SER_P) && addr
- && (code == BUS_MCEERR_AR || code == BUS_MCEERR_AO)) {
+ if (code != BUS_MCEERR_AR && code != BUS_MCEERR_AO) {
+ return 1;
+ }
+
+ /* Because the MCE happened while running the VCPU, KVM could have
+ * injected action required MCEs too. Action optional MCEs should
+ * be delivered to the main thread, which qemu_init_sigbus identifies
+ * as the "early kill" thread, but if we get one for whatever reason
+ * we just handle it just like the main thread would.
+ */
+ if ((env->mcg_cap & MCG_SER_P) && addr) {
ram_addr = qemu_ram_addr_from_host(addr);
- if (ram_addr == RAM_ADDR_INVALID ||
- !kvm_physical_memory_addr_from_host(c->kvm_state, addr, &paddr)) {
- fprintf(stderr, "Hardware memory error for memory used by "
- "QEMU itself instead of guest system!\n");
- /* Hope we are lucky for AO MCE */
- if (code == BUS_MCEERR_AO) {
- return 0;
- } else {
- hardware_memory_error();
- }
- }
- kvm_hwpoison_page_add(ram_addr);
- kvm_mce_inject(cpu, paddr, code);
- } else {
- if (code == BUS_MCEERR_AO) {
+ if (ram_addr != RAM_ADDR_INVALID &&
+ kvm_physical_memory_addr_from_host(c->kvm_state, addr, &paddr)) {
+ kvm_hwpoison_page_add(ram_addr);
+ kvm_mce_inject(cpu, paddr, code);
return 0;
- } else if (code == BUS_MCEERR_AR) {
- hardware_memory_error();
- } else {
- return 1;
}
+
+ fprintf(stderr, "Hardware memory error for memory used by "
+ "QEMU itself instead of guest system!\n");
+ }
+
+ if (code == BUS_MCEERR_AR) {
+ hardware_memory_error();
}
+
+ /* Hope we are lucky for AO MCE */
return 0;
}
@@ -501,29 +504,29 @@ int kvm_arch_on_sigbus(int code, void *addr)
{
X86CPU *cpu = X86_CPU(first_cpu);
- if ((cpu->env.mcg_cap & MCG_SER_P) && addr && code == BUS_MCEERR_AO) {
+ if (code != BUS_MCEERR_AR && code != BUS_MCEERR_AO) {
+ return 1;
+ }
+
+ if (code == BUS_MCEERR_AR) {
+ hardware_memory_error();
+ }
+
+ /* Hope we are lucky for AO MCE */
+ if ((cpu->env.mcg_cap & MCG_SER_P) && addr) {
ram_addr_t ram_addr;
hwaddr paddr;
- /* Hope we are lucky for AO MCE */
ram_addr = qemu_ram_addr_from_host(addr);
- if (ram_addr == RAM_ADDR_INVALID ||
- !kvm_physical_memory_addr_from_host(first_cpu->kvm_state,
- addr, &paddr)) {
- fprintf(stderr, "Hardware memory error for memory used by "
- "QEMU itself instead of guest system!: %p\n", addr);
- return 0;
- }
- kvm_hwpoison_page_add(ram_addr);
- kvm_mce_inject(X86_CPU(first_cpu), paddr, code);
- } else {
- if (code == BUS_MCEERR_AO) {
- return 0;
- } else if (code == BUS_MCEERR_AR) {
- hardware_memory_error();
- } else {
- return 1;
+ if (ram_addr != RAM_ADDR_INVALID &&
+ kvm_physical_memory_addr_from_host(first_cpu->kvm_state,
+ addr, &paddr)) {
+ kvm_hwpoison_page_add(ram_addr);
+ kvm_mce_inject(X86_CPU(first_cpu), paddr, code);
}
+
+ fprintf(stderr, "Hardware memory error for memory used by "
+ "QEMU itself instead of guest system!: %p\n", addr);
}
return 0;
}
--
1.8.3.1
- [Qemu-devel] [PATCH qemu 0/7] KVM: race-free exit from KVM_RUN without POSIX signals, Paolo Bonzini, 2017/02/10
- [Qemu-devel] [PATCH 2/7] KVM: x86: cleanup SIGBUS handlers,
Paolo Bonzini <=
- [Qemu-devel] [PATCH 3/7] cpus: reorganize signal handling code, Paolo Bonzini, 2017/02/10
- [Qemu-devel] [PATCH 1/7] cpus: remove ugly cast on sigbus_handler, Paolo Bonzini, 2017/02/10
- [Qemu-devel] [PATCH 4/7] KVM: remove kvm_arch_on_sigbus, Paolo Bonzini, 2017/02/10
- [Qemu-devel] [PATCH 5/7] KVM: do not use sigtimedwait to catch SIGBUS, Paolo Bonzini, 2017/02/10
- [Qemu-devel] [PATCH 6/7] KVM: move SIG_IPI handling to kvm-all.c, Paolo Bonzini, 2017/02/10
- [Qemu-devel] [PATCH 7/7] KVM: use KVM_CAP_IMMEDIATE_EXIT, Paolo Bonzini, 2017/02/10
- Re: [Qemu-devel] [PATCH qemu 0/7] KVM: race-free exit from KVM_RUN without POSIX signals, no-reply, 2017/02/10
- Re: [Qemu-devel] [PATCH qemu 0/7] KVM: race-free exit from KVM_RUN without POSIX signals, Paolo Bonzini, 2017/02/15