2007-11-17 20:14:51 +03:00
|
|
|
#ifndef SYSEMU_H
|
|
|
|
#define SYSEMU_H
|
|
|
|
/* Misc. things related to the system emulator. */
|
|
|
|
|
2012-12-17 21:20:00 +04:00
|
|
|
#include "qemu/typedefs.h"
|
|
|
|
#include "qemu/option.h"
|
|
|
|
#include "qemu/queue.h"
|
|
|
|
#include "qemu/timer.h"
|
2011-09-13 00:54:20 +04:00
|
|
|
#include "qapi-types.h"
|
2012-12-17 21:20:00 +04:00
|
|
|
#include "qemu/notify.h"
|
|
|
|
#include "qemu/main-loop.h"
|
2014-05-14 13:43:07 +04:00
|
|
|
#include "qemu/bitmap.h"
|
2009-03-06 02:01:23 +03:00
|
|
|
|
2007-11-17 20:14:51 +03:00
|
|
|
/* vl.c */
|
2011-07-29 21:26:33 +04:00
|
|
|
|
2007-11-17 20:14:51 +03:00
|
|
|
extern const char *bios_name;
|
2009-05-30 03:52:44 +04:00
|
|
|
|
2007-11-17 20:14:51 +03:00
|
|
|
extern const char *qemu_name;
|
2008-09-18 22:29:08 +04:00
|
|
|
extern uint8_t qemu_uuid[];
|
smbios: Make multiple -smbios type= accumulate sanely
Currently, -smbios type=T,NAME=VAL,... adds one field (T,NAME) with
value VAL to fw_cfg for each unique NAME. If NAME occurs multiple
times, the last one's VAL is used (before the QemuOpts conversion, the
first one was used).
Multiple -smbios can add multiple fields with the same (T, NAME).
SeaBIOS reads all of them from fw_cfg, but uses only the first field
(T, NAME). The others are ignored.
"First one wins, subsequent ones get ignored silently" isn't nice. We
commonly let the last option win. Useful, because it lets you
-readconfig first, then selectively override with command line
options.
Clean up -smbios to work the common way. Accumulate the settings,
with later ones overwriting earlier ones. Put the result into fw_cfg
(no more useless duplicates).
Bonus cleanup: qemu_uuid_parse() no longer sets SMBIOS system uuid by
side effect.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
2013-08-16 17:18:31 +04:00
|
|
|
extern bool qemu_uuid_set;
|
2009-04-17 22:58:14 +04:00
|
|
|
int qemu_uuid_parse(const char *str, uint8_t *uuid);
|
2013-08-02 19:02:01 +04:00
|
|
|
|
2008-09-18 22:29:08 +04:00
|
|
|
#define UUID_FMT "%02hhx%02hhx%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx"
|
2013-08-02 19:02:01 +04:00
|
|
|
#define UUID_NONE "00000000-0000-0000-0000-000000000000"
|
2007-11-17 20:14:51 +03:00
|
|
|
|
2011-07-29 22:04:45 +04:00
|
|
|
bool runstate_check(RunState state);
|
|
|
|
void runstate_set(RunState new_state);
|
2011-07-29 22:36:43 +04:00
|
|
|
int runstate_is_running(void);
|
2013-04-26 07:24:40 +04:00
|
|
|
bool runstate_needs_reset(void);
|
2007-11-17 20:14:51 +03:00
|
|
|
typedef struct vm_change_state_entry VMChangeStateEntry;
|
2011-07-29 21:26:33 +04:00
|
|
|
typedef void VMChangeStateHandler(void *opaque, int running, RunState state);
|
2007-11-17 20:14:51 +03:00
|
|
|
|
|
|
|
VMChangeStateEntry *qemu_add_vm_change_state_handler(VMChangeStateHandler *cb,
|
|
|
|
void *opaque);
|
|
|
|
void qemu_del_vm_change_state_handler(VMChangeStateEntry *e);
|
2011-07-29 21:26:33 +04:00
|
|
|
void vm_state_notify(int running, RunState state);
|
2011-02-09 18:29:40 +03:00
|
|
|
|
2011-06-14 20:29:43 +04:00
|
|
|
#define VMRESET_SILENT false
|
|
|
|
#define VMRESET_REPORT true
|
|
|
|
|
2007-11-17 20:14:51 +03:00
|
|
|
void vm_start(void);
|
2013-07-05 15:49:54 +04:00
|
|
|
int vm_stop(RunState state);
|
|
|
|
int vm_stop_force_state(RunState state);
|
2007-11-17 20:14:51 +03:00
|
|
|
|
2012-02-23 16:45:19 +04:00
|
|
|
typedef enum WakeupReason {
|
2013-09-25 20:38:29 +04:00
|
|
|
/* Always keep QEMU_WAKEUP_REASON_NONE = 0 */
|
|
|
|
QEMU_WAKEUP_REASON_NONE = 0,
|
2012-02-23 16:45:24 +04:00
|
|
|
QEMU_WAKEUP_REASON_RTC,
|
2012-02-23 16:45:25 +04:00
|
|
|
QEMU_WAKEUP_REASON_PMTIMER,
|
2013-09-25 20:38:29 +04:00
|
|
|
QEMU_WAKEUP_REASON_OTHER,
|
2012-02-23 16:45:19 +04:00
|
|
|
} WakeupReason;
|
|
|
|
|
2007-11-17 20:14:51 +03:00
|
|
|
void qemu_system_reset_request(void);
|
2012-02-23 16:45:19 +04:00
|
|
|
void qemu_system_suspend_request(void);
|
|
|
|
void qemu_register_suspend_notifier(Notifier *notifier);
|
|
|
|
void qemu_system_wakeup_request(WakeupReason reason);
|
|
|
|
void qemu_system_wakeup_enable(WakeupReason reason, bool enabled);
|
|
|
|
void qemu_register_wakeup_notifier(Notifier *notifier);
|
2007-11-17 20:14:51 +03:00
|
|
|
void qemu_system_shutdown_request(void);
|
|
|
|
void qemu_system_powerdown_request(void);
|
2012-09-06 01:06:21 +04:00
|
|
|
void qemu_register_powerdown_notifier(Notifier *notifier);
|
2011-02-07 14:19:16 +03:00
|
|
|
void qemu_system_debug_request(void);
|
2011-07-29 21:26:33 +04:00
|
|
|
void qemu_system_vmstop_request(RunState reason);
|
2010-07-22 18:52:48 +04:00
|
|
|
int qemu_shutdown_requested_get(void);
|
|
|
|
int qemu_reset_requested_get(void);
|
2011-03-15 14:56:04 +03:00
|
|
|
void qemu_system_killed(int signal, pid_t pid);
|
2012-08-07 10:41:51 +04:00
|
|
|
void qemu_devices_reset(void);
|
2011-06-14 20:29:43 +04:00
|
|
|
void qemu_system_reset(bool report);
|
2007-11-17 20:14:51 +03:00
|
|
|
|
2010-06-04 16:08:07 +04:00
|
|
|
void qemu_add_exit_notifier(Notifier *notify);
|
|
|
|
void qemu_remove_exit_notifier(Notifier *notify);
|
|
|
|
|
2010-12-08 14:35:08 +03:00
|
|
|
void qemu_add_machine_init_done_notifier(Notifier *notify);
|
|
|
|
|
2009-08-28 22:27:13 +04:00
|
|
|
void do_savevm(Monitor *mon, const QDict *qdict);
|
2010-02-17 18:24:10 +03:00
|
|
|
int load_vmstate(const char *name);
|
2009-08-28 22:27:13 +04:00
|
|
|
void do_delvm(Monitor *mon, const QDict *qdict);
|
2013-01-14 10:06:25 +04:00
|
|
|
void do_info_snapshots(Monitor *mon, const QDict *qdict);
|
2007-11-17 20:14:51 +03:00
|
|
|
|
2008-10-13 07:13:12 +04:00
|
|
|
void qemu_announce_self(void);
|
|
|
|
|
2011-12-05 20:48:01 +04:00
|
|
|
bool qemu_savevm_state_blocked(Error **errp);
|
2013-02-22 20:36:13 +04:00
|
|
|
void qemu_savevm_state_begin(QEMUFile *f,
|
|
|
|
const MigrationParams *params);
|
2011-12-05 20:06:56 +04:00
|
|
|
int qemu_savevm_state_iterate(QEMUFile *f);
|
2013-02-22 20:36:13 +04:00
|
|
|
void qemu_savevm_state_complete(QEMUFile *f);
|
2013-01-14 17:14:42 +04:00
|
|
|
void qemu_savevm_state_cancel(void);
|
2012-09-21 13:18:18 +04:00
|
|
|
uint64_t qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size);
|
2008-10-06 18:53:52 +04:00
|
|
|
int qemu_loadvm_state(QEMUFile *f);
|
|
|
|
|
2007-11-17 20:14:51 +03:00
|
|
|
/* SLIRP */
|
2009-03-06 02:01:23 +03:00
|
|
|
void do_info_slirp(Monitor *mon);
|
2007-11-17 20:14:51 +03:00
|
|
|
|
2009-05-22 01:54:00 +04:00
|
|
|
typedef enum DisplayType
|
|
|
|
{
|
|
|
|
DT_DEFAULT,
|
|
|
|
DT_CURSES,
|
|
|
|
DT_SDL,
|
2013-02-20 17:43:20 +04:00
|
|
|
DT_GTK,
|
2009-05-22 01:54:00 +04:00
|
|
|
DT_NOGRAPHIC,
|
2011-03-16 15:33:32 +03:00
|
|
|
DT_NONE,
|
2009-05-22 01:54:00 +04:00
|
|
|
} DisplayType;
|
|
|
|
|
2009-07-28 01:17:51 +04:00
|
|
|
extern int autostart;
|
2009-07-30 14:15:02 +04:00
|
|
|
|
|
|
|
typedef enum {
|
2010-04-27 13:50:11 +04:00
|
|
|
VGA_NONE, VGA_STD, VGA_CIRRUS, VGA_VMWARE, VGA_XENFB, VGA_QXL,
|
2014-03-10 18:37:40 +04:00
|
|
|
VGA_TCX, VGA_CG3, VGA_DEVICE
|
2009-07-30 14:15:02 +04:00
|
|
|
} VGAInterfaceType;
|
|
|
|
|
|
|
|
extern int vga_interface_type;
|
|
|
|
#define xenfb_enabled (vga_interface_type == VGA_XENFB)
|
|
|
|
|
2007-11-17 20:14:51 +03:00
|
|
|
extern int graphic_width;
|
|
|
|
extern int graphic_height;
|
|
|
|
extern int graphic_depth;
|
2009-05-22 01:54:00 +04:00
|
|
|
extern DisplayType display_type;
|
2007-11-17 20:14:51 +03:00
|
|
|
extern const char *keyboard_layout;
|
|
|
|
extern int win2k_install_hack;
|
|
|
|
extern int alt_grab;
|
2009-09-18 00:48:04 +04:00
|
|
|
extern int ctrl_grab;
|
2007-11-17 20:14:51 +03:00
|
|
|
extern int smp_cpus;
|
2009-07-23 19:03:42 +04:00
|
|
|
extern int max_cpus;
|
2007-11-17 20:14:51 +03:00
|
|
|
extern int cursor_hide;
|
|
|
|
extern int graphic_rotate;
|
|
|
|
extern int no_quit;
|
2010-05-12 01:07:04 +04:00
|
|
|
extern int no_shutdown;
|
2007-11-17 20:14:51 +03:00
|
|
|
extern int semihosting_enabled;
|
|
|
|
extern int old_param;
|
2009-07-02 02:19:02 +04:00
|
|
|
extern int boot_menu;
|
2011-07-27 14:04:55 +04:00
|
|
|
extern uint8_t *boot_splash_filedata;
|
2013-01-23 21:25:08 +04:00
|
|
|
extern size_t boot_splash_filedata_size;
|
2011-07-27 14:04:55 +04:00
|
|
|
extern uint8_t qemu_extra_params_fw[2];
|
2013-08-21 19:03:04 +04:00
|
|
|
extern QEMUClockType rtc_clock;
|
2007-11-17 20:14:51 +03:00
|
|
|
|
2009-04-22 02:30:27 +04:00
|
|
|
#define MAX_NODES 64
|
2014-03-18 23:29:23 +04:00
|
|
|
|
|
|
|
/* The following shall be true for all CPUs:
|
|
|
|
* cpu->cpu_index < max_cpus <= MAX_CPUMASK_BITS
|
|
|
|
*
|
|
|
|
* Note that cpu->get_arch_id() may be larger than MAX_CPUMASK_BITS.
|
|
|
|
*/
|
Fixes related to processing of qemu's -numa option
The -numa option to qemu is used to create [fake] numa nodes
and expose them to the guest OS instance.
There are a couple of issues with the -numa option:
a) Max VCPU's that can be specified for a guest while using
the qemu's -numa option is 64. Due to a typecasting issue
when the number of VCPUs is > 32 the VCPUs don't show up
under the specified [fake] numa nodes.
b) KVM currently has support for 160VCPUs per guest. The
qemu's -numa option has only support for upto 64VCPUs
per guest.
This patch addresses these two issues.
Below are examples of (a) and (b)
a) >32 VCPUs are specified with the -numa option:
/usr/local/bin/qemu-system-x86_64 \
-enable-kvm \
71:01:01 \
-net tap,ifname=tap0,script=no,downscript=no \
-vnc :4
...
Upstream qemu :
--------------
QEMU 1.1.50 monitor - type 'help' for more information
(qemu) info numa
6 nodes
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 32 33 34 35 36 37 38 39 40 41
node 0 size: 131072 MB
node 1 cpus: 10 11 12 13 14 15 16 17 18 19 42 43 44 45 46 47 48 49 50 51
node 1 size: 131072 MB
node 2 cpus: 20 21 22 23 24 25 26 27 28 29 52 53 54 55 56 57 58 59
node 2 size: 131072 MB
node 3 cpus: 30
node 3 size: 131072 MB
node 4 cpus:
node 4 size: 131072 MB
node 5 cpus: 31
node 5 size: 131072 MB
With the patch applied :
-----------------------
QEMU 1.1.50 monitor - type 'help' for more information
(qemu) info numa
6 nodes
node 0 cpus: 0 1 2 3 4 5 6 7 8 9
node 0 size: 131072 MB
node 1 cpus: 10 11 12 13 14 15 16 17 18 19
node 1 size: 131072 MB
node 2 cpus: 20 21 22 23 24 25 26 27 28 29
node 2 size: 131072 MB
node 3 cpus: 30 31 32 33 34 35 36 37 38 39
node 3 size: 131072 MB
node 4 cpus: 40 41 42 43 44 45 46 47 48 49
node 4 size: 131072 MB
node 5 cpus: 50 51 52 53 54 55 56 57 58 59
node 5 size: 131072 MB
b) >64 VCPUs specified with -numa option:
/usr/local/bin/qemu-system-x86_64 \
-enable-kvm \
-cpu Westmere,+rdtscp,+pdpe1gb,+dca,+pdcm,+xtpr,+tm2,+est,+smx,+vmx,+ds_cpl,+monitor,+dtes64,+pclmuldq,+pbe,+tm,+ht,+ss,+acpi,+d-vnc :4
...
Upstream qemu :
--------------
only 63 CPUs in NUMA mode supported.
only 64 CPUs in NUMA mode supported.
QEMU 1.1.50 monitor - type 'help' for more information
(qemu) info numa
8 nodes
node 0 cpus: 6 7 8 9 38 39 40 41 70 71 72 73
node 0 size: 65536 MB
node 1 cpus: 10 11 12 13 14 15 16 17 18 19 42 43 44 45 46 47 48 49 50 51 74 75 76 77 78 79
node 1 size: 65536 MB
node 2 cpus: 20 21 22 23 24 25 26 27 28 29 52 53 54 55 56 57 58 59 60 61
node 2 size: 65536 MB
node 3 cpus: 30 62
node 3 size: 65536 MB
node 4 cpus:
node 4 size: 65536 MB
node 5 cpus:
node 5 size: 65536 MB
node 6 cpus: 31 63
node 6 size: 65536 MB
node 7 cpus: 0 1 2 3 4 5 32 33 34 35 36 37 64 65 66 67 68 69
node 7 size: 65536 MB
With the patch applied :
-----------------------
QEMU 1.1.50 monitor - type 'help' for more information
(qemu) info numa
8 nodes
node 0 cpus: 0 1 2 3 4 5 6 7 8 9
node 0 size: 65536 MB
node 1 cpus: 10 11 12 13 14 15 16 17 18 19
node 1 size: 65536 MB
node 2 cpus: 20 21 22 23 24 25 26 27 28 29
node 2 size: 65536 MB
node 3 cpus: 30 31 32 33 34 35 36 37 38 39
node 3 size: 65536 MB
node 4 cpus: 40 41 42 43 44 45 46 47 48 49
node 4 size: 65536 MB
node 5 cpus: 50 51 52 53 54 55 56 57 58 59
node 5 size: 65536 MB
node 6 cpus: 60 61 62 63 64 65 66 67 68 69
node 6 size: 65536 MB
node 7 cpus: 70 71 72 73 74 75 76 77 78 79
Signed-off-by: Chegu Vinod <chegu_vinod@hp.com>, Jim Hull <jim.hull@hp.com>, Craig Hada <craig.hada@hp.com>
Tested-by: Eduardo Habkost <ehabkost@redhat.com>
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
2012-07-17 08:31:30 +04:00
|
|
|
#define MAX_CPUMASK_BITS 255
|
2014-03-18 23:29:23 +04:00
|
|
|
|
2009-04-22 02:30:27 +04:00
|
|
|
extern int nb_numa_nodes;
|
2014-05-14 13:43:07 +04:00
|
|
|
typedef struct node_info {
|
|
|
|
uint64_t node_mem;
|
|
|
|
DECLARE_BITMAP(node_cpu, MAX_CPUMASK_BITS);
|
|
|
|
} NodeInfo;
|
|
|
|
extern NodeInfo numa_info[MAX_NODES];
|
2014-05-14 13:43:05 +04:00
|
|
|
void numa_add(const char *optarg);
|
|
|
|
void set_numa_nodes(void);
|
|
|
|
void set_numa_modes(void);
|
2009-04-22 02:30:27 +04:00
|
|
|
|
2007-11-17 20:14:51 +03:00
|
|
|
#define MAX_OPTION_ROMS 16
|
2010-12-08 14:35:07 +03:00
|
|
|
typedef struct QEMUOptionRom {
|
|
|
|
const char *name;
|
|
|
|
int32_t bootindex;
|
|
|
|
} QEMUOptionRom;
|
|
|
|
extern QEMUOptionRom option_rom[MAX_OPTION_ROMS];
|
2007-11-17 20:14:51 +03:00
|
|
|
extern int nb_option_roms;
|
|
|
|
|
|
|
|
#define MAX_PROM_ENVS 128
|
|
|
|
extern const char *prom_envs[MAX_PROM_ENVS];
|
|
|
|
extern unsigned int nb_prom_envs;
|
|
|
|
|
2009-02-11 18:21:54 +03:00
|
|
|
/* pci-hotplug */
|
2010-05-12 12:53:00 +04:00
|
|
|
void pci_device_hot_add(Monitor *mon, const QDict *qdict);
|
2012-11-22 18:16:36 +04:00
|
|
|
int pci_drive_hot_add(Monitor *mon, const QDict *qdict, DriveInfo *dinfo);
|
2010-05-12 12:53:01 +04:00
|
|
|
void do_pci_device_hot_remove(Monitor *mon, const QDict *qdict);
|
2009-02-11 18:21:54 +03:00
|
|
|
|
2010-08-24 01:43:10 +04:00
|
|
|
/* generic hotplug */
|
|
|
|
void drive_hot_add(Monitor *mon, const QDict *qdict);
|
|
|
|
|
2013-04-23 12:29:39 +04:00
|
|
|
/* CPU hotplug */
|
|
|
|
void qemu_register_cpu_added_notifier(Notifier *notifier);
|
|
|
|
|
2010-12-24 06:14:14 +03:00
|
|
|
/* pcie aer error injection */
|
|
|
|
void pcie_aer_inject_error_print(Monitor *mon, const QObject *data);
|
2011-11-30 08:39:47 +04:00
|
|
|
int do_pcie_aer_inject_error(Monitor *mon,
|
2010-12-24 06:14:14 +03:00
|
|
|
const QDict *qdict, QObject **ret_data);
|
|
|
|
|
2007-11-17 20:14:51 +03:00
|
|
|
/* serial ports */
|
|
|
|
|
|
|
|
#define MAX_SERIAL_PORTS 4
|
|
|
|
|
|
|
|
extern CharDriverState *serial_hds[MAX_SERIAL_PORTS];
|
|
|
|
|
|
|
|
/* parallel ports */
|
|
|
|
|
|
|
|
#define MAX_PARALLEL_PORTS 3
|
|
|
|
|
|
|
|
extern CharDriverState *parallel_hds[MAX_PARALLEL_PORTS];
|
|
|
|
|
2009-08-28 22:27:13 +04:00
|
|
|
void do_usb_add(Monitor *mon, const QDict *qdict);
|
|
|
|
void do_usb_del(Monitor *mon, const QDict *qdict);
|
2013-01-14 10:06:25 +04:00
|
|
|
void usb_info(Monitor *mon, const QDict *qdict);
|
2007-11-17 20:14:51 +03:00
|
|
|
|
2010-02-25 18:11:44 +03:00
|
|
|
void rtc_change_mon_event(struct tm *tm);
|
|
|
|
|
2010-12-08 14:35:05 +03:00
|
|
|
void add_boot_device_path(int32_t bootindex, DeviceState *dev,
|
|
|
|
const char *suffix);
|
2014-03-17 06:40:22 +04:00
|
|
|
char *get_boot_devices_list(size_t *size, bool ignore_suffixes);
|
2012-09-02 23:25:28 +04:00
|
|
|
|
2013-04-26 06:12:49 +04:00
|
|
|
DeviceState *get_boot_device(uint32_t position);
|
|
|
|
|
2013-07-04 17:09:19 +04:00
|
|
|
QemuOpts *qemu_get_machine_opts(void);
|
|
|
|
|
2012-09-02 23:25:28 +04:00
|
|
|
bool usb_enabled(bool default_usb);
|
|
|
|
|
2013-11-09 08:15:47 +04:00
|
|
|
extern QemuOptsList qemu_legacy_drive_opts;
|
|
|
|
extern QemuOptsList qemu_common_drive_opts;
|
2012-11-26 19:03:42 +04:00
|
|
|
extern QemuOptsList qemu_drive_opts;
|
|
|
|
extern QemuOptsList qemu_chardev_opts;
|
|
|
|
extern QemuOptsList qemu_device_opts;
|
|
|
|
extern QemuOptsList qemu_netdev_opts;
|
|
|
|
extern QemuOptsList qemu_net_opts;
|
|
|
|
extern QemuOptsList qemu_global_opts;
|
|
|
|
extern QemuOptsList qemu_mon_opts;
|
|
|
|
|
2007-11-17 20:14:51 +03:00
|
|
|
#endif
|