[PATCH not-for-merge 5/5] qdev: Instrument to detect bus mismatch

Markus Armbruster posted 5 patches 5 years, 8 months ago
Maintainers: "Daniel P. Berrangé" <berrange@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>, Eduardo Habkost <ehabkost@redhat.com>
[PATCH not-for-merge 5/5] qdev: Instrument to detect bus mismatch
Posted by Markus Armbruster 5 years, 8 months ago
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 hw/core/qdev.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 9e5538aeae..936ef3988a 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -98,6 +98,23 @@ void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
 {
     BusState *old_parent_bus = dev->parent_bus;
 
+    DeviceClass *dc = DEVICE_GET_CLASS(dev);
+    if (bus) {
+        BusClass *bc;
+        for (bc = BUS_GET_CLASS(bus);
+             bc;
+             bc = (BusClass *)object_class_dynamic_cast(object_class_get_parent(OBJECT_CLASS(bc)), TYPE_BUS)) {
+            if (!g_strcmp0(dc->bus_type, object_class_get_name(OBJECT_CLASS(bc)))) {
+                break;
+            }
+        }
+        if (!bc) {
+            printf("### bus mismatch %s is %s plugged into %s\n",
+                   object_get_typename(OBJECT(dev)), dc->bus_type,
+                   object_class_get_name(OBJECT_CLASS(BUS_GET_CLASS(bus))));
+        }
+    }
+
     if (old_parent_bus) {
         trace_qdev_update_parent_bus(dev, object_get_typename(OBJECT(dev)),
             old_parent_bus, object_get_typename(OBJECT(old_parent_bus)),
-- 
2.21.1