Its simpler to handle these events from only one context. Signed-off-by: Marcelo Tosatti Index: trunk/vl.c =================================================================== --- trunk.orig/vl.c +++ trunk/vl.c @@ -4031,25 +4031,6 @@ static void *cpu_main_loop(void *arg) } cur_cpu = env; - if (shutdown_requested) { - ret = EXCP_INTERRUPT; - if (no_shutdown) { - vm_stop(0); - no_shutdown = 0; - } - else - break; - } - if (reset_requested) { - reset_requested = 0; - qemu_system_reset(); - ret = EXCP_INTERRUPT; - } - if (powerdown_requested) { - powerdown_requested = 0; - qemu_system_powerdown(); - ret = EXCP_INTERRUPT; - } if (unlikely(ret == EXCP_DEBUG)) { gdb_set_stop_cpu(cur_cpu); vm_stop(EXCP_DEBUG); @@ -4098,10 +4079,6 @@ static void *cpu_main_loop(void *arg) } } else { env = env->next_cpu ?: first_cpu; - if (shutdown_requested) { - ret = EXCP_INTERRUPT; - break; - } timeout = 5000; } #ifdef CONFIG_PROFILER @@ -4152,8 +4129,18 @@ static void main_loop(void) qemu_system_ready = 1; qemu_cond_broadcast(&qemu_system_cond); - while (1) + while (1) { main_loop_wait(1000); + if (qemu_shutdown_requested()) { + if (no_shutdown) + no_shutdown = 0; + else + break; + } else if (qemu_powerdown_requested()) + qemu_system_powerdown(); + else if (qemu_reset_requested()) + qemu_system_reset(); + } } static void help(int exitcode) --