From patchwork Mon Dec 7 12:42:37 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gerd Hoffmann X-Patchwork-Id: 40478 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 894A8B6F0C for ; Mon, 7 Dec 2009 23:56:12 +1100 (EST) Received: from localhost ([127.0.0.1]:57057 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NHd8L-0001Y3-HN for incoming@patchwork.ozlabs.org; Mon, 07 Dec 2009 07:56:09 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NHcwn-0005Kr-Iw for qemu-devel@nongnu.org; Mon, 07 Dec 2009 07:44:13 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NHcwf-0005FW-Nr for qemu-devel@nongnu.org; Mon, 07 Dec 2009 07:44:10 -0500 Received: from [199.232.76.173] (port=58670 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NHcwf-0005FP-7E for qemu-devel@nongnu.org; Mon, 07 Dec 2009 07:44:05 -0500 Received: from mx1.redhat.com ([209.132.183.28]:25728) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NHcwe-0000fv-OD for qemu-devel@nongnu.org; Mon, 07 Dec 2009 07:44:05 -0500 Received: from int-mx05.intmail.prod.int.phx2.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.18]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id nB7Ci3O9022739 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 7 Dec 2009 07:44:03 -0500 Received: from zweiblum.home.kraxel.org (vpn2-8-247.ams2.redhat.com [10.36.8.247]) by int-mx05.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id nB7ChxX7005511; Mon, 7 Dec 2009 07:44:00 -0500 Received: by zweiblum.home.kraxel.org (Postfix, from userid 500) id 88A2E7010B; Mon, 7 Dec 2009 13:43:59 +0100 (CET) From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Mon, 7 Dec 2009 13:42:37 +0100 Message-Id: <1260189773-20728-6-git-send-email-kraxel@redhat.com> In-Reply-To: <1260189773-20728-1-git-send-email-kraxel@redhat.com> References: <1260189773-20728-1-git-send-email-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.18 X-detected-operating-system: by monty-python.gnu.org: Genre and OS details not recognized. Cc: Gerd Hoffmann , agraf@suse.de, lcapitulino@redhat.com Subject: [Qemu-devel] [FOR 0.12 PATCH v3 05/21] default devices: core code & serial lines. X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Qemu creates a default serial line for you in case you didn't specify one on the command line. Right now this is tied to the '-serial ' command line switch, which in turn causes trouble if you are creating your serial line via '-device isa-serial,'. This patch adds a variable default_serial which says whenever a default serial line should be added. It is enabled by default. It is cleared when qemu finds '-serial' or '-device isa-serial' on the command line. Part of the patch is some infrastructure for the '-device $driver' checking (default_driver_check function) which will also be used by the other patches of this series. Signed-off-by: Gerd Hoffmann --- vl.c | 122 +++++++++++++++++++++++++++++++++++++++++++---------------------- 1 files changed, 81 insertions(+), 41 deletions(-) diff --git a/vl.c b/vl.c index 24d5d92..eca4eee 100644 --- a/vl.c +++ b/vl.c @@ -271,6 +271,30 @@ uint8_t qemu_uuid[16]; static QEMUBootSetHandler *boot_set_handler; static void *boot_set_opaque; +static int default_serial = 1; + +static struct { + const char *driver; + int *flag; +} default_list[] = { + { .driver = "isa-serial", .flag = &default_serial }, +}; + +static int default_driver_check(QemuOpts *opts, void *opaque) +{ + const char *driver = qemu_opt_get(opts, "driver"); + int i; + + if (!driver) + return 0; + for (i = 0; i < ARRAY_SIZE(default_list); i++) { + if (strcmp(default_list[i].driver, driver) != 0) + continue; + *(default_list[i].flag) = 0; + } + return 0; +} + /***********************************************************/ /* x86 ISA bus support */ @@ -4590,6 +4614,7 @@ struct device_config { enum { DEV_USB, /* -usbdevice */ DEV_BT, /* -bt */ + DEV_SERIAL, /* -serial */ } type; const char *cmdline; QTAILQ_ENTRY(device_config) next; @@ -4621,6 +4646,50 @@ static int foreach_device_config(int type, int (*func)(const char *cmdline)) return 0; } +static void serial_monitor_mux(const char *monitor_devices[]) +{ + struct device_config *serial; + const char *devname; + + if (strcmp(monitor_devices[0],"stdio") != 0) + return; + QTAILQ_FOREACH(serial, &device_configs, next) { + if (serial->type != DEV_SERIAL) + continue; + devname = serial->cmdline; + if (devname && !strcmp(devname,"mon:stdio")) { + monitor_devices[0] = NULL; + break; + } else if (devname && !strcmp(devname,"stdio")) { + monitor_devices[0] = NULL; + serial->cmdline = "mon:stdio"; + break; + } + } +} + +static int serial_parse(const char *devname) +{ + static int index = 0; + char label[32]; + + if (strcmp(devname, "none") == 0) + return 0; + if (index == MAX_SERIAL_PORTS) { + fprintf(stderr, "qemu: too many serial ports\n"); + exit(1); + } + snprintf(label, sizeof(label), "serial%d", index); + serial_hds[index] = qemu_chr_open(label, devname, NULL); + if (!serial_hds[index]) { + fprintf(stderr, "qemu: could not open serial device '%s': %s\n", + devname, strerror(errno)); + return -1; + } + index++; + return 0; +} + int main(int argc, char **argv, char **envp) { const char *gdbstub_dev = NULL; @@ -4639,8 +4708,6 @@ int main(int argc, char **argv, char **envp) CharDriverState *monitor_hds[MAX_MONITOR_DEVICES]; const char *monitor_devices[MAX_MONITOR_DEVICES]; int monitor_device_index; - const char *serial_devices[MAX_SERIAL_PORTS]; - int serial_device_index; const char *parallel_devices[MAX_PARALLEL_PORTS]; int parallel_device_index; const char *virtio_consoles[MAX_VIRTIO_CONSOLES]; @@ -4710,11 +4777,6 @@ int main(int argc, char **argv, char **envp) cyls = heads = secs = 0; translation = BIOS_ATA_TRANSLATION_AUTO; - serial_devices[0] = "vc:80Cx24C"; - for(i = 1; i < MAX_SERIAL_PORTS; i++) - serial_devices[i] = NULL; - serial_device_index = 0; - parallel_devices[0] = "vc:80Cx24C"; for(i = 1; i < MAX_PARALLEL_PORTS; i++) parallel_devices[i] = NULL; @@ -5161,12 +5223,8 @@ int main(int argc, char **argv, char **envp) } break; case QEMU_OPTION_serial: - if (serial_device_index >= MAX_SERIAL_PORTS) { - fprintf(stderr, "qemu: too many serial ports\n"); - exit(1); - } - serial_devices[serial_device_index] = optarg; - serial_device_index++; + add_device_config(DEV_SERIAL, optarg); + default_serial = 0; break; case QEMU_OPTION_watchdog: if (watchdog) { @@ -5467,14 +5525,19 @@ int main(int argc, char **argv, char **envp) exit(1); } + qemu_opts_foreach(&qemu_device_opts, default_driver_check, NULL, 0); + if (display_type == DT_NOGRAPHIC) { - if (serial_device_index == 0) - serial_devices[0] = "stdio"; + if (default_serial) + add_device_config(DEV_SERIAL, "stdio"); if (parallel_device_index == 0) parallel_devices[0] = "null"; if (strncmp(monitor_devices[0], "vc", 2) == 0) { monitor_devices[0] = "stdio"; } + } else { + if (default_serial) + add_device_config(DEV_SERIAL, "vc:80Cx24C"); } #ifndef _WIN32 @@ -5623,19 +5686,7 @@ int main(int argc, char **argv, char **envp) ram_load, NULL); /* Maintain compatibility with multiple stdio monitors */ - if (!strcmp(monitor_devices[0],"stdio")) { - for (i = 0; i < MAX_SERIAL_PORTS; i++) { - const char *devname = serial_devices[i]; - if (devname && !strcmp(devname,"mon:stdio")) { - monitor_devices[0] = NULL; - break; - } else if (devname && !strcmp(devname,"stdio")) { - monitor_devices[0] = NULL; - serial_devices[i] = "mon:stdio"; - break; - } - } - } + serial_monitor_mux(monitor_devices); if (nb_numa_nodes > 0) { int i; @@ -5697,19 +5748,8 @@ int main(int argc, char **argv, char **envp) } } - 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, NULL); - if (!serial_hds[i]) { - fprintf(stderr, "qemu: could not open serial device '%s': %s\n", - devname, strerror(errno)); - exit(1); - } - } - } + if (foreach_device_config(DEV_SERIAL, serial_parse) < 0) + exit(1); for(i = 0; i < MAX_PARALLEL_PORTS; i++) { const char *devname = parallel_devices[i];