aboutsummaryrefslogtreecommitdiff
path: root/vl.c
diff options
context:
space:
mode:
Diffstat (limited to 'vl.c')
-rw-r--r--vl.c34
1 files changed, 20 insertions, 14 deletions
diff --git a/vl.c b/vl.c
index 3a694c4730..70f250ebed 100644
--- a/vl.c
+++ b/vl.c
@@ -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;