vl: extract default devices to separate functions
Reviewed-by: Igor Mammedov <imammedo@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
8a7459744c
commit
f650266bc5
216
softmmu/vl.c
216
softmmu/vl.c
@ -125,7 +125,9 @@ static const char *boot_order;
|
||||
static const char *boot_once;
|
||||
static const char *incoming;
|
||||
static const char *loadvm;
|
||||
static int display_remote;
|
||||
static QemuPluginList plugin_list = QTAILQ_HEAD_INITIALIZER(plugin_list);
|
||||
static bool nographic = false;
|
||||
enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB;
|
||||
static int mem_prealloc; /* force preallocation of physical target memory */
|
||||
int display_opengl;
|
||||
@ -147,6 +149,7 @@ static int rtc_host_datetime_offset = -1; /* valid & used only with
|
||||
RTC_BASE_DATETIME */
|
||||
QEMUClockType rtc_clock;
|
||||
int vga_interface_type = VGA_NONE;
|
||||
static const char *vga_model = NULL;
|
||||
static DisplayOptions dpy;
|
||||
static int num_serial_hds;
|
||||
static Chardev **serial_hds;
|
||||
@ -2224,6 +2227,115 @@ static int foreach_device_config(int type, int (*func)(const char *cmdline))
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void qemu_disable_default_devices(void)
|
||||
{
|
||||
MachineClass *machine_class = MACHINE_GET_CLASS(current_machine);
|
||||
|
||||
qemu_opts_foreach(qemu_find_opts("device"),
|
||||
default_driver_check, NULL, NULL);
|
||||
qemu_opts_foreach(qemu_find_opts("global"),
|
||||
default_driver_check, NULL, NULL);
|
||||
|
||||
if (!vga_model && !default_vga) {
|
||||
vga_interface_type = VGA_DEVICE;
|
||||
}
|
||||
if (!has_defaults || machine_class->no_serial) {
|
||||
default_serial = 0;
|
||||
}
|
||||
if (!has_defaults || machine_class->no_parallel) {
|
||||
default_parallel = 0;
|
||||
}
|
||||
if (!has_defaults || machine_class->no_floppy) {
|
||||
default_floppy = 0;
|
||||
}
|
||||
if (!has_defaults || machine_class->no_cdrom) {
|
||||
default_cdrom = 0;
|
||||
}
|
||||
if (!has_defaults || machine_class->no_sdcard) {
|
||||
default_sdcard = 0;
|
||||
}
|
||||
if (!has_defaults) {
|
||||
default_monitor = 0;
|
||||
default_net = 0;
|
||||
default_vga = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void qemu_create_default_devices(void)
|
||||
{
|
||||
MachineClass *machine_class = MACHINE_GET_CLASS(current_machine);
|
||||
|
||||
if (is_daemonized()) {
|
||||
/* According to documentation and historically, -nographic redirects
|
||||
* serial port, parallel port and monitor to stdio, which does not work
|
||||
* with -daemonize. We can redirect these to null instead, but since
|
||||
* -nographic is legacy, let's just error out.
|
||||
* We disallow -nographic only if all other ports are not redirected
|
||||
* explicitly, to not break existing legacy setups which uses
|
||||
* -nographic _and_ redirects all ports explicitly - this is valid
|
||||
* usage, -nographic is just a no-op in this case.
|
||||
*/
|
||||
if (nographic
|
||||
&& (default_parallel || default_serial || default_monitor)) {
|
||||
error_report("-nographic cannot be used with -daemonize");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
if (nographic) {
|
||||
if (default_parallel)
|
||||
add_device_config(DEV_PARALLEL, "null");
|
||||
if (default_serial && default_monitor) {
|
||||
add_device_config(DEV_SERIAL, "mon:stdio");
|
||||
} else {
|
||||
if (default_serial)
|
||||
add_device_config(DEV_SERIAL, "stdio");
|
||||
if (default_monitor)
|
||||
monitor_parse("stdio", "readline", false);
|
||||
}
|
||||
} else {
|
||||
if (default_serial)
|
||||
add_device_config(DEV_SERIAL, "vc:80Cx24C");
|
||||
if (default_parallel)
|
||||
add_device_config(DEV_PARALLEL, "vc:80Cx24C");
|
||||
if (default_monitor)
|
||||
monitor_parse("vc:80Cx24C", "readline", false);
|
||||
}
|
||||
|
||||
if (default_net) {
|
||||
QemuOptsList *net = qemu_find_opts("net");
|
||||
qemu_opts_parse(net, "nic", true, &error_abort);
|
||||
#ifdef CONFIG_SLIRP
|
||||
qemu_opts_parse(net, "user", true, &error_abort);
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(CONFIG_VNC)
|
||||
if (!QTAILQ_EMPTY(&(qemu_find_opts("vnc")->head))) {
|
||||
display_remote++;
|
||||
}
|
||||
#endif
|
||||
if (dpy.type == DISPLAY_TYPE_DEFAULT && !display_remote) {
|
||||
if (!qemu_display_find_default(&dpy)) {
|
||||
dpy.type = DISPLAY_TYPE_NONE;
|
||||
#if defined(CONFIG_VNC)
|
||||
vnc_parse("localhost:0,to=99,id=default", &error_abort);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
if (dpy.type == DISPLAY_TYPE_DEFAULT) {
|
||||
dpy.type = DISPLAY_TYPE_NONE;
|
||||
}
|
||||
|
||||
/* If no default VGA is requested, the default is "none". */
|
||||
if (default_vga) {
|
||||
vga_model = get_default_vga_model(machine_class);
|
||||
}
|
||||
if (vga_model) {
|
||||
select_vgahw(machine_class, vga_model);
|
||||
}
|
||||
}
|
||||
|
||||
static int serial_parse(const char *devname)
|
||||
{
|
||||
int index = num_serial_hds;
|
||||
@ -3208,10 +3320,7 @@ void qemu_init(int argc, char **argv, char **envp)
|
||||
int optind;
|
||||
const char *optarg;
|
||||
MachineClass *machine_class;
|
||||
const char *vga_model = NULL;
|
||||
bool userconfig = true;
|
||||
bool nographic = false;
|
||||
int display_remote = 0;
|
||||
ram_addr_t maxram_size;
|
||||
uint64_t ram_slots = 0;
|
||||
FILE *vmstate_dump_file = NULL;
|
||||
@ -4187,97 +4296,8 @@ void qemu_init(int argc, char **argv, char **envp)
|
||||
machine_class->default_machine_opts, 0);
|
||||
}
|
||||
|
||||
qemu_opts_foreach(qemu_find_opts("device"),
|
||||
default_driver_check, NULL, NULL);
|
||||
qemu_opts_foreach(qemu_find_opts("global"),
|
||||
default_driver_check, NULL, NULL);
|
||||
|
||||
if (!vga_model && !default_vga) {
|
||||
vga_interface_type = VGA_DEVICE;
|
||||
}
|
||||
if (!has_defaults || machine_class->no_serial) {
|
||||
default_serial = 0;
|
||||
}
|
||||
if (!has_defaults || machine_class->no_parallel) {
|
||||
default_parallel = 0;
|
||||
}
|
||||
if (!has_defaults || machine_class->no_floppy) {
|
||||
default_floppy = 0;
|
||||
}
|
||||
if (!has_defaults || machine_class->no_cdrom) {
|
||||
default_cdrom = 0;
|
||||
}
|
||||
if (!has_defaults || machine_class->no_sdcard) {
|
||||
default_sdcard = 0;
|
||||
}
|
||||
if (!has_defaults) {
|
||||
default_monitor = 0;
|
||||
default_net = 0;
|
||||
default_vga = 0;
|
||||
}
|
||||
|
||||
if (is_daemonized()) {
|
||||
/* According to documentation and historically, -nographic redirects
|
||||
* serial port, parallel port and monitor to stdio, which does not work
|
||||
* with -daemonize. We can redirect these to null instead, but since
|
||||
* -nographic is legacy, let's just error out.
|
||||
* We disallow -nographic only if all other ports are not redirected
|
||||
* explicitly, to not break existing legacy setups which uses
|
||||
* -nographic _and_ redirects all ports explicitly - this is valid
|
||||
* usage, -nographic is just a no-op in this case.
|
||||
*/
|
||||
if (nographic
|
||||
&& (default_parallel || default_serial || default_monitor)) {
|
||||
error_report("-nographic cannot be used with -daemonize");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
if (nographic) {
|
||||
if (default_parallel)
|
||||
add_device_config(DEV_PARALLEL, "null");
|
||||
if (default_serial && default_monitor) {
|
||||
add_device_config(DEV_SERIAL, "mon:stdio");
|
||||
} else {
|
||||
if (default_serial)
|
||||
add_device_config(DEV_SERIAL, "stdio");
|
||||
if (default_monitor)
|
||||
monitor_parse("stdio", "readline", false);
|
||||
}
|
||||
} else {
|
||||
if (default_serial)
|
||||
add_device_config(DEV_SERIAL, "vc:80Cx24C");
|
||||
if (default_parallel)
|
||||
add_device_config(DEV_PARALLEL, "vc:80Cx24C");
|
||||
if (default_monitor)
|
||||
monitor_parse("vc:80Cx24C", "readline", false);
|
||||
}
|
||||
|
||||
if (default_net) {
|
||||
QemuOptsList *net = qemu_find_opts("net");
|
||||
qemu_opts_parse(net, "nic", true, &error_abort);
|
||||
#ifdef CONFIG_SLIRP
|
||||
qemu_opts_parse(net, "user", true, &error_abort);
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(CONFIG_VNC)
|
||||
if (!QTAILQ_EMPTY(&(qemu_find_opts("vnc")->head))) {
|
||||
display_remote++;
|
||||
}
|
||||
#endif
|
||||
if (dpy.type == DISPLAY_TYPE_DEFAULT && !display_remote) {
|
||||
if (!qemu_display_find_default(&dpy)) {
|
||||
dpy.type = DISPLAY_TYPE_NONE;
|
||||
#if defined(CONFIG_VNC)
|
||||
vnc_parse("localhost:0,to=99,id=default", &error_abort);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
if (dpy.type == DISPLAY_TYPE_DEFAULT) {
|
||||
dpy.type = DISPLAY_TYPE_NONE;
|
||||
}
|
||||
|
||||
qemu_disable_default_devices();
|
||||
qemu_create_default_devices();
|
||||
if ((alt_grab || ctrl_grab) && dpy.type != DISPLAY_TYPE_SDL) {
|
||||
error_report("-alt-grab and -ctrl-grab are only valid "
|
||||
"for SDL, ignoring option");
|
||||
@ -4423,14 +4443,6 @@ void qemu_init(int argc, char **argv, char **envp)
|
||||
qemu_semihosting_connect_chardevs();
|
||||
qemu_semihosting_console_init();
|
||||
|
||||
/* If no default VGA is requested, the default is "none". */
|
||||
if (default_vga) {
|
||||
vga_model = get_default_vga_model(machine_class);
|
||||
}
|
||||
if (vga_model) {
|
||||
select_vgahw(machine_class, vga_model);
|
||||
}
|
||||
|
||||
/* This checkpoint is required by replay to separate prior clock
|
||||
reading from the other reads, because timer polling functions query
|
||||
clock values from the log. */
|
||||
|
Loading…
Reference in New Issue
Block a user