On Tue, 27 Oct 2020 14:21:37 -0400 Paolo Bonzini <pbonz...@redhat.com> wrote:
> Displays should be available before the monitor starts, so that > it is possible to use the graphical console to interact with > the monitor itself. > > This patch is quite ugly, but all this is temporary. The double > call to qemu_init_displays will go away as soon we can unify machine > initialization between the preconfig and "normal" flows, and so will > the preconfig_exit_requested variable (that is only preconfig_requested > remains). > > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> Doesn't apply to yer for-6.0 branch > --- > softmmu/vl.c | 58 ++++++++++++++++++++++++++++++++-------------------- > 1 file changed, 36 insertions(+), 22 deletions(-) > > diff --git a/softmmu/vl.c b/softmmu/vl.c > index 1485aba8be..a46f1b9164 100644 > --- a/softmmu/vl.c > +++ b/softmmu/vl.c > @@ -137,6 +137,7 @@ static ram_addr_t maxram_size; > static uint64_t ram_slots; > static int display_remote; > static int snapshot; > +static bool preconfig_requested; > static QemuPluginList plugin_list = QTAILQ_HEAD_INITIALIZER(plugin_list); > static BlockdevOptionsQueue bdo_queue = QSIMPLEQ_HEAD_INITIALIZER(bdo_queue); > static bool nographic = false; > @@ -3210,12 +3211,12 @@ static void qemu_validate_options(void) > } > } > > - if (loadvm && !preconfig_exit_requested) { > + if (loadvm && preconfig_requested) { > error_report("'preconfig' and 'loadvm' options are " > "mutually exclusive"); > exit(EXIT_FAILURE); > } > - if (incoming && !preconfig_exit_requested) { > + if (incoming && preconfig_requested) { > error_report("'preconfig' and 'incoming' options are " > "mutually exclusive"); > exit(EXIT_FAILURE); > @@ -3381,6 +3382,28 @@ static void qemu_init_subsystems(void) > socket_init(); > } > > +static void qemu_init_displays(void) > +{ > + DisplayState *ds; > + > + /* init local displays */ > + ds = init_displaystate(); > + qemu_display_init(ds, &dpy); > + > + /* must be after terminal init, SDL library changes signal handlers */ > + os_setup_signal_handling(); > + > + /* init remote displays */ > +#ifdef CONFIG_VNC > + qemu_opts_foreach(qemu_find_opts("vnc"), > + vnc_init_func, NULL, &error_fatal); > +#endif > + > + if (using_spice) { > + qemu_spice.display_init(); > + } > +} > + > /* > * Called after leaving preconfig state. From here on runstate is > * RUN_STATE_PRELAUNCH or RUN_STATE_INMIGRATE. > @@ -3449,8 +3472,6 @@ static void qemu_create_cli_devices(void) > > static void qemu_machine_creation_done(void) > { > - DisplayState *ds; > - > cpu_synchronize_all_post_init(); > > /* Did we create any drives that we failed to create a device for? */ > @@ -3473,23 +3494,6 @@ static void qemu_machine_creation_done(void) > qemu_register_reset(restore_boot_order, g_strdup(boot_order)); > } > > - /* init local displays */ > - ds = init_displaystate(); > - qemu_display_init(ds, &dpy); > - > - /* must be after terminal init, SDL library changes signal handlers */ > - os_setup_signal_handling(); > - > - /* init remote displays */ > -#ifdef CONFIG_VNC > - qemu_opts_foreach(qemu_find_opts("vnc"), > - vnc_init_func, NULL, &error_fatal); > -#endif > - > - if (using_spice) { > - qemu_spice.display_init(); > - } > - > if (foreach_device_config(DEV_GDB, gdbserver_start) < 0) { > exit(1); > } > @@ -4094,6 +4098,7 @@ void qemu_init(int argc, char **argv, char **envp) > break; > case QEMU_OPTION_preconfig: > preconfig_exit_requested = false; > + preconfig_requested = true; > break; > case QEMU_OPTION_enable_kvm: > olist = qemu_find_opts("machine"); > @@ -4515,11 +4520,20 @@ void qemu_init(int argc, char **argv, char **envp) > qemu_resolve_machine_memdev(); > parse_numa_opts(current_machine); > > + if (preconfig_requested) { > + qemu_init_displays(); > + } > + > /* do monitor/qmp handling at preconfig state if requested */ > qemu_main_loop(); > - > qemu_finish_machine_init(); > + > qemu_create_cli_devices(); > + > + /* initialize displays after all errors have been reported */ > + if (!preconfig_requested) { > + qemu_init_displays(); > + } > qemu_machine_creation_done(); > > if (loadvm) {