Commit 6e29f5da4de7b3686609e92f2d4b3119762a744a
1 parent
e6e35b1e
qemu: handle stop request in main loop (Marcelo Tosatti)
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@7247 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
26 additions
and
10 deletions
vl.c
... | ... | @@ -3547,15 +3547,6 @@ void vm_start(void) |
3547 | 3547 | } |
3548 | 3548 | } |
3549 | 3549 | |
3550 | -void vm_stop(int reason) | |
3551 | -{ | |
3552 | - if (vm_running) { | |
3553 | - cpu_disable_ticks(); | |
3554 | - vm_running = 0; | |
3555 | - vm_state_notify(0, reason); | |
3556 | - } | |
3557 | -} | |
3558 | - | |
3559 | 3550 | /* reset/shutdown handler */ |
3560 | 3551 | |
3561 | 3552 | typedef struct QEMUResetEntry { |
... | ... | @@ -3569,6 +3560,7 @@ static int reset_requested; |
3569 | 3560 | static int shutdown_requested; |
3570 | 3561 | static int powerdown_requested; |
3571 | 3562 | static int debug_requested; |
3563 | +static int vmstop_requested; | |
3572 | 3564 | |
3573 | 3565 | int qemu_shutdown_requested(void) |
3574 | 3566 | { |
... | ... | @@ -3598,6 +3590,22 @@ static int qemu_debug_requested(void) |
3598 | 3590 | return r; |
3599 | 3591 | } |
3600 | 3592 | |
3593 | +static int qemu_vmstop_requested(void) | |
3594 | +{ | |
3595 | + int r = vmstop_requested; | |
3596 | + vmstop_requested = 0; | |
3597 | + return r; | |
3598 | +} | |
3599 | + | |
3600 | +static void do_vm_stop(int reason) | |
3601 | +{ | |
3602 | + if (vm_running) { | |
3603 | + cpu_disable_ticks(); | |
3604 | + vm_running = 0; | |
3605 | + vm_state_notify(0, reason); | |
3606 | + } | |
3607 | +} | |
3608 | + | |
3601 | 3609 | void qemu_register_reset(QEMUResetHandler *func, void *opaque) |
3602 | 3610 | { |
3603 | 3611 | QEMUResetEntry **pre, *re; |
... | ... | @@ -3761,6 +3769,11 @@ void qemu_cpu_kick(void *env) |
3761 | 3769 | #define qemu_mutex_lock_iothread() do { } while (0) |
3762 | 3770 | #define qemu_mutex_unlock_iothread() do { } while (0) |
3763 | 3771 | |
3772 | +void vm_stop(int reason) | |
3773 | +{ | |
3774 | + do_vm_stop(reason); | |
3775 | +} | |
3776 | + | |
3764 | 3777 | #ifdef _WIN32 |
3765 | 3778 | static void host_main_loop_wait(int *timeout) |
3766 | 3779 | { |
... | ... | @@ -4058,8 +4071,9 @@ static int vm_can_run(void) |
4058 | 4071 | |
4059 | 4072 | static void main_loop(void) |
4060 | 4073 | { |
4061 | - for (;;) { | |
4074 | + int r; | |
4062 | 4075 | |
4076 | + for (;;) { | |
4063 | 4077 | do { |
4064 | 4078 | #ifdef CONFIG_PROFILER |
4065 | 4079 | int64_t ti; |
... | ... | @@ -4087,6 +4101,8 @@ static void main_loop(void) |
4087 | 4101 | qemu_system_reset(); |
4088 | 4102 | if (qemu_powerdown_requested()) |
4089 | 4103 | qemu_system_powerdown(); |
4104 | + if ((r = qemu_vmstop_requested())) | |
4105 | + vm_stop(r); | |
4090 | 4106 | } |
4091 | 4107 | } |
4092 | 4108 | ... | ... |