[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 07/17] KVM: x86: cleanup SIGBUS handlers
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH 07/17] KVM: x86: cleanup SIGBUS handlers |
Date: |
Mon, 27 Feb 2017 13:45:41 +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;
}
--
2.9.3
- [Qemu-devel] [PULL v2 00/17] KVM and cpu-exec patches for 2.9 soft freeze, Paolo Bonzini, 2017/02/27
- [Qemu-devel] [PATCH 02/17] replay: check icount in cpu exec loop, Paolo Bonzini, 2017/02/27
- [Qemu-devel] [PATCH 03/17] cpu-exec: remove unnecessary check of cpu->exit_request, Paolo Bonzini, 2017/02/27
- [Qemu-devel] [PATCH 01/17] cpu-exec: unify icount_decr and tcg_exit_req, Paolo Bonzini, 2017/02/27
- [Qemu-devel] [PATCH 04/17] update-linux-headers: update for 4.11, Paolo Bonzini, 2017/02/27
- [Qemu-devel] [PATCH 06/17] cpus: remove ugly cast on sigbus_handler, Paolo Bonzini, 2017/02/27
- [Qemu-devel] [PATCH 07/17] KVM: x86: cleanup SIGBUS handlers,
Paolo Bonzini <=
- [Qemu-devel] [PATCH 08/17] cpus: reorganize signal handling code, Paolo Bonzini, 2017/02/27
- [Qemu-devel] [PATCH 09/17] KVM: remove kvm_arch_on_sigbus, Paolo Bonzini, 2017/02/27
- [Qemu-devel] [PATCH 10/17] KVM: do not use sigtimedwait to catch SIGBUS, Paolo Bonzini, 2017/02/27
- [Qemu-devel] [PATCH 12/17] kvm: use atomic_read/atomic_set to access cpu->exit_request, Paolo Bonzini, 2017/02/27
- [Qemu-devel] [PATCH 11/17] KVM: move SIG_IPI handling to kvm-all.c, Paolo Bonzini, 2017/02/27
- [Qemu-devel] [PATCH 13/17] KVM: use KVM_CAP_IMMEDIATE_EXIT, Paolo Bonzini, 2017/02/27
- [Qemu-devel] [PATCH 15/17] vmxcap: update for September 2016 SDM, Paolo Bonzini, 2017/02/27
- [Qemu-devel] [PATCH 14/17] vmxcap: port to Python 3, Paolo Bonzini, 2017/02/27
- [Qemu-devel] [PATCH 05/17] update Linux headers to 4.11, Paolo Bonzini, 2017/02/27
- [Qemu-devel] [PATCH 17/17] qmp-events: fix GUEST_PANICKED description formatting, Paolo Bonzini, 2017/02/27