]> xenbits.xensource.com Git - qemu-xen-4.2-testing.git/commitdiff
Fix reproductible crash: call cpu_loop_exit from micro-op, not from helper.c
authorj_mayer <j_mayer@c046a42c-6fe2-441c-8c8c-71466251a162>
Mon, 1 Oct 2007 21:49:57 +0000 (21:49 +0000)
committerj_mayer <j_mayer@c046a42c-6fe2-441c-8c8c-71466251a162>
Mon, 1 Oct 2007 21:49:57 +0000 (21:49 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3311 c046a42c-6fe2-441c-8c8c-71466251a162

target-ppc/cpu.h
target-ppc/helper.c
target-ppc/op.c

index c4ae414413c80bdbc6b94b02c4b592b9d1656713..396a5884b16580e6b83b64f30d0fce3de40501c5 100644 (file)
@@ -611,9 +611,9 @@ void do_store_sr (CPUPPCState *env, int srnum, target_ulong value);
 target_ulong ppc_load_xer (CPUPPCState *env);
 void ppc_store_xer (CPUPPCState *env, target_ulong value);
 target_ulong do_load_msr (CPUPPCState *env);
-void do_store_msr (CPUPPCState *env, target_ulong value);
+int do_store_msr (CPUPPCState *env, target_ulong value);
 #if defined(TARGET_PPC64)
-void ppc_store_msr_32 (CPUPPCState *env, uint32_t value);
+int ppc_store_msr_32 (CPUPPCState *env, uint32_t value);
 #endif
 
 void do_compute_hflags (CPUPPCState *env);
index 5b0fd09b9c9df627bf7c0124966715aaeca3f865..5fa5ee002a2e7fe26211a11422386668729bb0db 100644 (file)
@@ -1839,7 +1839,7 @@ target_ulong do_load_msr (CPUPPCState *env)
         ((target_ulong)msr_le   << MSR_LE);
 }
 
-void do_store_msr (CPUPPCState *env, target_ulong value)
+int do_store_msr (CPUPPCState *env, target_ulong value)
 {
     int enter_pm;
 
@@ -1921,21 +1921,15 @@ void do_store_msr (CPUPPCState *env, target_ulong value)
     default:
         break;
     }
-    if (enter_pm) {
-        if (likely(!env->halted)) {
-            /* power save: exit cpu loop */
-            env->halted = 1;
-            env->exception_index = EXCP_HLT;
-            cpu_loop_exit();
-        }
-    }
+
+    return enter_pm;
 }
 
 #if defined(TARGET_PPC64)
-void ppc_store_msr_32 (CPUPPCState *env, uint32_t value)
+int ppc_store_msr_32 (CPUPPCState *env, uint32_t value)
 {
-    do_store_msr(env,
-                 (do_load_msr(env) & ~0xFFFFFFFFULL) | (value & 0xFFFFFFFF));
+    return do_store_msr(env, (do_load_msr(env) & ~0xFFFFFFFFULL) |
+                        (value & 0xFFFFFFFF));
 }
 #endif
 
index 822c267695f9b9c353e14c6fdbec51cdb07a394a..72fd48346313b4292a09ceba3d8d9807d712b965 100644 (file)
@@ -351,7 +351,10 @@ void OPPROTO op_load_msr (void)
 
 void OPPROTO op_store_msr (void)
 {
-    do_store_msr(env, T0);
+    if (do_store_msr(env, T0)) {
+        env->halted = 1;
+        do_raise_exception(EXCP_HLT);
+    }
     RETURN();
 }
 
@@ -365,7 +368,10 @@ void OPPROTO op_update_riee (void)
 #if defined (TARGET_PPC64)
 void OPPROTO op_store_msr_32 (void)
 {
-    ppc_store_msr_32(env, T0);
+    if (ppc_store_msr_32(env, T0)) {
+        env->halted = 1;
+        do_raise_exception(EXCP_HLT);
+    }
     RETURN();
 }
 #endif