mirror of
https://github.com/xemu-project/xemu.git
synced 2025-02-06 12:09:21 +00:00
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 *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. */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user