Fix reproductible crash: call cpu_loop_exit from micro-op, not from helper.c
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3311 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
51996525c7
commit
a97fed52e5
@ -611,9 +611,9 @@ void do_store_sr (CPUPPCState *env, int srnum, target_ulong value);
|
|||||||
target_ulong ppc_load_xer (CPUPPCState *env);
|
target_ulong ppc_load_xer (CPUPPCState *env);
|
||||||
void ppc_store_xer (CPUPPCState *env, target_ulong value);
|
void ppc_store_xer (CPUPPCState *env, target_ulong value);
|
||||||
target_ulong do_load_msr (CPUPPCState *env);
|
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)
|
#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
|
#endif
|
||||||
|
|
||||||
void do_compute_hflags (CPUPPCState *env);
|
void do_compute_hflags (CPUPPCState *env);
|
||||||
|
@ -1839,7 +1839,7 @@ target_ulong do_load_msr (CPUPPCState *env)
|
|||||||
((target_ulong)msr_le << MSR_LE);
|
((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;
|
int enter_pm;
|
||||||
|
|
||||||
@ -1921,21 +1921,15 @@ void do_store_msr (CPUPPCState *env, target_ulong value)
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (enter_pm) {
|
|
||||||
if (likely(!env->halted)) {
|
return enter_pm;
|
||||||
/* power save: exit cpu loop */
|
|
||||||
env->halted = 1;
|
|
||||||
env->exception_index = EXCP_HLT;
|
|
||||||
cpu_loop_exit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(TARGET_PPC64)
|
#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,
|
return do_store_msr(env, (do_load_msr(env) & ~0xFFFFFFFFULL) |
|
||||||
(do_load_msr(env) & ~0xFFFFFFFFULL) | (value & 0xFFFFFFFF));
|
(value & 0xFFFFFFFF));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -351,7 +351,10 @@ void OPPROTO op_load_msr (void)
|
|||||||
|
|
||||||
void OPPROTO op_store_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();
|
RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -365,7 +368,10 @@ void OPPROTO op_update_riee (void)
|
|||||||
#if defined (TARGET_PPC64)
|
#if defined (TARGET_PPC64)
|
||||||
void OPPROTO op_store_msr_32 (void)
|
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();
|
RETURN();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user