154d31236SMarkus Armbruster #ifndef SYSEMU_RUNSTATE_H 254d31236SMarkus Armbruster #define SYSEMU_RUNSTATE_H 354d31236SMarkus Armbruster 454d31236SMarkus Armbruster #include "qapi/qapi-types-run-state.h" 554d31236SMarkus Armbruster #include "qemu/notify.h" 654d31236SMarkus Armbruster 754d31236SMarkus Armbruster bool runstate_check(RunState state); 854d31236SMarkus Armbruster void runstate_set(RunState new_state); 9242b74ebSVladimir Sementsov-Ogievskiy RunState runstate_get(void); 100a389509SPhilippe Mathieu-Daudé bool runstate_is_running(void); 1154d31236SMarkus Armbruster bool runstate_needs_reset(void); 1254d31236SMarkus Armbruster 13538f0497SPhilippe Mathieu-Daudé typedef void VMChangeStateHandler(void *opaque, bool running, RunState state); 1454d31236SMarkus Armbruster 1554d31236SMarkus Armbruster VMChangeStateEntry *qemu_add_vm_change_state_handler(VMChangeStateHandler *cb, 1654d31236SMarkus Armbruster void *opaque); 1754d31236SMarkus Armbruster VMChangeStateEntry *qemu_add_vm_change_state_handler_prio( 1854d31236SMarkus Armbruster VMChangeStateHandler *cb, void *opaque, int priority); 199d3103c8SAvihai Horon VMChangeStateEntry * 209d3103c8SAvihai Horon qemu_add_vm_change_state_handler_prio_full(VMChangeStateHandler *cb, 219d3103c8SAvihai Horon VMChangeStateHandler *prepare_cb, 229d3103c8SAvihai Horon void *opaque, int priority); 2354d31236SMarkus Armbruster VMChangeStateEntry *qdev_add_vm_change_state_handler(DeviceState *dev, 2454d31236SMarkus Armbruster VMChangeStateHandler *cb, 2554d31236SMarkus Armbruster void *opaque); 26*02b2e253SAvihai Horon VMChangeStateEntry *qdev_add_vm_change_state_handler_full( 27*02b2e253SAvihai Horon DeviceState *dev, VMChangeStateHandler *cb, 28*02b2e253SAvihai Horon VMChangeStateHandler *prepare_cb, void *opaque); 2954d31236SMarkus Armbruster void qemu_del_vm_change_state_handler(VMChangeStateEntry *e); 30538f0497SPhilippe Mathieu-Daudé /** 31538f0497SPhilippe Mathieu-Daudé * vm_state_notify: Notify the state of the VM 32538f0497SPhilippe Mathieu-Daudé * 33538f0497SPhilippe Mathieu-Daudé * @running: whether the VM is running or not. 34538f0497SPhilippe Mathieu-Daudé * @state: the #RunState of the VM. 35538f0497SPhilippe Mathieu-Daudé */ 36538f0497SPhilippe Mathieu-Daudé void vm_state_notify(bool running, RunState state); 3754d31236SMarkus Armbruster 3854d31236SMarkus Armbruster static inline bool shutdown_caused_by_guest(ShutdownCause cause) 3954d31236SMarkus Armbruster { 4054d31236SMarkus Armbruster return cause >= SHUTDOWN_CAUSE_GUEST_SHUTDOWN; 4154d31236SMarkus Armbruster } 4254d31236SMarkus Armbruster 4354d31236SMarkus Armbruster void vm_start(void); 44d7482ffeSIvan Shcherbakov 45d7482ffeSIvan Shcherbakov /** 46d7482ffeSIvan Shcherbakov * vm_prepare_start: Prepare for starting/resuming the VM 47d7482ffeSIvan Shcherbakov * 48d7482ffeSIvan Shcherbakov * @step_pending: whether any of the CPUs is about to be single-stepped by gdb 49d7482ffeSIvan Shcherbakov */ 50d7482ffeSIvan Shcherbakov int vm_prepare_start(bool step_pending); 5154d31236SMarkus Armbruster int vm_stop(RunState state); 5254d31236SMarkus Armbruster int vm_stop_force_state(RunState state); 5354d31236SMarkus Armbruster int vm_shutdown(void); 5454d31236SMarkus Armbruster 5554d31236SMarkus Armbruster typedef enum WakeupReason { 5654d31236SMarkus Armbruster /* Always keep QEMU_WAKEUP_REASON_NONE = 0 */ 5754d31236SMarkus Armbruster QEMU_WAKEUP_REASON_NONE = 0, 5854d31236SMarkus Armbruster QEMU_WAKEUP_REASON_RTC, 5954d31236SMarkus Armbruster QEMU_WAKEUP_REASON_PMTIMER, 6054d31236SMarkus Armbruster QEMU_WAKEUP_REASON_OTHER, 6154d31236SMarkus Armbruster } WakeupReason; 6254d31236SMarkus Armbruster 6354d31236SMarkus Armbruster void qemu_system_reset_request(ShutdownCause reason); 6454d31236SMarkus Armbruster void qemu_system_suspend_request(void); 6554d31236SMarkus Armbruster void qemu_register_suspend_notifier(Notifier *notifier); 6654d31236SMarkus Armbruster bool qemu_wakeup_suspend_enabled(void); 6754d31236SMarkus Armbruster void qemu_system_wakeup_request(WakeupReason reason, Error **errp); 6854d31236SMarkus Armbruster void qemu_system_wakeup_enable(WakeupReason reason, bool enabled); 6954d31236SMarkus Armbruster void qemu_register_wakeup_notifier(Notifier *notifier); 7054d31236SMarkus Armbruster void qemu_register_wakeup_support(void); 7154d31236SMarkus Armbruster void qemu_system_shutdown_request(ShutdownCause reason); 7254d31236SMarkus Armbruster void qemu_system_powerdown_request(void); 7354d31236SMarkus Armbruster void qemu_register_powerdown_notifier(Notifier *notifier); 7454d31236SMarkus Armbruster void qemu_register_shutdown_notifier(Notifier *notifier); 7554d31236SMarkus Armbruster void qemu_system_debug_request(void); 7654d31236SMarkus Armbruster void qemu_system_vmstop_request(RunState reason); 7754d31236SMarkus Armbruster void qemu_system_vmstop_request_prepare(void); 7854d31236SMarkus Armbruster bool qemu_vmstop_requested(RunState *r); 7954d31236SMarkus Armbruster ShutdownCause qemu_shutdown_requested_get(void); 8054d31236SMarkus Armbruster ShutdownCause qemu_reset_requested_get(void); 8154d31236SMarkus Armbruster void qemu_system_killed(int signal, pid_t pid); 8254d31236SMarkus Armbruster void qemu_system_reset(ShutdownCause reason); 8354d31236SMarkus Armbruster void qemu_system_guest_panicked(GuestPanicInformation *info); 847dc58deeSzhenwei pi void qemu_system_guest_crashloaded(GuestPanicInformation *info); 85544803c7SMarc-André Lureau bool qemu_system_dump_in_progress(void); 8654d31236SMarkus Armbruster 8754d31236SMarkus Armbruster #endif 8854d31236SMarkus Armbruster 89