vl: separate qemu_create_early_backends
"Early" backends are created before the machine and can be used as machine options. Reviewed-by: Igor Mammedov <imammedo@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
a3ef9bfb88
commit
644186572d
123
softmmu/vl.c
123
softmmu/vl.c
@ -117,6 +117,14 @@
|
||||
|
||||
#define MAX_VIRTIO_CONSOLES 1
|
||||
|
||||
typedef struct BlockdevOptionsQueueEntry {
|
||||
BlockdevOptions *bdo;
|
||||
Location loc;
|
||||
QSIMPLEQ_ENTRY(BlockdevOptionsQueueEntry) entry;
|
||||
} BlockdevOptionsQueueEntry;
|
||||
|
||||
typedef QSIMPLEQ_HEAD(, BlockdevOptionsQueueEntry) BlockdevOptionsQueue;
|
||||
|
||||
static const char *cpu_option;
|
||||
static const char *data_dir[16];
|
||||
static int data_dir_idx;
|
||||
@ -126,7 +134,9 @@ static const char *boot_once;
|
||||
static const char *incoming;
|
||||
static const char *loadvm;
|
||||
static int display_remote;
|
||||
static int snapshot;
|
||||
static QemuPluginList plugin_list = QTAILQ_HEAD_INITIALIZER(plugin_list);
|
||||
static BlockdevOptionsQueue bdo_queue = QSIMPLEQ_HEAD_INITIALIZER(bdo_queue);
|
||||
static bool nographic = false;
|
||||
enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB;
|
||||
static int mem_prealloc; /* force preallocation of physical target memory */
|
||||
@ -1043,14 +1053,6 @@ static void default_drive(int enable, int snapshot, BlockInterfaceType type,
|
||||
|
||||
}
|
||||
|
||||
typedef struct BlockdevOptionsQueueEntry {
|
||||
BlockdevOptions *bdo;
|
||||
Location loc;
|
||||
QSIMPLEQ_ENTRY(BlockdevOptionsQueueEntry) entry;
|
||||
} BlockdevOptionsQueueEntry;
|
||||
|
||||
typedef QSIMPLEQ_HEAD(, BlockdevOptionsQueueEntry) BlockdevOptionsQueue;
|
||||
|
||||
static void configure_blockdev(BlockdevOptionsQueue *bdo_queue,
|
||||
MachineClass *machine_class, int snapshot)
|
||||
{
|
||||
@ -2644,7 +2646,7 @@ static int machine_set_property(void *opaque,
|
||||
* cannot be created here, as it depends on the chardev
|
||||
* already existing.
|
||||
*/
|
||||
static bool object_create_initial(const char *type, QemuOpts *opts)
|
||||
static bool object_create_early(const char *type, QemuOpts *opts)
|
||||
{
|
||||
if (user_creatable_print_help(type, opts)) {
|
||||
exit(0);
|
||||
@ -2700,6 +2702,58 @@ static bool object_create_initial(const char *type, QemuOpts *opts)
|
||||
return true;
|
||||
}
|
||||
|
||||
static void qemu_create_early_backends(void)
|
||||
{
|
||||
MachineClass *machine_class = MACHINE_GET_CLASS(current_machine);
|
||||
|
||||
if ((alt_grab || ctrl_grab) && dpy.type != DISPLAY_TYPE_SDL) {
|
||||
error_report("-alt-grab and -ctrl-grab are only valid "
|
||||
"for SDL, ignoring option");
|
||||
}
|
||||
if (dpy.has_window_close &&
|
||||
(dpy.type != DISPLAY_TYPE_GTK && dpy.type != DISPLAY_TYPE_SDL)) {
|
||||
error_report("-no-quit is only valid for GTK and SDL, "
|
||||
"ignoring option");
|
||||
}
|
||||
|
||||
qemu_display_early_init(&dpy);
|
||||
qemu_console_early_init();
|
||||
|
||||
if (dpy.has_gl && dpy.gl != DISPLAYGL_MODE_OFF && display_opengl == 0) {
|
||||
#if defined(CONFIG_OPENGL)
|
||||
error_report("OpenGL is not supported by the display");
|
||||
#else
|
||||
error_report("OpenGL support is disabled");
|
||||
#endif
|
||||
exit(1);
|
||||
}
|
||||
|
||||
qemu_opts_foreach(qemu_find_opts("object"),
|
||||
user_creatable_add_opts_foreach,
|
||||
object_create_early, &error_fatal);
|
||||
|
||||
/* spice needs the timers to be initialized by this point */
|
||||
/* spice must initialize before audio as it changes the default auiodev */
|
||||
/* spice must initialize before chardevs (for spicevmc and spiceport) */
|
||||
qemu_spice.init();
|
||||
|
||||
qemu_opts_foreach(qemu_find_opts("chardev"),
|
||||
chardev_init_func, NULL, &error_fatal);
|
||||
|
||||
#ifdef CONFIG_VIRTFS
|
||||
qemu_opts_foreach(qemu_find_opts("fsdev"),
|
||||
fsdev_init_func, NULL, &error_fatal);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Note: we need to create audio and block backends before
|
||||
* machine_set_property(), so machine properties can refer to
|
||||
* them.
|
||||
*/
|
||||
configure_blockdev(&bdo_queue, machine_class, snapshot);
|
||||
audio_init_audiodevs();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* The remainder of object creation happens after the
|
||||
@ -2707,7 +2761,7 @@ static bool object_create_initial(const char *type, QemuOpts *opts)
|
||||
*/
|
||||
static bool object_create_delayed(const char *type, QemuOpts *opts)
|
||||
{
|
||||
return !object_create_initial(type, opts);
|
||||
return !object_create_early(type, opts);
|
||||
}
|
||||
|
||||
|
||||
@ -3313,7 +3367,6 @@ static void qemu_machine_creation_done(void)
|
||||
|
||||
void qemu_init(int argc, char **argv, char **envp)
|
||||
{
|
||||
int snapshot = 0;
|
||||
QemuOpts *opts, *machine_opts;
|
||||
QemuOpts *icount_opts = NULL, *accel_opts = NULL;
|
||||
QemuOptsList *olist;
|
||||
@ -3326,7 +3379,6 @@ void qemu_init(int argc, char **argv, char **envp)
|
||||
FILE *vmstate_dump_file = NULL;
|
||||
Error *err = NULL;
|
||||
bool have_custom_ram_size;
|
||||
BlockdevOptionsQueue bdo_queue = QSIMPLEQ_HEAD_INITIALIZER(bdo_queue);
|
||||
|
||||
qemu_add_opts(&qemu_drive_opts);
|
||||
qemu_add_drive_opts(&qemu_legacy_drive_opts);
|
||||
@ -4298,52 +4350,7 @@ void qemu_init(int argc, char **argv, char **envp)
|
||||
|
||||
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");
|
||||
}
|
||||
if (dpy.has_window_close &&
|
||||
(dpy.type != DISPLAY_TYPE_GTK && dpy.type != DISPLAY_TYPE_SDL)) {
|
||||
error_report("-no-quit is only valid for GTK and SDL, "
|
||||
"ignoring option");
|
||||
}
|
||||
|
||||
qemu_display_early_init(&dpy);
|
||||
qemu_console_early_init();
|
||||
|
||||
if (dpy.has_gl && dpy.gl != DISPLAYGL_MODE_OFF && display_opengl == 0) {
|
||||
#if defined(CONFIG_OPENGL)
|
||||
error_report("OpenGL is not supported by the display");
|
||||
#else
|
||||
error_report("OpenGL support is disabled");
|
||||
#endif
|
||||
exit(1);
|
||||
}
|
||||
|
||||
qemu_opts_foreach(qemu_find_opts("object"),
|
||||
user_creatable_add_opts_foreach,
|
||||
object_create_initial, &error_fatal);
|
||||
|
||||
/* spice needs the timers to be initialized by this point */
|
||||
/* spice must initialize before audio as it changes the default auiodev */
|
||||
/* spice must initialize before chardevs (for spicevmc and spiceport) */
|
||||
qemu_spice.init();
|
||||
|
||||
qemu_opts_foreach(qemu_find_opts("chardev"),
|
||||
chardev_init_func, NULL, &error_fatal);
|
||||
|
||||
#ifdef CONFIG_VIRTFS
|
||||
qemu_opts_foreach(qemu_find_opts("fsdev"),
|
||||
fsdev_init_func, NULL, &error_fatal);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Note: we need to create audio and block backends before
|
||||
* machine_set_property(), so machine properties can refer to
|
||||
* them.
|
||||
*/
|
||||
configure_blockdev(&bdo_queue, machine_class, snapshot);
|
||||
audio_init_audiodevs();
|
||||
qemu_create_early_backends();
|
||||
|
||||
machine_opts = qemu_get_machine_opts();
|
||||
qemu_opt_foreach(machine_opts, machine_set_property, current_machine,
|
||||
|
Loading…
Reference in New Issue
Block a user