qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 10/11] kvm, x86: unify sigbus handling, post2


From: Jin Dongming
Subject: [Qemu-devel] [PATCH 10/11] kvm, x86: unify sigbus handling, post2
Date: Thu, 14 Oct 2010 17:54:12 +0900
User-agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ja; rv:1.9.2.7) Gecko/20100713 Thunderbird/3.1.1

Cleanup to finish unification.

Signed-off-by: Hidetoshi Seto <address@hidden>
Tested-by: Jin Dongming <address@hidden>
---
 qemu-kvm.c |   41 ++++++++++++-----------------------------
 1 files changed, 12 insertions(+), 29 deletions(-)

diff --git a/qemu-kvm.c b/qemu-kvm.c
index d96394b..d2b2459 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -1222,45 +1222,24 @@ static void 
kvm_mce_inj_srao_broadcast(target_phys_addr_t paddr)
 static void kvm_handle_sigbus(CPUState *env, int code, void *vaddr)
 {
 #if defined(KVM_CAP_MCE) && defined(TARGET_I386)
-    /* env == NULL: when main thread received a SIGBUS */
-    if (!env && vaddr && (code == BUS_MCEERR_AR || code == BUS_MCEERR_AO)) {
+    if (vaddr && (code == BUS_MCEERR_AO || code == BUS_MCEERR_AR)) {
         ram_addr_t ram_addr;
         target_phys_addr_t paddr;
+        CPUState *target_env;
 
         /* Give up MCE forwarding if immediate action required on main thread 
*/
-        if (code == BUS_MCEERR_AR) {
+        if (!env && code == BUS_MCEERR_AR) {
             goto out;
         }
 
         /* Check if recoverable MCE support is enabled */
-        if (!(first_cpu->mcg_cap & MCG_SER_P)){
-            goto out;
-        }
-
-        if (do_qemu_ram_addr_from_host(vaddr, &ram_addr) ||
-            !kvm_physical_memory_addr_from_ram(kvm_state, ram_addr, &paddr)) {
-            fprintf(stderr, "Hardware memory error for memory used by "
-                    "QEMU itself instead of guest system!: %llx\n",
-                    (unsigned long long)vaddr);
-            return;
-        }
-        /* Broadcast SRAO UCR to all vcpu threads */
-        kvm_mce_inj_srao_broadcast(paddr);
-        return;
-    }
-
-    /* env != NULL: when vcpu thread received a SIGBUS */
-    if (env && vaddr && (code == BUS_MCEERR_AR || code == BUS_MCEERR_AO)) {
-        ram_addr_t ram_addr;
-        unsigned long paddr;
-
-        /* Check if recoverable MCE support is enabled */
-        if (!(env->mcg_cap & MCG_SER_P)){
+        target_env = env ? env : first_cpu;
+        if (!target_env || !(target_env->mcg_cap & MCG_SER_P)) {
             goto out;
         }
 
         /* If there is an MCE exception being processed, ignore this SRAO MCE 
*/
-        if (code == BUS_MCEERR_AO && kvm_mce_in_progress(env)) {
+        if (env && code == BUS_MCEERR_AO && kvm_mce_in_progress(env)) {
             return;
         }
 
@@ -1273,10 +1252,14 @@ static void kvm_handle_sigbus(CPUState *env, int code, 
void *vaddr)
         }
         if (code == BUS_MCEERR_AR) {
             /* Fake an Intel architectural Data Load SRAR UCR */
-            kvm_mce_inj_srar_dataload(env, paddr);
+            kvm_mce_inj_srar_dataload(target_env, paddr);
         } else {
             /* Fake an Intel architectural Memory scrubbing UCR */
-            kvm_mce_inj_srao_memscrub(env, paddr);
+            if (env) {
+                kvm_mce_inj_srao_memscrub(target_env, paddr);
+            } else {
+                kvm_mce_inj_srao_broadcast(paddr);
+            }
         }
         return;
     }
-- 
1.7.1.1





reply via email to

[Prev in Thread] Current Thread [Next in Thread]