diff options
Diffstat (limited to 'vl.c')
-rw-r--r-- | vl.c | 34 |
1 files changed, 20 insertions, 14 deletions
@@ -233,6 +233,10 @@ const char *prom_envs[MAX_PROM_ENVS]; int nb_drives_opt; char drives_opt[MAX_DRIVES][1024]; +static CPUState *cur_cpu; +static CPUState *next_cpu; +static int event_pending; + #define TFR(expr) do { if ((expr) != -1) break; } while (errno == EINTR) /***********************************************************/ @@ -1180,16 +1184,16 @@ static void host_alarm_handler(int host_signum) struct qemu_alarm_win32 *data = ((struct qemu_alarm_timer*)dwUser)->priv; SetEvent(data->host_alarm); #endif - CPUState *env = cpu_single_env; - if (env) { - /* stop the currently executing cpu because a timer occured */ - cpu_interrupt(env, CPU_INTERRUPT_EXIT); + CPUState *env = next_cpu; + + /* stop the currently executing cpu because a timer occured */ + cpu_interrupt(env, CPU_INTERRUPT_EXIT); #ifdef USE_KQEMU - if (env->kqemu_enabled) { - kqemu_cpu_interrupt(env); - } -#endif + if (env->kqemu_enabled) { + kqemu_cpu_interrupt(env); } +#endif + event_pending = 1; } } @@ -7340,8 +7344,6 @@ void main_loop_wait(int timeout) } -static CPUState *cur_cpu; - static int main_loop(void) { int ret, timeout; @@ -7351,15 +7353,13 @@ static int main_loop(void) CPUState *env; cur_cpu = first_cpu; + next_cpu = cur_cpu->next_cpu ?: first_cpu; for(;;) { if (vm_running) { - env = cur_cpu; for(;;) { /* get next cpu */ - env = env->next_cpu; - if (!env) - env = first_cpu; + env = next_cpu; #ifdef CONFIG_PROFILER ti = profile_getclock(); #endif @@ -7367,6 +7367,12 @@ static int main_loop(void) #ifdef CONFIG_PROFILER qemu_time += profile_getclock() - ti; #endif + next_cpu = env->next_cpu ?: first_cpu; + if (event_pending) { + ret = EXCP_INTERRUPT; + event_pending = 0; + break; + } if (ret == EXCP_HLT) { /* Give the next CPU a chance to run. */ cur_cpu = env; |