From: malc Date: Tue, 4 Nov 2008 14:18:13 +0000 (+0000) Subject: Add safety net against potential infinite loop X-Git-Tag: release_0_10_0~1066 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=55e8b85e4891dafd0d0222ad1ced78e3c5f24e1e;p=thirdparty%2Fqemu.git 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 --- diff --git a/cpu-exec.c b/cpu-exec.c index d31a67aa4d6..62886a4f187 100644 --- a/cpu-exec.c +++ b/cpu-exec.c @@ -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 */