Commit e80e1cc4 authored by Fabrice Bellard's avatar Fabrice Bellard
Browse files

halt state support for ppc


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1657 c046a42c-6fe2-441c-8c8c-71466251a162
parent f24e5695
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -262,6 +262,16 @@ int cpu_exec(CPUState *env1)
            return EXCP_HALTED;
        }
    }
#elif defined(TARGET_PPC)
    if (env1->msr[MSR_POW]) {
        if (env1->msr[MSR_EE] && 
            (env1->interrupt_request & 
             (CPU_INTERRUPT_HARD | CPU_INTERRUPT_TIMER))) {
            env1->msr[MSR_POW] = 0;
        } else {
            return EXCP_HALTED;
        }
    }
#endif

    cpu_single_env = env1; 
+4 −0
Original line number Diff line number Diff line
@@ -255,6 +255,10 @@ static void do_info_cpus(void)
        term_printf(" pc=0x" TARGET_FMT_lx, env->eip + env->segs[R_CS].base);
        if (env->hflags & HF_HALTED_MASK)
            term_printf(" (halted)");
#elif defined(TARGET_PPC)
        term_printf(" nip=0x" TARGET_FMT_lx, env->nip);
        if (msr_pow)
            term_printf(" (halted)");
#endif
        term_printf("\n");
    }
+5 −0
Original line number Diff line number Diff line
@@ -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)
+2 −1
Original line number Diff line number Diff line
@@ -2097,10 +2097,11 @@ GEN_HANDLER(mtmsr, 0x1F, 0x12, 0x04, 0x001FF801, PPC_MISC)
        RET_PRIVREG(ctx);
        return;
    }
    gen_op_update_nip((ctx)->nip);
    gen_op_load_gpr_T0(rS(ctx->opcode));
    gen_op_store_msr();
    /* Must stop the translation as machine state (may have) changed */
    RET_STOP(ctx);
    RET_CHG_FLOW(ctx);
#endif
}