From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MMfvM-0001fe-GE for qemu-devel@nongnu.org; Fri, 03 Jul 2009 06:23:20 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MMfvH-0001a9-BD for qemu-devel@nongnu.org; Fri, 03 Jul 2009 06:23:19 -0400 Received: from [199.232.76.173] (port=51446 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MMfvH-0001Zi-1W for qemu-devel@nongnu.org; Fri, 03 Jul 2009 06:23:15 -0400 Received: from mx2.redhat.com ([66.187.237.31]:57941) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MMfvF-00060G-QK for qemu-devel@nongnu.org; Fri, 03 Jul 2009 06:23:14 -0400 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n63AND97002995 for ; Fri, 3 Jul 2009 06:23:13 -0400 From: Gerd Hoffmann Date: Fri, 3 Jul 2009 12:22:50 +0200 Message-Id: <1246616578-6560-6-git-send-email-kraxel@redhat.com> In-Reply-To: <1246616578-6560-1-git-send-email-kraxel@redhat.com> References: <1246616578-6560-1-git-send-email-kraxel@redhat.com> Subject: [Qemu-devel] [PATCH 05/13] qdev: add -device command line option. List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Gerd Hoffmann Add a linked list where command line options can be saved. Use it for the new -device and for the -usbdevice and -bt switches. Signed-off-by: Gerd Hoffmann --- hw/qdev.c | 4 ++- qemu-options.hx | 2 + vl.c | 96 ++++++++++++++++++++++++++++++++++++------------------- 3 files changed, 68 insertions(+), 34 deletions(-) diff --git a/hw/qdev.c b/hw/qdev.c index 6bc2530..82bcd04 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -124,8 +124,10 @@ DeviceState *qdev_device_add(const char *cmdline) if (params) { while (params[0]) { - if (2 != sscanf(params, "%31[^=]=%255[^,]%n", tag, value, &n)) + if (2 != sscanf(params, "%31[^=]=%255[^,]%n", tag, value, &n)) { + fprintf(stderr, "parse error at \"%s\"\n", params); break; + } params += n; if (strcmp(tag, "addr") == 0) continue; diff --git a/qemu-options.hx b/qemu-options.hx index a94f9d3..67d7bd0 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -364,6 +364,8 @@ Network adapter that supports CDC ethernet and RNDIS protocols. @end table ETEXI +DEF("device", HAS_ARG, QEMU_OPTION_device, + "-device driver[,options] add device\n") DEF("name", HAS_ARG, QEMU_OPTION_name, "-name string set the name of the guest\n") STEXI diff --git a/vl.c b/vl.c index 7b7489c..ca82f80 100644 --- a/vl.c +++ b/vl.c @@ -181,12 +181,6 @@ int main(int argc, char **argv) #define DEFAULT_RAM_SIZE 128 -/* Max number of USB devices that can be specified on the commandline. */ -#define MAX_USB_CMDLINE 8 - -/* Max number of bluetooth switches on the commandline. */ -#define MAX_BT_CMDLINE 10 - /* XXX: use a two level table to limit memory usage */ #define MAX_IOPORTS 65536 @@ -2787,6 +2781,11 @@ static int usb_device_del(const char *devname) return usb_device_del_addr(bus_num, addr); } +static int usb_parse(const char *cmdline) +{ + return usb_device_add(cmdline, 0); +} + void do_usb_add(Monitor *mon, const char *devname) { usb_device_add(devname, 1); @@ -4970,6 +4969,52 @@ char *qemu_find_file(int type, const char *name) return buf; } +struct device_config { + enum { + DEV_GENERIC, /* -device */ + DEV_USB, /* -usbdevice */ + DEV_BT, /* -bt */ + } type; + const char *cmdline; + TAILQ_ENTRY(device_config) next; +}; +TAILQ_HEAD(, device_config) device_configs = TAILQ_HEAD_INITIALIZER(device_configs); + +static void add_device_config(int type, const char *cmdline) +{ + struct device_config *conf; + + conf = qemu_mallocz(sizeof(*conf)); + conf->type = type; + conf->cmdline = cmdline; + TAILQ_INSERT_TAIL(&device_configs, conf, next); +} + +static int foreach_device_config(int type, int (*func)(const char *cmdline)) +{ + struct device_config *conf; + int rc; + + TAILQ_FOREACH(conf, &device_configs, next) { + if (conf->type != type) + continue; + rc = func(conf->cmdline); + if (0 != rc) + return rc; + } + return 0; +} + +static int generic_parse(const char *cmdline) +{ + DeviceState *dev; + + dev = qdev_device_add(cmdline); + if (!dev) + return -1; + return 0; +} + int main(int argc, char **argv, char **envp) { const char *gdbstub_dev = NULL; @@ -4984,8 +5029,6 @@ int main(int argc, char **argv, char **envp) int cyls, heads, secs, translation; const char *net_clients[MAX_NET_CLIENTS]; int nb_net_clients; - const char *bt_opts[MAX_BT_CMDLINE]; - int nb_bt_opts; int hda_index; int optind; const char *r, *optarg; @@ -5000,8 +5043,6 @@ int main(int argc, char **argv, char **envp) const char *loadvm = NULL; QEMUMachine *machine; const char *cpu_model; - const char *usb_devices[MAX_USB_CMDLINE]; - int usb_devices_index; #ifndef _WIN32 int fds[2]; #endif @@ -5081,10 +5122,7 @@ int main(int argc, char **argv, char **envp) node_cpumask[i] = 0; } - usb_devices_index = 0; - nb_net_clients = 0; - nb_bt_opts = 0; nb_drives = 0; nb_drives_opt = 0; nb_numa_nodes = 0; @@ -5331,11 +5369,7 @@ int main(int argc, char **argv, char **envp) break; #endif case QEMU_OPTION_bt: - if (nb_bt_opts >= MAX_BT_CMDLINE) { - fprintf(stderr, "qemu: too many bluetooth options\n"); - exit(1); - } - bt_opts[nb_bt_opts++] = optarg; + add_device_config(DEV_BT, optarg); break; #ifdef HAS_AUDIO case QEMU_OPTION_audio_help: @@ -5577,12 +5611,10 @@ int main(int argc, char **argv, char **envp) break; case QEMU_OPTION_usbdevice: usb_enabled = 1; - if (usb_devices_index >= MAX_USB_CMDLINE) { - fprintf(stderr, "Too many USB devices\n"); - exit(1); - } - usb_devices[usb_devices_index] = optarg; - usb_devices_index++; + add_device_config(DEV_USB, optarg); + break; + case QEMU_OPTION_device: + add_device_config(DEV_GENERIC, optarg); break; case QEMU_OPTION_smp: smp_cpus = atoi(optarg); @@ -5893,9 +5925,8 @@ int main(int argc, char **argv, char **envp) net_client_check(); /* init the bluetooth world */ - for (i = 0; i < nb_bt_opts; i++) - if (bt_parse(bt_opts[i])) - exit(1); + if (foreach_device_config(DEV_BT, bt_parse)) + exit(1); /* init the memory */ if (ram_size == 0) @@ -6083,14 +6114,13 @@ int main(int argc, char **argv, char **envp) /* init USB devices */ if (usb_enabled) { - for(i = 0; i < usb_devices_index; i++) { - if (usb_device_add(usb_devices[i], 0) < 0) { - fprintf(stderr, "Warning: could not add USB device %s\n", - usb_devices[i]); - } - } + foreach_device_config(DEV_USB, usb_parse); } + /* init generic devices */ + if (foreach_device_config(DEV_GENERIC, generic_parse)) + exit(1); + if (!display_state) dumb_display_init(); /* just use the first displaystate for the moment */ -- 1.6.2.5