It looks like initially there was -nographic option to turn off display, now there's another option of the same sort, -display none. But code in other places of qemu checks for DT_NOGRAPHIC and does not work well with -display none. Make DT_NOGRAPHIC an internal version which selects DT_NONE, and check for that in all other places where previously we checked for DT_NOGRAPHIC.
While at it, rename two private variants of display (DT_DEFAULT and DT_NOGRAPHIC) to use two underscores and make them negative, and set DT_NONE to 0. This should fix the issue of non-working sun serial console with the suggested replacement of -nographic which is -display none. Cc: Todd T. Fries <t...@fries.net> Signed-off-by: Michael Tokarev <m...@tls.msk.ru> --- V2: - do not touch qemu-char, fixed differently as suggested by pbonzini - a bit more explicit comments about private DT__* constants - documentation additions and fixes to describe actual reality hw/lm32/milkymist-hw.h | 2 +- hw/nvram/fw_cfg.c | 2 +- hw/sparc/sun4m.c | 2 +- include/sysemu/sysemu.h | 6 +++--- qemu-options.hx | 12 ++++++++++-- vl.c | 15 +++++++-------- 6 files changed, 23 insertions(+), 16 deletions(-) diff --git a/hw/lm32/milkymist-hw.h b/hw/lm32/milkymist-hw.h index 5317ce6..59af720 100644 --- a/hw/lm32/milkymist-hw.h +++ b/hw/lm32/milkymist-hw.h @@ -107,7 +107,7 @@ static inline DeviceState *milkymist_tmu2_create(hwaddr base, int nelements; int ver_major, ver_minor; - if (display_type == DT_NOGRAPHIC) { + if (display_type == DT_NONE) { return NULL; } diff --git a/hw/nvram/fw_cfg.c b/hw/nvram/fw_cfg.c index 3c255ce..b3d163a 100644 --- a/hw/nvram/fw_cfg.c +++ b/hw/nvram/fw_cfg.c @@ -510,7 +510,7 @@ FWCfgState *fw_cfg_init(uint32_t ctl_port, uint32_t data_port, } fw_cfg_add_bytes(s, FW_CFG_SIGNATURE, (char *)"QEMU", 4); fw_cfg_add_bytes(s, FW_CFG_UUID, qemu_uuid, 16); - fw_cfg_add_i16(s, FW_CFG_NOGRAPHIC, (uint16_t)(display_type == DT_NOGRAPHIC)); + fw_cfg_add_i16(s, FW_CFG_NOGRAPHIC, (uint16_t)(display_type == DT_NONE)); fw_cfg_add_i16(s, FW_CFG_NB_CPUS, (uint16_t)smp_cpus); fw_cfg_add_i16(s, FW_CFG_BOOT_MENU, (uint16_t)boot_menu); fw_cfg_bootsplash(s); diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c index 0e86ca7..c1d42ec 100644 --- a/hw/sparc/sun4m.c +++ b/hw/sparc/sun4m.c @@ -919,7 +919,7 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, slavio_timer_init_all(hwdef->counter_base, slavio_irq[19], slavio_cpu_irq, smp_cpus); slavio_serial_ms_kbd_init(hwdef->ms_kb_base, slavio_irq[14], - display_type == DT_NOGRAPHIC, ESCC_CLOCK, 1); + display_type == DT_NONE, ESCC_CLOCK, 1); /* Slavio TTYA (base+4, Linux ttyS0) is the first QEMU serial device Slavio TTYB (base+0, Linux ttyS1) is the second QEMU serial device */ escc_init(hwdef->serial_base, slavio_irq[15], slavio_irq[15], diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h index 2fb71af..d1b7bd7 100644 --- a/include/sysemu/sysemu.h +++ b/include/sysemu/sysemu.h @@ -87,12 +87,12 @@ void do_info_slirp(Monitor *mon); typedef enum DisplayType { - DT_DEFAULT, + DT__DEFAULT = -1, /* used internally in vl.c */ + DT__NOGRAPHIC = -2, /* used internally in vl.c */ + DT_NONE = 0, DT_CURSES, DT_SDL, DT_GTK, - DT_NOGRAPHIC, - DT_NONE, } DisplayType; extern int autostart; diff --git a/qemu-options.hx b/qemu-options.hx index d676b03..4669138 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -825,7 +825,11 @@ a text mode. Generally only the VGA device models support text mode. @item none Do not display video output. The guest will still see an emulated graphics card, but its output will not be displayed to the QEMU -user. This option differs from the -nographic option in that it +user. The fact that we have no display is passed to firmware and +affects a few other places depending on the target architecture, +like switching console output to serial console or disabling keyboard +input. +This option differs from the -nographic option in that it only affects what is done with video output; -nographic also changes the destination of the serial and parallel port data. @item vnc @@ -844,7 +848,11 @@ you can totally disable graphical output so that QEMU is a simple command line application. The emulated serial port is redirected on the console and muxed with the monitor (unless redirected elsewhere explicitly). Therefore, you can still use QEMU to debug a Linux kernel -with a serial console. +with a serial console. This option is equivalent for +@example +-display none -serial mon:stdio -parallel none +@end example +unless serial, parallel and/or monitor were also specified. ETEXI DEF("curses", 0, QEMU_OPTION_curses, diff --git a/vl.c b/vl.c index 6d9fd7d..98d3e62 100644 --- a/vl.c +++ b/vl.c @@ -183,7 +183,7 @@ static const char *data_dir[16]; static int data_dir_idx; const char *bios_name = NULL; enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB; -DisplayType display_type = DT_DEFAULT; +DisplayType display_type = DT__DEFAULT; static int display_remote; const char* keyboard_layout = NULL; ram_addr_t ram_size; @@ -2183,7 +2183,7 @@ static void select_vgahw (const char *p) static DisplayType select_display(const char *p) { const char *opts; - DisplayType display = DT_DEFAULT; + DisplayType display = DT__DEFAULT; if (strstart(p, "sdl", &opts)) { #ifdef CONFIG_SDL @@ -3125,7 +3125,7 @@ int main(int argc, char **argv, char **envp) display_type = select_display(optarg); break; case QEMU_OPTION_nographic: - display_type = DT_NOGRAPHIC; + display_type = DT__NOGRAPHIC; break; case QEMU_OPTION_curses: #ifdef CONFIG_CURSES @@ -3971,7 +3971,7 @@ int main(int argc, char **argv, char **envp) * -nographic _and_ redirects all ports explicitly - this is valid * usage, -nographic is just a no-op in this case. */ - if (display_type == DT_NOGRAPHIC + if (display_type == DT__NOGRAPHIC && (default_parallel || default_serial || default_monitor || default_virtcon)) { fprintf(stderr, "-nographic can not be used with -daemonize\n"); @@ -3985,7 +3985,8 @@ int main(int argc, char **argv, char **envp) #endif } - if (display_type == DT_NOGRAPHIC) { + if (display_type == DT__NOGRAPHIC) { + display_type = DT_NONE; if (default_parallel) add_device_config(DEV_PARALLEL, "null"); if (default_serial && default_monitor) { @@ -4019,7 +4020,7 @@ int main(int argc, char **argv, char **envp) } } - if (display_type == DT_DEFAULT && !display_remote) { + if (display_type == DT__DEFAULT && !display_remote) { #if defined(CONFIG_GTK) display_type = DT_GTK; #elif defined(CONFIG_SDL) || defined(CONFIG_COCOA) @@ -4309,8 +4310,6 @@ int main(int argc, char **argv, char **envp) /* init local displays */ switch (display_type) { - case DT_NOGRAPHIC: - break; #if defined(CONFIG_CURSES) case DT_CURSES: curses_display_init(ds, full_screen); -- 1.7.10.4