From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LNvE4-00089P-HD for qemu-devel@nongnu.org; Fri, 16 Jan 2009 15:23:32 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LNvE3-000895-9t for qemu-devel@nongnu.org; Fri, 16 Jan 2009 15:23:32 -0500 Received: from [199.232.76.173] (port=33947 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LNvE2-000892-Ua for qemu-devel@nongnu.org; Fri, 16 Jan 2009 15:23:30 -0500 Received: from savannah.gnu.org ([199.232.41.3]:53716 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LNvE2-0000Un-Kp for qemu-devel@nongnu.org; Fri, 16 Jan 2009 15:23:30 -0500 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1LNvE1-00076v-Ay for qemu-devel@nongnu.org; Fri, 16 Jan 2009 20:23:29 +0000 Received: from aliguori by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1LNvE0-00076q-JF for qemu-devel@nongnu.org; Fri, 16 Jan 2009 20:23:28 +0000 MIME-Version: 1.0 Errors-To: aliguori Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Anthony Liguori Message-Id: Date: Fri, 16 Jan 2009 20:23:28 +0000 Subject: [Qemu-devel] [6352] Fix character devices after DisplayState refactoring Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 6352 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6352 Author: aliguori Date: 2009-01-16 20:23:27 +0000 (Fri, 16 Jan 2009) Log Message: ----------- Fix character devices after DisplayState refactoring The DisplayState refactoring changed the machine init function to create a DisplayState for each VGA device instead of being passed an existing DisplayState. This change is critical to enable multiple graphics device support. Unfortunately, the serial/parallel/console code is structured today to run before machine init to fill out the CharDriverState table which the machine init function uses to determine whether to create the required devices. Since a 'vc' is a type of CharDriverState, the CharDriverState code requires that a DisplayState exist before it runs creating a circular dependency. To fix this, this splits the creation of the initial CharDriverState from the initialization of the text console. We can then in a second step associate a DisplayState with all TextConsoles. This allows us to create the CharDriverState's first, machine init, then associate the TextConsoles with a DisplayState. This code screams for more cleanup. Signed-off-by: Anthony Liguori Modified Paths: -------------- trunk/console.c trunk/console.h trunk/qemu-char.c trunk/vl.c Modified: trunk/console.c =================================================================== --- trunk/console.c 2009-01-16 20:07:19 UTC (rev 6351) +++ trunk/console.c 2009-01-16 20:23:27 UTC (rev 6352) @@ -1285,17 +1285,17 @@ } } -CharDriverState *text_console_init(DisplayState *ds, const char *p) +static int n_text_consoles; +static CharDriverState *text_consoles[128]; +static char *text_console_strs[128]; + +static void text_console_do_init(CharDriverState *chr, DisplayState *ds, const char *p) { - CharDriverState *chr; TextConsole *s; unsigned width; unsigned height; static int color_inited; - chr = qemu_mallocz(sizeof(CharDriverState)); - if (!chr) - return NULL; s = new_console(ds, (p == 0) ? TEXT_CONSOLE : TEXT_CONSOLE_FIXED_SIZE); if (!s) { free(chr); @@ -1352,7 +1352,6 @@ s->t_attrib_default.unvisible = 0; s->t_attrib_default.fgcol = COLOR_WHITE; s->t_attrib_default.bgcol = COLOR_BLACK; - /* set current text attributes to default */ s->t_attrib = s->t_attrib_default; text_console_resize(s); @@ -1362,6 +1361,37 @@ return chr; } +CharDriverState *text_console_init(const char *p) +{ + CharDriverState *chr; + + chr = qemu_mallocz(sizeof(CharDriverState)); + if (!chr) + return NULL; + + if (n_text_consoles == 128) { + fprintf(stderr, "Too many text consoles\n"); + exit(1); + } + text_consoles[n_text_consoles] = chr; + text_console_strs[n_text_consoles] = p ? qemu_strdup(p) : NULL; + n_text_consoles++; + + return chr; +} + +void text_consoles_set_display(DisplayState *ds) +{ + int i; + + for (i = 0; i < n_text_consoles; i++) { + text_console_do_init(text_consoles[i], ds, text_console_strs[i]); + qemu_free(text_console_strs[i]); + } + + n_text_consoles = 0; +} + void qemu_console_resize(DisplayState *ds, int width, int height) { TextConsole *s = get_graphic_console(); Modified: trunk/console.h =================================================================== --- trunk/console.h 2009-01-16 20:07:19 UTC (rev 6351) +++ trunk/console.h 2009-01-16 20:23:27 UTC (rev 6352) @@ -265,7 +265,8 @@ int is_graphic_console(void); int is_fixedsize_console(void); -CharDriverState *text_console_init(DisplayState *ds, const char *p); +CharDriverState *text_console_init(const char *p); +void text_consoles_set_display(DisplayState *ds); void console_select(unsigned int index); void console_color_init(DisplayState *ds); void qemu_console_resize(DisplayState *ds, int width, int height); Modified: trunk/qemu-char.c =================================================================== --- trunk/qemu-char.c 2009-01-16 20:07:19 UTC (rev 6351) +++ trunk/qemu-char.c 2009-01-16 20:23:27 UTC (rev 6352) @@ -2128,10 +2128,10 @@ CharDriverState *chr; if (!strcmp(filename, "vc")) { - chr = text_console_init(get_displaystate(), 0); + chr = text_console_init(0); } else if (strstart(filename, "vc:", &p)) { - chr = text_console_init(get_displaystate(), p); + chr = text_console_init(p); } else if (!strcmp(filename, "null")) { chr = qemu_chr_open_null(); Modified: trunk/vl.c =================================================================== --- trunk/vl.c 2009-01-16 20:07:19 UTC (rev 6351) +++ trunk/vl.c 2009-01-16 20:23:27 UTC (rev 6352) @@ -5461,6 +5461,48 @@ } } + for(i = 0; i < MAX_SERIAL_PORTS; i++) { + const char *devname = serial_devices[i]; + if (devname && strcmp(devname, "none")) { + char label[32]; + snprintf(label, sizeof(label), "serial%d", i); + serial_hds[i] = qemu_chr_open(label, devname); + if (!serial_hds[i]) { + fprintf(stderr, "qemu: could not open serial device '%s'\n", + devname); + exit(1); + } + } + } + + for(i = 0; i < MAX_PARALLEL_PORTS; i++) { + const char *devname = parallel_devices[i]; + if (devname && strcmp(devname, "none")) { + char label[32]; + snprintf(label, sizeof(label), "parallel%d", i); + parallel_hds[i] = qemu_chr_open(label, devname); + if (!parallel_hds[i]) { + fprintf(stderr, "qemu: could not open parallel device '%s'\n", + devname); + exit(1); + } + } + } + + for(i = 0; i < MAX_VIRTIO_CONSOLES; i++) { + const char *devname = virtio_consoles[i]; + if (devname && strcmp(devname, "none")) { + char label[32]; + snprintf(label, sizeof(label), "virtcon%d", i); + virtcon_hds[i] = qemu_chr_open(label, devname); + if (!virtcon_hds[i]) { + fprintf(stderr, "qemu: could not open virtio console '%s'\n", + devname); + exit(1); + } + } + } + machine->init(ram_size, vga_ram_size, boot_devices, kernel_filename, kernel_cmdline, initrd_filename, cpu_model); @@ -5529,6 +5571,8 @@ dcl = dcl->next; } + text_consoles_set_display(display_state); + if (monitor_device) { monitor_hd = qemu_chr_open("monitor", monitor_device); if (!monitor_hd) { @@ -5543,12 +5587,6 @@ if (devname && strcmp(devname, "none")) { char label[32]; snprintf(label, sizeof(label), "serial%d", i); - serial_hds[i] = qemu_chr_open(label, devname); - if (!serial_hds[i]) { - fprintf(stderr, "qemu: could not open serial device '%s'\n", - devname); - exit(1); - } if (strstart(devname, "vc", 0)) qemu_chr_printf(serial_hds[i], "serial%d console\r\n", i); } @@ -5559,12 +5597,6 @@ if (devname && strcmp(devname, "none")) { char label[32]; snprintf(label, sizeof(label), "parallel%d", i); - parallel_hds[i] = qemu_chr_open(label, devname); - if (!parallel_hds[i]) { - fprintf(stderr, "qemu: could not open parallel device '%s'\n", - devname); - exit(1); - } if (strstart(devname, "vc", 0)) qemu_chr_printf(parallel_hds[i], "parallel%d console\r\n", i); } @@ -5572,15 +5604,9 @@ for(i = 0; i < MAX_VIRTIO_CONSOLES; i++) { const char *devname = virtio_consoles[i]; - if (devname && strcmp(devname, "none")) { + if (virtcon_hds[i] && devname) { char label[32]; snprintf(label, sizeof(label), "virtcon%d", i); - virtcon_hds[i] = qemu_chr_open(label, devname); - if (!virtcon_hds[i]) { - fprintf(stderr, "qemu: could not open virtio console '%s'\n", - devname); - exit(1); - } if (strstart(devname, "vc", 0)) qemu_chr_printf(virtcon_hds[i], "virtio console%d\r\n", i); }