Its simpler to handle these events from only one context. Index: qemu/vl.c =================================================================== --- qemu.orig/vl.c +++ qemu/vl.c @@ -3540,22 +3540,19 @@ void qemu_system_reset_request(void) } else { reset_requested = 1; } - if (cpu_single_env) - cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT); + main_loop_break(); } void qemu_system_shutdown_request(void) { shutdown_requested = 1; - if (cpu_single_env) - cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT); + main_loop_break(); } void qemu_system_powerdown_request(void) { powerdown_requested = 1; - if (cpu_single_env) - cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT); + main_loop_break(); } #ifdef _WIN32 @@ -3921,25 +3918,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); @@ -3987,10 +3965,6 @@ static void *cpu_main_loop(void *arg) timeout = 0; } } else { - if (shutdown_requested) { - ret = EXCP_INTERRUPT; - break; - } timeout = 5000; } #ifdef CONFIG_PROFILER @@ -4017,8 +3991,18 @@ static void main_loop(void) qemu_thread_create(&cpus_thread, cpu_main_loop, NULL); - 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) --