xref: /openbmc/qemu/include/sysemu/runstate.h (revision 2eefd4fcec4b8fe41ceee2a8f00cdec1fe81b75c)
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);
12*9dbab31dSNicholas Piggin void runstate_replay_enable(void);
1354d31236SMarkus Armbruster 
14538f0497SPhilippe Mathieu-Daudé typedef void VMChangeStateHandler(void *opaque, bool running, RunState state);
1554d31236SMarkus Armbruster 
1654d31236SMarkus Armbruster VMChangeStateEntry *qemu_add_vm_change_state_handler(VMChangeStateHandler *cb,
1754d31236SMarkus Armbruster                                                      void *opaque);
1854d31236SMarkus Armbruster VMChangeStateEntry *qemu_add_vm_change_state_handler_prio(
1954d31236SMarkus Armbruster         VMChangeStateHandler *cb, void *opaque, int priority);
209d3103c8SAvihai Horon VMChangeStateEntry *
219d3103c8SAvihai Horon qemu_add_vm_change_state_handler_prio_full(VMChangeStateHandler *cb,
229d3103c8SAvihai Horon                                            VMChangeStateHandler *prepare_cb,
239d3103c8SAvihai Horon                                            void *opaque, int priority);
2454d31236SMarkus Armbruster VMChangeStateEntry *qdev_add_vm_change_state_handler(DeviceState *dev,
2554d31236SMarkus Armbruster                                                      VMChangeStateHandler *cb,
2654d31236SMarkus Armbruster                                                      void *opaque);
2702b2e253SAvihai Horon VMChangeStateEntry *qdev_add_vm_change_state_handler_full(
2802b2e253SAvihai Horon     DeviceState *dev, VMChangeStateHandler *cb,
2902b2e253SAvihai Horon     VMChangeStateHandler *prepare_cb, void *opaque);
3054d31236SMarkus Armbruster void qemu_del_vm_change_state_handler(VMChangeStateEntry *e);
31538f0497SPhilippe Mathieu-Daudé /**
32538f0497SPhilippe Mathieu-Daudé  * vm_state_notify: Notify the state of the VM
33538f0497SPhilippe Mathieu-Daudé  *
34538f0497SPhilippe Mathieu-Daudé  * @running: whether the VM is running or not.
35538f0497SPhilippe Mathieu-Daudé  * @state: the #RunState of the VM.
36538f0497SPhilippe Mathieu-Daudé  */
37538f0497SPhilippe Mathieu-Daudé void vm_state_notify(bool running, RunState state);
3854d31236SMarkus Armbruster 
shutdown_caused_by_guest(ShutdownCause cause)3954d31236SMarkus Armbruster static inline bool shutdown_caused_by_guest(ShutdownCause cause)
4054d31236SMarkus Armbruster {
4154d31236SMarkus Armbruster     return cause >= SHUTDOWN_CAUSE_GUEST_SHUTDOWN;
4254d31236SMarkus Armbruster }
4354d31236SMarkus Armbruster 
44b9ae473dSSteve Sistare /*
45b9ae473dSSteve Sistare  * In a "live" state, the vcpu clock is ticking, and the runstate notifiers
46b9ae473dSSteve Sistare  * think we are running.
47b9ae473dSSteve Sistare  */
runstate_is_live(RunState state)48b9ae473dSSteve Sistare static inline bool runstate_is_live(RunState state)
49b9ae473dSSteve Sistare {
50b9ae473dSSteve Sistare     return state == RUN_STATE_RUNNING || state == RUN_STATE_SUSPENDED;
51b9ae473dSSteve Sistare }
52b9ae473dSSteve Sistare 
5354d31236SMarkus Armbruster void vm_start(void);
54d7482ffeSIvan Shcherbakov 
55d7482ffeSIvan Shcherbakov /**
56d7482ffeSIvan Shcherbakov  * vm_prepare_start: Prepare for starting/resuming the VM
57d7482ffeSIvan Shcherbakov  *
58d7482ffeSIvan Shcherbakov  * @step_pending: whether any of the CPUs is about to be single-stepped by gdb
59d7482ffeSIvan Shcherbakov  */
60d7482ffeSIvan Shcherbakov int vm_prepare_start(bool step_pending);
619ff5e79fSSteve Sistare 
629ff5e79fSSteve Sistare /**
639ff5e79fSSteve Sistare  * vm_resume: If @state is a live state, start the vm and set the state,
649ff5e79fSSteve Sistare  * else just set the state.
659ff5e79fSSteve Sistare  *
669ff5e79fSSteve Sistare  * @state: the state to restore
679ff5e79fSSteve Sistare  */
689ff5e79fSSteve Sistare void vm_resume(RunState state);
699ff5e79fSSteve Sistare 
7054d31236SMarkus Armbruster int vm_stop(RunState state);
7154d31236SMarkus Armbruster int vm_stop_force_state(RunState state);
7254d31236SMarkus Armbruster int vm_shutdown(void);
73f06f316dSSteve Sistare void vm_set_suspended(bool suspended);
74f06f316dSSteve Sistare bool vm_get_suspended(void);
7554d31236SMarkus Armbruster 
7654d31236SMarkus Armbruster typedef enum WakeupReason {
7754d31236SMarkus Armbruster     /* Always keep QEMU_WAKEUP_REASON_NONE = 0 */
7854d31236SMarkus Armbruster     QEMU_WAKEUP_REASON_NONE = 0,
7954d31236SMarkus Armbruster     QEMU_WAKEUP_REASON_RTC,
8054d31236SMarkus Armbruster     QEMU_WAKEUP_REASON_PMTIMER,
8154d31236SMarkus Armbruster     QEMU_WAKEUP_REASON_OTHER,
8254d31236SMarkus Armbruster } WakeupReason;
8354d31236SMarkus Armbruster 
8454d31236SMarkus Armbruster void qemu_system_reset_request(ShutdownCause reason);
8554d31236SMarkus Armbruster void qemu_system_suspend_request(void);
8654d31236SMarkus Armbruster void qemu_register_suspend_notifier(Notifier *notifier);
8754d31236SMarkus Armbruster bool qemu_wakeup_suspend_enabled(void);
8854d31236SMarkus Armbruster void qemu_system_wakeup_request(WakeupReason reason, Error **errp);
8954d31236SMarkus Armbruster void qemu_system_wakeup_enable(WakeupReason reason, bool enabled);
9054d31236SMarkus Armbruster void qemu_register_wakeup_notifier(Notifier *notifier);
9154d31236SMarkus Armbruster void qemu_register_wakeup_support(void);
920386f39bSClément Chigot void qemu_system_shutdown_request_with_code(ShutdownCause reason,
930386f39bSClément Chigot                                             int exit_code);
9454d31236SMarkus Armbruster void qemu_system_shutdown_request(ShutdownCause reason);
9554d31236SMarkus Armbruster void qemu_system_powerdown_request(void);
9654d31236SMarkus Armbruster void qemu_register_powerdown_notifier(Notifier *notifier);
9754d31236SMarkus Armbruster void qemu_register_shutdown_notifier(Notifier *notifier);
9854d31236SMarkus Armbruster void qemu_system_debug_request(void);
9954d31236SMarkus Armbruster void qemu_system_vmstop_request(RunState reason);
10054d31236SMarkus Armbruster void qemu_system_vmstop_request_prepare(void);
10154d31236SMarkus Armbruster bool qemu_vmstop_requested(RunState *r);
10254d31236SMarkus Armbruster ShutdownCause qemu_shutdown_requested_get(void);
10354d31236SMarkus Armbruster ShutdownCause qemu_reset_requested_get(void);
10454d31236SMarkus Armbruster void qemu_system_killed(int signal, pid_t pid);
10554d31236SMarkus Armbruster void qemu_system_reset(ShutdownCause reason);
10654d31236SMarkus Armbruster void qemu_system_guest_panicked(GuestPanicInformation *info);
1077dc58deeSzhenwei pi void qemu_system_guest_crashloaded(GuestPanicInformation *info);
1086269086bSThomas Weißschuh void qemu_system_guest_pvshutdown(void);
109544803c7SMarc-André Lureau bool qemu_system_dump_in_progress(void);
11054d31236SMarkus Armbruster 
11154d31236SMarkus Armbruster #endif
11254d31236SMarkus Armbruster 
113