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:
Paolo Bonzini 2020-10-21 06:22:39 -04:00
parent 8a7459744c
commit f650266bc5

View File

@ -125,7 +125,9 @@ static const char *boot_order;
static const char *boot_once; static const char *boot_once;
static const char *incoming; static const char *incoming;
static const char *loadvm; static const char *loadvm;
static int display_remote;
static QemuPluginList plugin_list = QTAILQ_HEAD_INITIALIZER(plugin_list); static QemuPluginList plugin_list = QTAILQ_HEAD_INITIALIZER(plugin_list);
static bool nographic = false;
enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB; enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB;
static int mem_prealloc; /* force preallocation of physical target memory */ static int mem_prealloc; /* force preallocation of physical target memory */
int display_opengl; int display_opengl;
@ -147,6 +149,7 @@ static int rtc_host_datetime_offset = -1; /* valid & used only with
RTC_BASE_DATETIME */ RTC_BASE_DATETIME */
QEMUClockType rtc_clock; QEMUClockType rtc_clock;
int vga_interface_type = VGA_NONE; int vga_interface_type = VGA_NONE;
static const char *vga_model = NULL;
static DisplayOptions dpy; static DisplayOptions dpy;
static int num_serial_hds; static int num_serial_hds;
static Chardev **serial_hds; static Chardev **serial_hds;
@ -2224,6 +2227,115 @@ static int foreach_device_config(int type, int (*func)(const char *cmdline))
return 0; 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) static int serial_parse(const char *devname)
{ {
int index = num_serial_hds; int index = num_serial_hds;
@ -3208,10 +3320,7 @@ void qemu_init(int argc, char **argv, char **envp)
int optind; int optind;
const char *optarg; const char *optarg;
MachineClass *machine_class; MachineClass *machine_class;
const char *vga_model = NULL;
bool userconfig = true; bool userconfig = true;
bool nographic = false;
int display_remote = 0;
ram_addr_t maxram_size; ram_addr_t maxram_size;
uint64_t ram_slots = 0; uint64_t ram_slots = 0;
FILE *vmstate_dump_file = NULL; FILE *vmstate_dump_file = NULL;
@ -4187,97 +4296,8 @@ void qemu_init(int argc, char **argv, char **envp)
machine_class->default_machine_opts, 0); machine_class->default_machine_opts, 0);
} }
qemu_opts_foreach(qemu_find_opts("device"), qemu_disable_default_devices();
default_driver_check, NULL, NULL); qemu_create_default_devices();
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;
}
if ((alt_grab || ctrl_grab) && dpy.type != DISPLAY_TYPE_SDL) { if ((alt_grab || ctrl_grab) && dpy.type != DISPLAY_TYPE_SDL) {
error_report("-alt-grab and -ctrl-grab are only valid " error_report("-alt-grab and -ctrl-grab are only valid "
"for SDL, ignoring option"); "for SDL, ignoring option");
@ -4423,14 +4443,6 @@ void qemu_init(int argc, char **argv, char **envp)
qemu_semihosting_connect_chardevs(); qemu_semihosting_connect_chardevs();
qemu_semihosting_console_init(); 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 /* This checkpoint is required by replay to separate prior clock
reading from the other reads, because timer polling functions query reading from the other reads, because timer polling functions query
clock values from the log. */ clock values from the log. */