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); 90a389509SPhilippe Mathieu-Daudé bool runstate_is_running(void); 1054d31236SMarkus Armbruster bool runstate_needs_reset(void); 1154d31236SMarkus Armbruster bool runstate_store(char *str, size_t size); 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); 1954d31236SMarkus Armbruster VMChangeStateEntry *qdev_add_vm_change_state_handler(DeviceState *dev, 2054d31236SMarkus Armbruster VMChangeStateHandler *cb, 2154d31236SMarkus Armbruster void *opaque); 2254d31236SMarkus Armbruster void qemu_del_vm_change_state_handler(VMChangeStateEntry *e); 23538f0497SPhilippe Mathieu-Daudé /** 24538f0497SPhilippe Mathieu-Daudé * vm_state_notify: Notify the state of the VM 25538f0497SPhilippe Mathieu-Daudé * 26538f0497SPhilippe Mathieu-Daudé * @running: whether the VM is running or not. 27538f0497SPhilippe Mathieu-Daudé * @state: the #RunState of the VM. 28538f0497SPhilippe Mathieu-Daudé */ 29538f0497SPhilippe Mathieu-Daudé void vm_state_notify(bool running, RunState state); 3054d31236SMarkus Armbruster 3154d31236SMarkus Armbruster static inline bool shutdown_caused_by_guest(ShutdownCause cause) 3254d31236SMarkus Armbruster { 3354d31236SMarkus Armbruster return cause >= SHUTDOWN_CAUSE_GUEST_SHUTDOWN; 3454d31236SMarkus Armbruster } 3554d31236SMarkus Armbruster 3654d31236SMarkus Armbruster void vm_start(void); 37*d7482ffeSIvan Shcherbakov 38*d7482ffeSIvan Shcherbakov /** 39*d7482ffeSIvan Shcherbakov * vm_prepare_start: Prepare for starting/resuming the VM 40*d7482ffeSIvan Shcherbakov * 41*d7482ffeSIvan Shcherbakov * @step_pending: whether any of the CPUs is about to be single-stepped by gdb 42*d7482ffeSIvan Shcherbakov */ 43*d7482ffeSIvan Shcherbakov int vm_prepare_start(bool step_pending); 4454d31236SMarkus Armbruster int vm_stop(RunState state); 4554d31236SMarkus Armbruster int vm_stop_force_state(RunState state); 4654d31236SMarkus Armbruster int vm_shutdown(void); 4754d31236SMarkus Armbruster 4854d31236SMarkus Armbruster typedef enum WakeupReason { 4954d31236SMarkus Armbruster /* Always keep QEMU_WAKEUP_REASON_NONE = 0 */ 5054d31236SMarkus Armbruster QEMU_WAKEUP_REASON_NONE = 0, 5154d31236SMarkus Armbruster QEMU_WAKEUP_REASON_RTC, 5254d31236SMarkus Armbruster QEMU_WAKEUP_REASON_PMTIMER, 5354d31236SMarkus Armbruster QEMU_WAKEUP_REASON_OTHER, 5454d31236SMarkus Armbruster } WakeupReason; 5554d31236SMarkus Armbruster 5654d31236SMarkus Armbruster void qemu_system_reset_request(ShutdownCause reason); 5754d31236SMarkus Armbruster void qemu_system_suspend_request(void); 5854d31236SMarkus Armbruster void qemu_register_suspend_notifier(Notifier *notifier); 5954d31236SMarkus Armbruster bool qemu_wakeup_suspend_enabled(void); 6054d31236SMarkus Armbruster void qemu_system_wakeup_request(WakeupReason reason, Error **errp); 6154d31236SMarkus Armbruster void qemu_system_wakeup_enable(WakeupReason reason, bool enabled); 6254d31236SMarkus Armbruster void qemu_register_wakeup_notifier(Notifier *notifier); 6354d31236SMarkus Armbruster void qemu_register_wakeup_support(void); 6454d31236SMarkus Armbruster void qemu_system_shutdown_request(ShutdownCause reason); 6554d31236SMarkus Armbruster void qemu_system_powerdown_request(void); 6654d31236SMarkus Armbruster void qemu_register_powerdown_notifier(Notifier *notifier); 6754d31236SMarkus Armbruster void qemu_register_shutdown_notifier(Notifier *notifier); 6854d31236SMarkus Armbruster void qemu_system_debug_request(void); 6954d31236SMarkus Armbruster void qemu_system_vmstop_request(RunState reason); 7054d31236SMarkus Armbruster void qemu_system_vmstop_request_prepare(void); 7154d31236SMarkus Armbruster bool qemu_vmstop_requested(RunState *r); 7254d31236SMarkus Armbruster ShutdownCause qemu_shutdown_requested_get(void); 7354d31236SMarkus Armbruster ShutdownCause qemu_reset_requested_get(void); 7454d31236SMarkus Armbruster void qemu_system_killed(int signal, pid_t pid); 7554d31236SMarkus Armbruster void qemu_system_reset(ShutdownCause reason); 7654d31236SMarkus Armbruster void qemu_system_guest_panicked(GuestPanicInformation *info); 777dc58deeSzhenwei pi void qemu_system_guest_crashloaded(GuestPanicInformation *info); 78544803c7SMarc-André Lureau bool qemu_system_dump_in_progress(void); 7954d31236SMarkus Armbruster 8054d31236SMarkus Armbruster #endif 8154d31236SMarkus Armbruster 82