Commit bd3c948db739a6c9c5e42ec838ef1220beea8e4e
Committed by
Anthony Liguori
1 parent
8ffb1bcf
qdev: add -device command line option.
The -device switch is the users frontend to the qdev_device_add function added by the previous patch. Also adds 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 <kraxel@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Showing
2 changed files
with
66 additions
and
33 deletions
qemu-options.hx
@@ -381,6 +381,8 @@ Network adapter that supports CDC ethernet and RNDIS protocols. | @@ -381,6 +381,8 @@ Network adapter that supports CDC ethernet and RNDIS protocols. | ||
381 | @end table | 381 | @end table |
382 | ETEXI | 382 | ETEXI |
383 | 383 | ||
384 | +DEF("device", HAS_ARG, QEMU_OPTION_device, | ||
385 | + "-device driver[,options] add device\n") | ||
384 | DEF("name", HAS_ARG, QEMU_OPTION_name, | 386 | DEF("name", HAS_ARG, QEMU_OPTION_name, |
385 | "-name string1[,process=string2] set the name of the guest\n" | 387 | "-name string1[,process=string2] set the name of the guest\n" |
386 | " string1 sets the window title and string2 the process name (on Linux)\n") | 388 | " string1 sets the window title and string2 the process name (on Linux)\n") |
vl.c
@@ -145,6 +145,7 @@ int main(int argc, char **argv) | @@ -145,6 +145,7 @@ int main(int argc, char **argv) | ||
145 | #include "hw/watchdog.h" | 145 | #include "hw/watchdog.h" |
146 | #include "hw/smbios.h" | 146 | #include "hw/smbios.h" |
147 | #include "hw/xen.h" | 147 | #include "hw/xen.h" |
148 | +#include "hw/qdev.h" | ||
148 | #include "bt-host.h" | 149 | #include "bt-host.h" |
149 | #include "net.h" | 150 | #include "net.h" |
150 | #include "monitor.h" | 151 | #include "monitor.h" |
@@ -175,12 +176,6 @@ int main(int argc, char **argv) | @@ -175,12 +176,6 @@ int main(int argc, char **argv) | ||
175 | 176 | ||
176 | #define DEFAULT_RAM_SIZE 128 | 177 | #define DEFAULT_RAM_SIZE 128 |
177 | 178 | ||
178 | -/* Max number of USB devices that can be specified on the commandline. */ | ||
179 | -#define MAX_USB_CMDLINE 8 | ||
180 | - | ||
181 | -/* Max number of bluetooth switches on the commandline. */ | ||
182 | -#define MAX_BT_CMDLINE 10 | ||
183 | - | ||
184 | static const char *data_dir; | 179 | static const char *data_dir; |
185 | const char *bios_name = NULL; | 180 | const char *bios_name = NULL; |
186 | /* Note: drives_table[MAX_DRIVES] is a dummy block driver if none available | 181 | /* Note: drives_table[MAX_DRIVES] is a dummy block driver if none available |
@@ -2633,6 +2628,11 @@ static int usb_device_del(const char *devname) | @@ -2633,6 +2628,11 @@ static int usb_device_del(const char *devname) | ||
2633 | return usb_device_del_addr(bus_num, addr); | 2628 | return usb_device_del_addr(bus_num, addr); |
2634 | } | 2629 | } |
2635 | 2630 | ||
2631 | +static int usb_parse(const char *cmdline) | ||
2632 | +{ | ||
2633 | + return usb_device_add(cmdline, 0); | ||
2634 | +} | ||
2635 | + | ||
2636 | void do_usb_add(Monitor *mon, const char *devname) | 2636 | void do_usb_add(Monitor *mon, const char *devname) |
2637 | { | 2637 | { |
2638 | usb_device_add(devname, 1); | 2638 | usb_device_add(devname, 1); |
@@ -4827,6 +4827,52 @@ char *qemu_find_file(int type, const char *name) | @@ -4827,6 +4827,52 @@ char *qemu_find_file(int type, const char *name) | ||
4827 | return buf; | 4827 | return buf; |
4828 | } | 4828 | } |
4829 | 4829 | ||
4830 | +struct device_config { | ||
4831 | + enum { | ||
4832 | + DEV_GENERIC, /* -device */ | ||
4833 | + DEV_USB, /* -usbdevice */ | ||
4834 | + DEV_BT, /* -bt */ | ||
4835 | + } type; | ||
4836 | + const char *cmdline; | ||
4837 | + TAILQ_ENTRY(device_config) next; | ||
4838 | +}; | ||
4839 | +TAILQ_HEAD(, device_config) device_configs = TAILQ_HEAD_INITIALIZER(device_configs); | ||
4840 | + | ||
4841 | +static void add_device_config(int type, const char *cmdline) | ||
4842 | +{ | ||
4843 | + struct device_config *conf; | ||
4844 | + | ||
4845 | + conf = qemu_mallocz(sizeof(*conf)); | ||
4846 | + conf->type = type; | ||
4847 | + conf->cmdline = cmdline; | ||
4848 | + TAILQ_INSERT_TAIL(&device_configs, conf, next); | ||
4849 | +} | ||
4850 | + | ||
4851 | +static int foreach_device_config(int type, int (*func)(const char *cmdline)) | ||
4852 | +{ | ||
4853 | + struct device_config *conf; | ||
4854 | + int rc; | ||
4855 | + | ||
4856 | + TAILQ_FOREACH(conf, &device_configs, next) { | ||
4857 | + if (conf->type != type) | ||
4858 | + continue; | ||
4859 | + rc = func(conf->cmdline); | ||
4860 | + if (0 != rc) | ||
4861 | + return rc; | ||
4862 | + } | ||
4863 | + return 0; | ||
4864 | +} | ||
4865 | + | ||
4866 | +static int generic_parse(const char *cmdline) | ||
4867 | +{ | ||
4868 | + DeviceState *dev; | ||
4869 | + | ||
4870 | + dev = qdev_device_add(cmdline); | ||
4871 | + if (!dev) | ||
4872 | + return -1; | ||
4873 | + return 0; | ||
4874 | +} | ||
4875 | + | ||
4830 | int main(int argc, char **argv, char **envp) | 4876 | int main(int argc, char **argv, char **envp) |
4831 | { | 4877 | { |
4832 | const char *gdbstub_dev = NULL; | 4878 | const char *gdbstub_dev = NULL; |
@@ -4841,8 +4887,6 @@ int main(int argc, char **argv, char **envp) | @@ -4841,8 +4887,6 @@ int main(int argc, char **argv, char **envp) | ||
4841 | int cyls, heads, secs, translation; | 4887 | int cyls, heads, secs, translation; |
4842 | const char *net_clients[MAX_NET_CLIENTS]; | 4888 | const char *net_clients[MAX_NET_CLIENTS]; |
4843 | int nb_net_clients; | 4889 | int nb_net_clients; |
4844 | - const char *bt_opts[MAX_BT_CMDLINE]; | ||
4845 | - int nb_bt_opts; | ||
4846 | int hda_index; | 4890 | int hda_index; |
4847 | int optind; | 4891 | int optind; |
4848 | const char *r, *optarg; | 4892 | const char *r, *optarg; |
@@ -4857,8 +4901,6 @@ int main(int argc, char **argv, char **envp) | @@ -4857,8 +4901,6 @@ int main(int argc, char **argv, char **envp) | ||
4857 | const char *loadvm = NULL; | 4901 | const char *loadvm = NULL; |
4858 | QEMUMachine *machine; | 4902 | QEMUMachine *machine; |
4859 | const char *cpu_model; | 4903 | const char *cpu_model; |
4860 | - const char *usb_devices[MAX_USB_CMDLINE]; | ||
4861 | - int usb_devices_index; | ||
4862 | #ifndef _WIN32 | 4904 | #ifndef _WIN32 |
4863 | int fds[2]; | 4905 | int fds[2]; |
4864 | #endif | 4906 | #endif |
@@ -4938,10 +4980,7 @@ int main(int argc, char **argv, char **envp) | @@ -4938,10 +4980,7 @@ int main(int argc, char **argv, char **envp) | ||
4938 | node_cpumask[i] = 0; | 4980 | node_cpumask[i] = 0; |
4939 | } | 4981 | } |
4940 | 4982 | ||
4941 | - usb_devices_index = 0; | ||
4942 | - | ||
4943 | nb_net_clients = 0; | 4983 | nb_net_clients = 0; |
4944 | - nb_bt_opts = 0; | ||
4945 | nb_drives = 0; | 4984 | nb_drives = 0; |
4946 | nb_drives_opt = 0; | 4985 | nb_drives_opt = 0; |
4947 | nb_numa_nodes = 0; | 4986 | nb_numa_nodes = 0; |
@@ -5209,11 +5248,7 @@ int main(int argc, char **argv, char **envp) | @@ -5209,11 +5248,7 @@ int main(int argc, char **argv, char **envp) | ||
5209 | break; | 5248 | break; |
5210 | #endif | 5249 | #endif |
5211 | case QEMU_OPTION_bt: | 5250 | case QEMU_OPTION_bt: |
5212 | - if (nb_bt_opts >= MAX_BT_CMDLINE) { | ||
5213 | - fprintf(stderr, "qemu: too many bluetooth options\n"); | ||
5214 | - exit(1); | ||
5215 | - } | ||
5216 | - bt_opts[nb_bt_opts++] = optarg; | 5251 | + add_device_config(DEV_BT, optarg); |
5217 | break; | 5252 | break; |
5218 | #ifdef HAS_AUDIO | 5253 | #ifdef HAS_AUDIO |
5219 | case QEMU_OPTION_audio_help: | 5254 | case QEMU_OPTION_audio_help: |
@@ -5455,12 +5490,10 @@ int main(int argc, char **argv, char **envp) | @@ -5455,12 +5490,10 @@ int main(int argc, char **argv, char **envp) | ||
5455 | break; | 5490 | break; |
5456 | case QEMU_OPTION_usbdevice: | 5491 | case QEMU_OPTION_usbdevice: |
5457 | usb_enabled = 1; | 5492 | usb_enabled = 1; |
5458 | - if (usb_devices_index >= MAX_USB_CMDLINE) { | ||
5459 | - fprintf(stderr, "Too many USB devices\n"); | ||
5460 | - exit(1); | ||
5461 | - } | ||
5462 | - usb_devices[usb_devices_index] = optarg; | ||
5463 | - usb_devices_index++; | 5493 | + add_device_config(DEV_USB, optarg); |
5494 | + break; | ||
5495 | + case QEMU_OPTION_device: | ||
5496 | + add_device_config(DEV_GENERIC, optarg); | ||
5464 | break; | 5497 | break; |
5465 | case QEMU_OPTION_smp: | 5498 | case QEMU_OPTION_smp: |
5466 | smp_cpus = atoi(optarg); | 5499 | smp_cpus = atoi(optarg); |
@@ -5779,9 +5812,8 @@ int main(int argc, char **argv, char **envp) | @@ -5779,9 +5812,8 @@ int main(int argc, char **argv, char **envp) | ||
5779 | net_client_check(); | 5812 | net_client_check(); |
5780 | 5813 | ||
5781 | /* init the bluetooth world */ | 5814 | /* init the bluetooth world */ |
5782 | - for (i = 0; i < nb_bt_opts; i++) | ||
5783 | - if (bt_parse(bt_opts[i])) | ||
5784 | - exit(1); | 5815 | + if (foreach_device_config(DEV_BT, bt_parse)) |
5816 | + exit(1); | ||
5785 | 5817 | ||
5786 | /* init the memory */ | 5818 | /* init the memory */ |
5787 | if (ram_size == 0) | 5819 | if (ram_size == 0) |
@@ -5972,14 +6004,13 @@ int main(int argc, char **argv, char **envp) | @@ -5972,14 +6004,13 @@ int main(int argc, char **argv, char **envp) | ||
5972 | 6004 | ||
5973 | /* init USB devices */ | 6005 | /* init USB devices */ |
5974 | if (usb_enabled) { | 6006 | if (usb_enabled) { |
5975 | - for(i = 0; i < usb_devices_index; i++) { | ||
5976 | - if (usb_device_add(usb_devices[i], 0) < 0) { | ||
5977 | - fprintf(stderr, "Warning: could not add USB device %s\n", | ||
5978 | - usb_devices[i]); | ||
5979 | - } | ||
5980 | - } | 6007 | + foreach_device_config(DEV_USB, usb_parse); |
5981 | } | 6008 | } |
5982 | 6009 | ||
6010 | + /* init generic devices */ | ||
6011 | + if (foreach_device_config(DEV_GENERIC, generic_parse)) | ||
6012 | + exit(1); | ||
6013 | + | ||
5983 | if (!display_state) | 6014 | if (!display_state) |
5984 | dumb_display_init(); | 6015 | dumb_display_init(); |
5985 | /* just use the first displaystate for the moment */ | 6016 | /* just use the first displaystate for the moment */ |