Add safety net against potential infinite loop
cpu_interrupt might be called while translating the TB, but before it is linked into a potentially infinite loop and becomes env->current_tb. Currently this can (and does) cause huge problems only when using dyntick clock, with other (periodic) clocks host_alarm_handler will eventually be executed resulting in a call to cpu_interrupt which will reset the recursion of running TB and the damage is "only" latency. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5620 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
0c5f3c8d7d
commit
55e8b85e48
@ -623,6 +623,14 @@ int cpu_exec(CPUState *env1)
|
||||
}
|
||||
spin_unlock(&tb_lock);
|
||||
env->current_tb = tb;
|
||||
|
||||
/* cpu_interrupt might be called while translating the
|
||||
TB, but before it is linked into a potentially
|
||||
infinite loop and becomes env->current_tb. Avoid
|
||||
starting execution if there is a pending interrupt. */
|
||||
if (unlikely (env->interrupt_request & CPU_INTERRUPT_EXIT))
|
||||
env->current_tb = NULL;
|
||||
|
||||
while (env->current_tb) {
|
||||
tc_ptr = tb->tc_ptr;
|
||||
/* execute the generated code */
|
||||
|
Loading…
Reference in New Issue
Block a user