ui/console: allow to override the default VC

If a display is backed by a specialized VC, allow to override the
default "vc:80Cx24C".

As suggested by Paolo, if the display doesn't implement a VC (get_vc()
returns NULL), use a fallback that will use a muxed console on stdio.

This changes the behaviour of "qemu -display none", to create a muxed
serial/monitor by default (on TTY & not daemonized).

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
This commit is contained in:
Marc-André Lureau 2023-09-05 23:18:08 +04:00
parent 2aeaa4b200
commit 1bec1cc0da
3 changed files with 33 additions and 10 deletions

View File

@ -462,12 +462,14 @@ struct QemuDisplay {
DisplayType type; DisplayType type;
void (*early_init)(DisplayOptions *opts); void (*early_init)(DisplayOptions *opts);
void (*init)(DisplayState *ds, DisplayOptions *opts); void (*init)(DisplayState *ds, DisplayOptions *opts);
const char *vc;
}; };
void qemu_display_register(QemuDisplay *ui); void qemu_display_register(QemuDisplay *ui);
bool qemu_display_find_default(DisplayOptions *opts); bool qemu_display_find_default(DisplayOptions *opts);
void qemu_display_early_init(DisplayOptions *opts); void qemu_display_early_init(DisplayOptions *opts);
void qemu_display_init(DisplayState *ds, DisplayOptions *opts); void qemu_display_init(DisplayState *ds, DisplayOptions *opts);
const char *qemu_display_get_vc(DisplayOptions *opts);
void qemu_display_help(void); void qemu_display_help(void);
/* vnc.c */ /* vnc.c */

View File

@ -1372,6 +1372,7 @@ static void qemu_setup_display(void)
static void qemu_create_default_devices(void) static void qemu_create_default_devices(void)
{ {
MachineClass *machine_class = MACHINE_GET_CLASS(current_machine); MachineClass *machine_class = MACHINE_GET_CLASS(current_machine);
const char *vc = qemu_display_get_vc(&dpy);
if (is_daemonized()) { if (is_daemonized()) {
/* According to documentation and historically, -nographic redirects /* According to documentation and historically, -nographic redirects
@ -1390,24 +1391,30 @@ static void qemu_create_default_devices(void)
} }
} }
if (nographic) { if (nographic || (!vc && !is_daemonized() && isatty(STDOUT_FILENO))) {
if (default_parallel) if (default_parallel) {
add_device_config(DEV_PARALLEL, "null"); add_device_config(DEV_PARALLEL, "null");
}
if (default_serial && default_monitor) { if (default_serial && default_monitor) {
add_device_config(DEV_SERIAL, "mon:stdio"); add_device_config(DEV_SERIAL, "mon:stdio");
} else { } else {
if (default_serial) if (default_serial) {
add_device_config(DEV_SERIAL, "stdio"); add_device_config(DEV_SERIAL, "stdio");
if (default_monitor) }
if (default_monitor) {
monitor_parse("stdio", "readline", false); monitor_parse("stdio", "readline", false);
} }
}
} else { } else {
if (default_serial) if (default_serial) {
add_device_config(DEV_SERIAL, "vc:80Cx24C"); add_device_config(DEV_SERIAL, vc ?: "null");
if (default_parallel) }
add_device_config(DEV_PARALLEL, "vc:80Cx24C"); if (default_parallel) {
if (default_monitor) add_device_config(DEV_PARALLEL, vc ?: "null");
monitor_parse("vc:80Cx24C", "readline", false); }
if (default_monitor && vc) {
monitor_parse(vc, "readline", false);
}
} }
if (default_net) { if (default_net) {

View File

@ -1675,6 +1675,20 @@ void qemu_display_init(DisplayState *ds, DisplayOptions *opts)
dpys[opts->type]->init(ds, opts); dpys[opts->type]->init(ds, opts);
} }
const char *qemu_display_get_vc(DisplayOptions *opts)
{
assert(opts->type < DISPLAY_TYPE__MAX);
if (opts->type == DISPLAY_TYPE_NONE) {
return NULL;
}
assert(dpys[opts->type] != NULL);
if (dpys[opts->type]->vc) {
return dpys[opts->type]->vc;
} else {
return "vc:80Cx24C";
}
}
void qemu_display_help(void) void qemu_display_help(void)
{ {
int idx; int idx;