return dc->props;
}
+/*
+ * Aliases were a bad idea from the start. Let's keep them
+ * from spreading further.
+ */
+typedef struct QDevAlias
+{
+ const char *typename;
+ const char *alias;
+} QDevAlias;
+
+static const QDevAlias qdev_alias_table[] = {
+ { "virtio-blk-pci", "virtio-blk" },
+ { "virtio-net-pci", "virtio-net" },
+ { "virtio-serial-pci", "virtio-serial" },
+ { "virtio-balloon-pci", "virtio-balloon" },
+ { "virtio-blk-s390", "virtio-blk" },
+ { "virtio-net-s390", "virtio-net" },
+ { "virtio-serial-s390", "virtio-serial" },
+ { "lsi53c895a", "lsi" },
+ { "ich9-ahci", "ahci" },
+ { }
+};
+
+static const char *qdev_class_get_alias(DeviceClass *dc)
+{
+ const char *typename = object_class_get_name(OBJECT_CLASS(dc));
+ int i;
+
+ for (i = 0; qdev_alias_table[i].typename; i++) {
+ if (strcmp(qdev_alias_table[i].typename, typename) == 0) {
+ return qdev_alias_table[i].alias;
+ }
+ }
+
+ return NULL;
+}
+
+static bool qdev_class_has_alias(DeviceClass *dc)
+{
+ return (qdev_class_get_alias(dc) != NULL);
+}
+
const char *qdev_fw_name(DeviceState *dev)
{
DeviceClass *dc = DEVICE_GET_CLASS(dev);
if (dc->fw_name) {
return dc->fw_name;
- } else if (dc->alias) {
- return dc->alias;
+ } else if (qdev_class_has_alias(dc)) {
+ return qdev_class_get_alias(dc);
}
return object_get_typename(OBJECT(dev));
if (dc->bus_info) {
error_printf(", bus %s", dc->bus_info->name);
}
- if (dc->alias) {
- error_printf(", alias \"%s\"", dc->alias);
+ if (qdev_class_has_alias(dc)) {
+ error_printf(", alias \"%s\"", qdev_class_get_alias(dc));
}
if (dc->desc) {
error_printf(", desc \"%s\"", dc->desc);
return 0;
}
+static const char *find_typename_by_alias(const char *alias)
+{
+ int i;
+
+ for (i = 0; qdev_alias_table[i].alias; i++) {
+ if (strcmp(qdev_alias_table[i].alias, alias) == 0) {
+ return qdev_alias_table[i].typename;
+ }
+ }
+
+ return NULL;
+}
+
int qdev_device_help(QemuOpts *opts)
{
const char *driver;
}
klass = object_class_by_name(driver);
+ if (!klass) {
+ const char *typename = find_typename_by_alias(driver);
+
+ if (typename) {
+ driver = typename;
+ klass = object_class_by_name(driver);
+ }
+ }
+
if (!klass) {
return 0;
}
DeviceState *qdev_device_add(QemuOpts *opts)
{
+ ObjectClass *obj;
DeviceClass *k;
const char *driver, *path, *id;
DeviceState *qdev;
}
/* find driver */
- k = DEVICE_CLASS(object_class_by_name(driver));
+ obj = object_class_by_name(driver);
+ if (!obj) {
+ const char *typename = find_typename_by_alias(driver);
+
+ if (typename) {
+ driver = typename;
+ obj = object_class_by_name(driver);
+ }
+ }
+
+ if (!obj) {
+ qerror_report(QERR_INVALID_PARAMETER_VALUE, "driver", "device type");
+ return NULL;
+ }
+
+ k = DEVICE_CLASS(obj);
/* find bus */
path = qemu_opt_get(opts, "bus");
QTAILQ_FOREACH(dev, &bus->children, sibling) {
DeviceClass *dc = DEVICE_GET_CLASS(dev);
- if (dc->alias && strcmp(dc->alias, elem) == 0) {
+ if (qdev_class_has_alias(dc) &&
+ strcmp(qdev_class_get_alias(dc), elem) == 0) {
return dev;
}
}
k->device_id = PCI_DEVICE_ID_VIRTIO_BLOCK;
k->revision = VIRTIO_PCI_ABI_VERSION;
k->class_id = PCI_CLASS_STORAGE_SCSI;
- dc->alias = "virtio-blk";
dc->reset = virtio_pci_reset;
dc->props = virtio_blk_properties;
}
k->device_id = PCI_DEVICE_ID_VIRTIO_NET;
k->revision = VIRTIO_PCI_ABI_VERSION;
k->class_id = PCI_CLASS_NETWORK_ETHERNET;
- dc->alias = "virtio-net";
dc->reset = virtio_pci_reset;
dc->props = virtio_net_properties;
}
k->device_id = PCI_DEVICE_ID_VIRTIO_CONSOLE;
k->revision = VIRTIO_PCI_ABI_VERSION;
k->class_id = PCI_CLASS_COMMUNICATION_OTHER;
- dc->alias = "virtio-serial";
dc->reset = virtio_pci_reset;
dc->props = virtio_serial_properties;
}
k->device_id = PCI_DEVICE_ID_VIRTIO_BALLOON;
k->revision = VIRTIO_PCI_ABI_VERSION;
k->class_id = PCI_CLASS_MEMORY_RAM;
- dc->alias = "virtio-balloon";
dc->reset = virtio_pci_reset;
dc->props = virtio_balloon_properties;
}
static void virtio_pci_register_devices(void)
{
type_register_static(&virtio_blk_info);
- type_register_static_alias(&virtio_blk_info, "virtio-blk");
type_register_static(&virtio_net_info);
- type_register_static_alias(&virtio_net_info, "virtio-net");
type_register_static(&virtio_serial_info);
- type_register_static_alias(&virtio_serial_info, "virtio-serial");
type_register_static(&virtio_balloon_info);
- type_register_static_alias(&virtio_balloon_info, "virtio-balloon");
}
device_init(virtio_pci_register_devices)