]> www.infradead.org Git - users/dwmw2/qemu.git/commitdiff
qdev: remove baked in notion of aliases (v2)
authorAnthony Liguori <aliguori@us.ibm.com>
Thu, 22 Dec 2011 17:05:00 +0000 (11:05 -0600)
committerAnthony Liguori <aliguori@us.ibm.com>
Fri, 3 Feb 2012 16:41:07 +0000 (10:41 -0600)
Limit them to the device_add functionality.  Device aliases were a hack based
on the fact that virtio was modeled the wrong way.  The mechanism for aliasing
is very limited in that only one alias can exist for any device.

We have to support it for the purposes of compatibility but we only need to
support it in device_add so restrict it to that piece of code.

Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
---
v1 -> v2
 - Use a table for aliases (Paolo)

hw/ide/ich.c
hw/lsi53c895a.c
hw/qdev.c
hw/qdev.h
hw/s390-virtio-bus.c
hw/virtio-pci.c

index 0e819f6bd1e2a8efb00bbbca643cf8b847d05aa2..5cdaa990ea17cf781fcb51beed67cecbac2d3d84 100644 (file)
@@ -158,7 +158,6 @@ static void ich_ahci_class_init(ObjectClass *klass, void *data)
     k->device_id = PCI_DEVICE_ID_INTEL_82801IR;
     k->revision = 0x02;
     k->class_id = PCI_CLASS_STORAGE_SATA;
-    dc->alias = "ahci";
     dc->vmsd = &vmstate_ahci;
 }
 
@@ -172,6 +171,5 @@ static TypeInfo ich_ahci_info = {
 static void ich_ahci_register(void)
 {
     type_register_static(&ich_ahci_info);
-    type_register_static_alias(&ich_ahci_info, "ahci");
 }
 device_init(ich_ahci_register);
index 638332e1882ea4ab574e0e736007a34cd8faa3f6..9a7ffe3f42391fffd5cb0addb7a8a73a1d75dc14 100644 (file)
@@ -2131,7 +2131,6 @@ static void lsi_class_init(ObjectClass *klass, void *data)
     k->device_id = PCI_DEVICE_ID_LSI_53C895A;
     k->class_id = PCI_CLASS_STORAGE_SCSI;
     k->subsystem_id = 0x1000;
-    dc->alias = "lsi";
     dc->reset = lsi_scsi_reset;
     dc->vmsd = &vmstate_lsi_scsi;
 }
@@ -2146,7 +2145,6 @@ static TypeInfo lsi_info = {
 static void lsi53c895a_register_devices(void)
 {
     type_register_static(&lsi_info);
-    type_register_static_alias(&lsi_info, "lsi");
 }
 
 device_init(lsi53c895a_register_devices);
index 4f6c3a713a098c3bf9a5655793dbc9002b36cbf2..5830befbc6cf139032a291221fd1922f8772861f 100644 (file)
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -61,14 +61,56 @@ Property *qdev_get_props(DeviceState *dev)
     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));
@@ -161,8 +203,8 @@ static void qdev_print_devinfo(ObjectClass *klass, void *opaque)
     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);
@@ -188,6 +230,19 @@ static int set_property(const char *name, const char *value, void *opaque)
     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;
@@ -207,6 +262,15 @@ int qdev_device_help(QemuOpts *opts)
     }
 
     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;
     }
@@ -263,6 +327,7 @@ static DeviceState *qdev_get_peripheral_anon(void)
 
 DeviceState *qdev_device_add(QemuOpts *opts)
 {
+    ObjectClass *obj;
     DeviceClass *k;
     const char *driver, *path, *id;
     DeviceState *qdev;
@@ -275,7 +340,22 @@ DeviceState *qdev_device_add(QemuOpts *opts)
     }
 
     /* 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");
@@ -753,7 +833,8 @@ static DeviceState *qbus_find_dev(BusState *bus, char *elem)
     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;
         }
     }
index b56747e773efe8deed4dd33436c51281edc49fca..102c5fa4fc5fbd722e4789dba985a1e355dc0611 100644 (file)
--- a/hw/qdev.h
+++ b/hw/qdev.h
@@ -78,7 +78,6 @@ typedef struct DeviceClass {
     ObjectClass parent_class;
 
     const char *fw_name;
-    const char *alias;
     const char *desc;
     Property *props;
     int no_user;
index 4e1e888433d2a56c30c2739b44efa1dbeff0535d..b66ef68bc2d00304a366b108b9940a1903810da0 100644 (file)
@@ -354,7 +354,6 @@ static void s390_virtio_net_class_init(ObjectClass *klass, void *data)
 
     k->init = s390_virtio_net_init;
     dc->props = s390_virtio_net_properties;
-    dc->alias = "virtio-net";
 }
 
 static TypeInfo s390_virtio_net = {
@@ -377,7 +376,6 @@ static void s390_virtio_blk_class_init(ObjectClass *klass, void *data)
 
     k->init = s390_virtio_blk_init;
     dc->props = s390_virtio_blk_properties;
-    dc->alias = "virtio-blk";
 }
 
 static TypeInfo s390_virtio_blk = {
@@ -400,7 +398,6 @@ static void s390_virtio_serial_class_init(ObjectClass *klass, void *data)
 
     k->init = s390_virtio_serial_init;
     dc->props = s390_virtio_serial_properties;
-    dc->alias = "virtio-serial";
 }
 
 static TypeInfo s390_virtio_serial = {
index bc965520723ec53d03704907ed6bb1cffe877c35..93fff5478238291bccd3d514ecfe5188fc43fe5b 100644 (file)
@@ -827,7 +827,6 @@ static void virtio_blk_class_init(ObjectClass *klass, void *data)
     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;
 }
@@ -862,7 +861,6 @@ static void virtio_net_class_init(ObjectClass *klass, void *data)
     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;
 }
@@ -894,7 +892,6 @@ static void virtio_serial_class_init(ObjectClass *klass, void *data)
     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;
 }
@@ -922,7 +919,6 @@ static void virtio_balloon_class_init(ObjectClass *klass, void *data)
     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;
 }
@@ -937,13 +933,9 @@ static TypeInfo virtio_balloon_info = {
 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)