halt state support for ppc
[qemu] / target-ppc / helper.c
index 66c2604..ff1355c 100644 (file)
@@ -806,7 +806,7 @@ void do_compute_hflags (CPUPPCState *env)
 }
 
 void do_store_msr (CPUPPCState *env, target_ulong value)
-    {
+{
     value &= env->msr_mask;
     if (((value >> MSR_IR) & 1) != msr_ir ||
         ((value >> MSR_DR) & 1) != msr_dr) {
@@ -846,6 +846,11 @@ void do_store_msr (CPUPPCState *env, target_ulong value)
     msr_ri  = (value >> MSR_RI)  & 1;
     msr_le  = (value >> MSR_LE)  & 1;
     do_compute_hflags(env);
+    if (msr_pow) {
+        /* power save: exit cpu loop */
+        env->exception_index = EXCP_HLT;
+        cpu_loop_exit();
+    }
 }
 
 float64 do_load_fpscr (CPUPPCState *env)
@@ -1436,15 +1441,5 @@ void do_interrupt (CPUState *env)
     /* Jump to handler */
     env->nip = excp;
     env->exception_index = EXCP_NONE;
-#if 0
-    /* ensure that no TB jump will be modified as
-       the program flow was changed */
-#ifdef __sparc__
-    tmp_T0 = 0;
-#else
-    T0 = 0;
-#endif
-#endif
-    env->interrupt_request |= CPU_INTERRUPT_EXITTB;
 }
 #endif /* !CONFIG_USER_ONLY */