19c17d615SPaolo Bonzini #ifndef SYSEMU_H 29c17d615SPaolo Bonzini #define SYSEMU_H 39c17d615SPaolo Bonzini /* Misc. things related to the system emulator. */ 49c17d615SPaolo Bonzini 59c17d615SPaolo Bonzini #include "qemu/option.h" 69c17d615SPaolo Bonzini #include "qemu/queue.h" 79c17d615SPaolo Bonzini #include "qemu/timer.h" 89c17d615SPaolo Bonzini #include "qapi-types.h" 99c17d615SPaolo Bonzini #include "qemu/notify.h" 109c17d615SPaolo Bonzini #include "qemu/main-loop.h" 118c85901eSWanlong Gao #include "qemu/bitmap.h" 12dfabb8b9SPaolo Bonzini #include "qom/object.h" 139c17d615SPaolo Bonzini 149c17d615SPaolo Bonzini /* vl.c */ 159c17d615SPaolo Bonzini 169c17d615SPaolo Bonzini extern const char *bios_name; 179c17d615SPaolo Bonzini 189c17d615SPaolo Bonzini extern const char *qemu_name; 199c17d615SPaolo Bonzini extern uint8_t qemu_uuid[]; 20fc3b3295SMarkus Armbruster extern bool qemu_uuid_set; 219c17d615SPaolo Bonzini int qemu_uuid_parse(const char *str, uint8_t *uuid); 225accc840SPaolo Bonzini 239c17d615SPaolo Bonzini #define UUID_FMT "%02hhx%02hhx%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx" 245accc840SPaolo Bonzini #define UUID_NONE "00000000-0000-0000-0000-000000000000" 259c17d615SPaolo Bonzini 269c17d615SPaolo Bonzini bool runstate_check(RunState state); 279c17d615SPaolo Bonzini void runstate_set(RunState new_state); 289c17d615SPaolo Bonzini int runstate_is_running(void); 29ede085b3SHu Tao bool runstate_needs_reset(void); 305e0f1940SJuan Quintela bool runstate_store(char *str, size_t size); 319c17d615SPaolo Bonzini typedef struct vm_change_state_entry VMChangeStateEntry; 329c17d615SPaolo Bonzini typedef void VMChangeStateHandler(void *opaque, int running, RunState state); 339c17d615SPaolo Bonzini 349c17d615SPaolo Bonzini VMChangeStateEntry *qemu_add_vm_change_state_handler(VMChangeStateHandler *cb, 359c17d615SPaolo Bonzini void *opaque); 369c17d615SPaolo Bonzini void qemu_del_vm_change_state_handler(VMChangeStateEntry *e); 379c17d615SPaolo Bonzini void vm_state_notify(int running, RunState state); 389c17d615SPaolo Bonzini 399c17d615SPaolo Bonzini #define VMRESET_SILENT false 409c17d615SPaolo Bonzini #define VMRESET_REPORT true 419c17d615SPaolo Bonzini 429c17d615SPaolo Bonzini void vm_start(void); 4356983463SKevin Wolf int vm_stop(RunState state); 4456983463SKevin Wolf int vm_stop_force_state(RunState state); 459c17d615SPaolo Bonzini 469c17d615SPaolo Bonzini typedef enum WakeupReason { 474bc78a87SLiu, Jinsong /* Always keep QEMU_WAKEUP_REASON_NONE = 0 */ 484bc78a87SLiu, Jinsong QEMU_WAKEUP_REASON_NONE = 0, 499c17d615SPaolo Bonzini QEMU_WAKEUP_REASON_RTC, 509c17d615SPaolo Bonzini QEMU_WAKEUP_REASON_PMTIMER, 514bc78a87SLiu, Jinsong QEMU_WAKEUP_REASON_OTHER, 529c17d615SPaolo Bonzini } WakeupReason; 539c17d615SPaolo Bonzini 549c17d615SPaolo Bonzini void qemu_system_reset_request(void); 559c17d615SPaolo Bonzini void qemu_system_suspend_request(void); 569c17d615SPaolo Bonzini void qemu_register_suspend_notifier(Notifier *notifier); 579c17d615SPaolo Bonzini void qemu_system_wakeup_request(WakeupReason reason); 589c17d615SPaolo Bonzini void qemu_system_wakeup_enable(WakeupReason reason, bool enabled); 599c17d615SPaolo Bonzini void qemu_register_wakeup_notifier(Notifier *notifier); 609c17d615SPaolo Bonzini void qemu_system_shutdown_request(void); 619c17d615SPaolo Bonzini void qemu_system_powerdown_request(void); 629c17d615SPaolo Bonzini void qemu_register_powerdown_notifier(Notifier *notifier); 639c17d615SPaolo Bonzini void qemu_system_debug_request(void); 649c17d615SPaolo Bonzini void qemu_system_vmstop_request(RunState reason); 6574892d24SPaolo Bonzini void qemu_system_vmstop_request_prepare(void); 669c17d615SPaolo Bonzini int qemu_shutdown_requested_get(void); 679c17d615SPaolo Bonzini int qemu_reset_requested_get(void); 689c17d615SPaolo Bonzini void qemu_system_killed(int signal, pid_t pid); 699c17d615SPaolo Bonzini void qemu_devices_reset(void); 709c17d615SPaolo Bonzini void qemu_system_reset(bool report); 715f5b5942SAndrey Smetanin void qemu_system_guest_panicked(void); 72038629a6SDr. David Alan Gilbert size_t qemu_target_page_bits(void); 739c17d615SPaolo Bonzini 749c17d615SPaolo Bonzini void qemu_add_exit_notifier(Notifier *notify); 759c17d615SPaolo Bonzini void qemu_remove_exit_notifier(Notifier *notify); 769c17d615SPaolo Bonzini 779c17d615SPaolo Bonzini void qemu_add_machine_init_done_notifier(Notifier *notify); 789c17d615SPaolo Bonzini 793e5a50d6SMarkus Armbruster void hmp_savevm(Monitor *mon, const QDict *qdict); 809c17d615SPaolo Bonzini int load_vmstate(const char *name); 813e5a50d6SMarkus Armbruster void hmp_delvm(Monitor *mon, const QDict *qdict); 821ce6be24SMarkus Armbruster void hmp_info_snapshots(Monitor *mon, const QDict *qdict); 839c17d615SPaolo Bonzini 849c17d615SPaolo Bonzini void qemu_announce_self(void); 859c17d615SPaolo Bonzini 86c76ca188SDr. David Alan Gilbert /* Subcommands for QEMU_VM_COMMAND */ 87c76ca188SDr. David Alan Gilbert enum qemu_vm_cmd { 88c76ca188SDr. David Alan Gilbert MIG_CMD_INVALID = 0, /* Must be 0 */ 892e37701eSDr. David Alan Gilbert MIG_CMD_OPEN_RETURN_PATH, /* Tell the dest to open the Return path */ 902e37701eSDr. David Alan Gilbert MIG_CMD_PING, /* Request a PONG on the RP */ 91093e3c42SDr. David Alan Gilbert 92093e3c42SDr. David Alan Gilbert MIG_CMD_POSTCOPY_ADVISE, /* Prior to any page transfers, just 93093e3c42SDr. David Alan Gilbert warn we might want to do PC */ 94093e3c42SDr. David Alan Gilbert MIG_CMD_POSTCOPY_LISTEN, /* Start listening for incoming 95093e3c42SDr. David Alan Gilbert pages as it's running. */ 96093e3c42SDr. David Alan Gilbert MIG_CMD_POSTCOPY_RUN, /* Start execution */ 97093e3c42SDr. David Alan Gilbert 98093e3c42SDr. David Alan Gilbert MIG_CMD_POSTCOPY_RAM_DISCARD, /* A list of pages to discard that 99093e3c42SDr. David Alan Gilbert were previously sent during 100093e3c42SDr. David Alan Gilbert precopy but are dirty. */ 10111cf1d98SDr. David Alan Gilbert MIG_CMD_PACKAGED, /* Send a wrapped stream within this stream */ 102c76ca188SDr. David Alan Gilbert MIG_CMD_MAX 103c76ca188SDr. David Alan Gilbert }; 104c76ca188SDr. David Alan Gilbert 10511cf1d98SDr. David Alan Gilbert #define MAX_VM_CMD_PACKAGED_SIZE (1ul << 24) 10611cf1d98SDr. David Alan Gilbert 1079c17d615SPaolo Bonzini bool qemu_savevm_state_blocked(Error **errp); 10847c8c17aSPaolo Bonzini void qemu_savevm_state_begin(QEMUFile *f, 1099c17d615SPaolo Bonzini const MigrationParams *params); 110f796baa1SDr. David Alan Gilbert void qemu_savevm_state_header(QEMUFile *f); 11135ecd943SDr. David Alan Gilbert int qemu_savevm_state_iterate(QEMUFile *f, bool postcopy); 112ea7415faSLiang Li void qemu_savevm_state_cleanup(void); 113763c906bSDr. David Alan Gilbert void qemu_savevm_state_complete_postcopy(QEMUFile *f); 1141c0d249dSDr. David Alan Gilbert void qemu_savevm_state_complete_precopy(QEMUFile *f, bool iterable_only); 115c31b098fSDr. David Alan Gilbert void qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size, 116c31b098fSDr. David Alan Gilbert uint64_t *res_non_postcopiable, 117c31b098fSDr. David Alan Gilbert uint64_t *res_postcopiable); 118c76ca188SDr. David Alan Gilbert void qemu_savevm_command_send(QEMUFile *f, enum qemu_vm_cmd command, 119c76ca188SDr. David Alan Gilbert uint16_t len, uint8_t *data); 1202e37701eSDr. David Alan Gilbert void qemu_savevm_send_ping(QEMUFile *f, uint32_t value); 1212e37701eSDr. David Alan Gilbert void qemu_savevm_send_open_return_path(QEMUFile *f); 12211cf1d98SDr. David Alan Gilbert int qemu_savevm_send_packaged(QEMUFile *f, const QEMUSizedBuffer *qsb); 123093e3c42SDr. David Alan Gilbert void qemu_savevm_send_postcopy_advise(QEMUFile *f); 124093e3c42SDr. David Alan Gilbert void qemu_savevm_send_postcopy_listen(QEMUFile *f); 125093e3c42SDr. David Alan Gilbert void qemu_savevm_send_postcopy_run(QEMUFile *f); 126093e3c42SDr. David Alan Gilbert 127093e3c42SDr. David Alan Gilbert void qemu_savevm_send_postcopy_ram_discard(QEMUFile *f, const char *name, 128093e3c42SDr. David Alan Gilbert uint16_t len, 129093e3c42SDr. David Alan Gilbert uint64_t *start_list, 130093e3c42SDr. David Alan Gilbert uint64_t *length_list); 131093e3c42SDr. David Alan Gilbert 1329c17d615SPaolo Bonzini int qemu_loadvm_state(QEMUFile *f); 1339c17d615SPaolo Bonzini 1349c17d615SPaolo Bonzini typedef enum DisplayType 1359c17d615SPaolo Bonzini { 1369c17d615SPaolo Bonzini DT_DEFAULT, 1379c17d615SPaolo Bonzini DT_CURSES, 1389c17d615SPaolo Bonzini DT_SDL, 139a4ccabcfSAnthony Liguori DT_GTK, 1409c17d615SPaolo Bonzini DT_NOGRAPHIC, 1419c17d615SPaolo Bonzini DT_NONE, 1429c17d615SPaolo Bonzini } DisplayType; 1439c17d615SPaolo Bonzini 1449c17d615SPaolo Bonzini extern int autostart; 1459c17d615SPaolo Bonzini 1469c17d615SPaolo Bonzini typedef enum { 1479c17d615SPaolo Bonzini VGA_NONE, VGA_STD, VGA_CIRRUS, VGA_VMWARE, VGA_XENFB, VGA_QXL, 148a94f0c5cSGerd Hoffmann VGA_TCX, VGA_CG3, VGA_DEVICE, VGA_VIRTIO, 149*8c9a2b71SEduardo Habkost VGA_TYPE_MAX, 1509c17d615SPaolo Bonzini } VGAInterfaceType; 1519c17d615SPaolo Bonzini 1529c17d615SPaolo Bonzini extern int vga_interface_type; 1539c17d615SPaolo Bonzini #define xenfb_enabled (vga_interface_type == VGA_XENFB) 1549c17d615SPaolo Bonzini 1559c17d615SPaolo Bonzini extern int graphic_width; 1569c17d615SPaolo Bonzini extern int graphic_height; 1579c17d615SPaolo Bonzini extern int graphic_depth; 1589c17d615SPaolo Bonzini extern DisplayType display_type; 159da076ffeSGerd Hoffmann extern int display_opengl; 1609c17d615SPaolo Bonzini extern const char *keyboard_layout; 1619c17d615SPaolo Bonzini extern int win2k_install_hack; 1629c17d615SPaolo Bonzini extern int alt_grab; 1639c17d615SPaolo Bonzini extern int ctrl_grab; 1649c17d615SPaolo Bonzini extern int smp_cpus; 1659c17d615SPaolo Bonzini extern int max_cpus; 1669c17d615SPaolo Bonzini extern int cursor_hide; 1679c17d615SPaolo Bonzini extern int graphic_rotate; 1689c17d615SPaolo Bonzini extern int no_quit; 1699c17d615SPaolo Bonzini extern int no_shutdown; 1709c17d615SPaolo Bonzini extern int old_param; 1719c17d615SPaolo Bonzini extern int boot_menu; 172bc74112fSGonglei extern bool boot_strict; 1739c17d615SPaolo Bonzini extern uint8_t *boot_splash_filedata; 174d09acb9bSMarkus Armbruster extern size_t boot_splash_filedata_size; 17558b7c17eSDr. David Alan Gilbert extern bool enable_mlock; 1769c17d615SPaolo Bonzini extern uint8_t qemu_extra_params_fw[2]; 177884f17c2SAlex Bligh extern QEMUClockType rtc_clock; 178e1c57ab8SPaolo Bonzini extern const char *mem_path; 179e1c57ab8SPaolo Bonzini extern int mem_prealloc; 1809c17d615SPaolo Bonzini 18145e30bf3SWanlong Gao #define MAX_NODES 128 1826a3042b2SMarcel Apfelbaum #define NUMA_NODE_UNASSIGNED MAX_NODES 183d2995916SEduardo Habkost 184d2995916SEduardo Habkost /* The following shall be true for all CPUs: 185d2995916SEduardo Habkost * cpu->cpu_index < max_cpus <= MAX_CPUMASK_BITS 186d2995916SEduardo Habkost * 187d2995916SEduardo Habkost * Note that cpu->get_arch_id() may be larger than MAX_CPUMASK_BITS. 188d2995916SEduardo Habkost */ 1899c17d615SPaolo Bonzini #define MAX_CPUMASK_BITS 255 190d2995916SEduardo Habkost 1919c17d615SPaolo Bonzini #define MAX_OPTION_ROMS 16 1929c17d615SPaolo Bonzini typedef struct QEMUOptionRom { 1939c17d615SPaolo Bonzini const char *name; 1949c17d615SPaolo Bonzini int32_t bootindex; 1959c17d615SPaolo Bonzini } QEMUOptionRom; 1969c17d615SPaolo Bonzini extern QEMUOptionRom option_rom[MAX_OPTION_ROMS]; 1979c17d615SPaolo Bonzini extern int nb_option_roms; 1989c17d615SPaolo Bonzini 1999c17d615SPaolo Bonzini #define MAX_PROM_ENVS 128 2009c17d615SPaolo Bonzini extern const char *prom_envs[MAX_PROM_ENVS]; 2019c17d615SPaolo Bonzini extern unsigned int nb_prom_envs; 2029c17d615SPaolo Bonzini 2039c17d615SPaolo Bonzini /* generic hotplug */ 2043e5a50d6SMarkus Armbruster void hmp_drive_add(Monitor *mon, const QDict *qdict); 2059c17d615SPaolo Bonzini 2069c17d615SPaolo Bonzini /* pcie aer error injection */ 20704e00c92SMarkus Armbruster void hmp_pcie_aer_inject_error(Monitor *mon, const QDict *qdict); 2089c17d615SPaolo Bonzini 2099c17d615SPaolo Bonzini /* serial ports */ 2109c17d615SPaolo Bonzini 2119c17d615SPaolo Bonzini #define MAX_SERIAL_PORTS 4 2129c17d615SPaolo Bonzini 2139c17d615SPaolo Bonzini extern CharDriverState *serial_hds[MAX_SERIAL_PORTS]; 2149c17d615SPaolo Bonzini 2159c17d615SPaolo Bonzini /* parallel ports */ 2169c17d615SPaolo Bonzini 2179c17d615SPaolo Bonzini #define MAX_PARALLEL_PORTS 3 2189c17d615SPaolo Bonzini 2199c17d615SPaolo Bonzini extern CharDriverState *parallel_hds[MAX_PARALLEL_PORTS]; 2209c17d615SPaolo Bonzini 2213e5a50d6SMarkus Armbruster void hmp_usb_add(Monitor *mon, const QDict *qdict); 2223e5a50d6SMarkus Armbruster void hmp_usb_del(Monitor *mon, const QDict *qdict); 2231ce6be24SMarkus Armbruster void hmp_info_usb(Monitor *mon, const QDict *qdict); 2249c17d615SPaolo Bonzini 2259c17d615SPaolo Bonzini void add_boot_device_path(int32_t bootindex, DeviceState *dev, 2269c17d615SPaolo Bonzini const char *suffix); 22730e32af7SAlexey Kardashevskiy char *get_boot_devices_list(size_t *size, bool ignore_suffixes); 2289c17d615SPaolo Bonzini 2297dc5af55SDominik Dingel DeviceState *get_boot_device(uint32_t position); 230694fb857SGonglei void check_boot_index(int32_t bootindex, Error **errp); 2319d27572dSGonglei void del_boot_device_path(DeviceState *dev, const char *suffix); 23212da3097SGonglei void device_add_bootindex_property(Object *obj, int32_t *bootindex, 23312da3097SGonglei const char *name, const char *suffix, 23412da3097SGonglei DeviceState *dev, Error **errp); 2359816833dSGonglei void restore_boot_order(void *opaque); 236703008e8SGonglei void validate_bootdevices(const char *devices, Error **errp); 2379816833dSGonglei 2383b53e45fSEduardo Habkost /* handler to set the boot_device order for a specific type of MachineClass */ 239ddcd5531SGonglei typedef void QEMUBootSetHandler(void *opaque, const char *boot_order, 240ddcd5531SGonglei Error **errp); 2419816833dSGonglei void qemu_register_boot_set(QEMUBootSetHandler *func, void *opaque); 242f1839938SGonglei void qemu_boot_set(const char *boot_order, Error **errp); 2437dc5af55SDominik Dingel 2447f9d6e54SMarkus Armbruster QemuOpts *qemu_get_machine_opts(void); 2457f9d6e54SMarkus Armbruster 246f8b6f8edSMarcel Apfelbaum bool defaults_enabled(void); 247de77a243SMarcel Apfelbaum bool usb_enabled(void); 2489c17d615SPaolo Bonzini 249968854c8SAmos Kong extern QemuOptsList qemu_legacy_drive_opts; 250968854c8SAmos Kong extern QemuOptsList qemu_common_drive_opts; 2514d454574SPaolo Bonzini extern QemuOptsList qemu_drive_opts; 2524d454574SPaolo Bonzini extern QemuOptsList qemu_chardev_opts; 2534d454574SPaolo Bonzini extern QemuOptsList qemu_device_opts; 2544d454574SPaolo Bonzini extern QemuOptsList qemu_netdev_opts; 2554d454574SPaolo Bonzini extern QemuOptsList qemu_net_opts; 2564d454574SPaolo Bonzini extern QemuOptsList qemu_global_opts; 2574d454574SPaolo Bonzini extern QemuOptsList qemu_mon_opts; 2584d454574SPaolo Bonzini 2599c17d615SPaolo Bonzini #endif 260