This patch adds qemu_system_suspend_request() and void qemu_system_wakeup_request() functions to qemu.
qemu_system_suspend_request is supposed to be called when the guest asks for being be suspended, for example via ACPI. qemu_system_wakeup_request is supposed to be called on events which should wake up the guest. Signed-off-by: Gerd Hoffmann <kra...@redhat.com> --- sysemu.h | 2 ++ vl.c | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+), 0 deletions(-) diff --git a/sysemu.h b/sysemu.h index 3806901..d1834a0 100644 --- a/sysemu.h +++ b/sysemu.h @@ -39,6 +39,8 @@ void vm_stop(RunState state); void vm_stop_force_state(RunState state); void qemu_system_reset_request(void); +void qemu_system_suspend_request(qemu_irq wake_irq); +void qemu_system_wakeup_request(void); void qemu_system_shutdown_request(void); void qemu_system_powerdown_request(void); void qemu_system_debug_request(void); diff --git a/vl.c b/vl.c index ba55b35..26413e3 100644 --- a/vl.c +++ b/vl.c @@ -1282,6 +1282,7 @@ static int shutdown_requested, shutdown_signal = -1; static pid_t shutdown_pid; static int powerdown_requested; static int debug_requested; +static qemu_irq suspend_wake_irq; static RunState vmstop_requested = RUN_STATE_MAX; int qemu_shutdown_requested_get(void) @@ -1397,6 +1398,26 @@ void qemu_system_reset_request(void) qemu_notify_event(); } +void qemu_system_suspend_request(qemu_irq wake_irq) +{ + if (suspend_wake_irq != NULL) { + return; + } + cpu_stop_current(); + qemu_notify_event(); + suspend_wake_irq = wake_irq; +} + +void qemu_system_wakeup_request(void) +{ + if (suspend_wake_irq == NULL) { + return; + } + reset_requested = 1; + qemu_irq_raise(suspend_wake_irq); + suspend_wake_irq = NULL; +} + void qemu_system_killed(int signal, pid_t pid) { shutdown_signal = signal; -- 1.7.1