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);
 
         ((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;
 
     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
 
 
 
 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();
 }
 
 #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