From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:37993) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SgcV0-0001iO-Ry for qemu-devel@nongnu.org; Mon, 18 Jun 2012 10:00:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SgcUd-0003Ye-U4 for qemu-devel@nongnu.org; Mon, 18 Jun 2012 10:00:10 -0400 Received: from cantor2.suse.de ([195.135.220.15]:53271 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SgcUd-0003YU-7O for qemu-devel@nongnu.org; Mon, 18 Jun 2012 09:59:47 -0400 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Mon, 18 Jun 2012 15:59:09 +0200 Message-Id: <1340027954-19045-18-git-send-email-afaerber@suse.de> In-Reply-To: <1340027954-19045-1-git-send-email-afaerber@suse.de> References: <1340027954-19045-1-git-send-email-afaerber@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH 17/22] qdev: Convert busses to QEMU Object Model List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , Anthony Liguori , "Michael S. Tsirkin" , Alexander Graf , Gerd Hoffmann , Anthony Liguori , Amit Shah , Paolo Bonzini , =?UTF-8?q?Andreas=20F=C3=A4rber?= From: Anthony Liguori This is far less interesting than it sounds. We simply add an Object to = each BusState and then register the types appropriately. Most of the interest= ing refactoring will follow in the next patches. Since we're changing fundamental type names (BusInfo -> BusClass), it all= needs to convert at once. Fortunately, not a lot of code is affected. Signed-off-by: Anthony Liguori Signed-off-by: Paolo Bonzini [AF: Made all new bus TypeInfos static const.] [AF: Made qbus_free() call object_delete(), required {qom,glib}_allocated= ] Signed-off-by: Andreas F=C3=A4rber --- hw/i2c.c | 15 ++++++--- hw/ide/internal.h | 3 ++ hw/ide/qdev.c | 21 ++++++++--- hw/intel-hda.c | 12 ++++--- hw/intel-hda.h | 3 ++ hw/isa-bus.c | 23 +++++++++---- hw/isa.h | 3 ++ hw/pci-hotplug.c | 6 +--- hw/pci.c | 29 +++++++++++------ hw/pci_bridge.c | 2 +- hw/pci_internals.h | 3 +- hw/qdev-monitor.c | 33 ++++++++++++------- hw/qdev.c | 73 +++++++++++++++++++++++++++++------= ----- hw/qdev.h | 46 ++++++++++++++----------- hw/s390-virtio-bus.c | 12 ++++--- hw/s390-virtio-bus.h | 4 ++ hw/scsi-bus.c | 23 +++++++++---- hw/scsi.h | 3 ++ hw/spapr_vio.c | 12 ++++--- hw/spapr_vio.h | 3 ++ hw/ssi.c | 15 ++++++--- hw/sysbus.c | 27 ++++++++++----- hw/sysbus.h | 3 ++ hw/usb.h | 3 ++ hw/usb/bus.c | 25 +++++++++---- hw/usb/dev-smartcard-reader.c | 15 ++++++--- hw/virtio-serial-bus.c | 24 ++++++++++--- 27 files changed, 299 insertions(+), 142 deletions(-) diff --git a/hw/i2c.c b/hw/i2c.c index af5979e..319b249 100644 --- a/hw/i2c.c +++ b/hw/i2c.c @@ -22,9 +22,13 @@ static Property i2c_props[] =3D { DEFINE_PROP_END_OF_LIST(), }; =20 -static struct BusInfo i2c_bus_info =3D { - .name =3D "I2C", - .size =3D sizeof(i2c_bus), +#define TYPE_I2C_BUS "i2c-bus" +#define I2C_BUS(obj) OBJECT_CHECK(i2c_bus, (obj), TYPE_I2C_BUS) + +static const TypeInfo i2c_bus_info =3D { + .name =3D TYPE_I2C_BUS, + .parent =3D TYPE_BUS, + .instance_size =3D sizeof(i2c_bus), }; =20 static void i2c_bus_pre_save(void *opaque) @@ -62,7 +66,7 @@ i2c_bus *i2c_init_bus(DeviceState *parent, const char *= name) { i2c_bus *bus; =20 - bus =3D FROM_QBUS(i2c_bus, qbus_create(&i2c_bus_info, parent, name))= ; + bus =3D FROM_QBUS(i2c_bus, qbus_create(TYPE_I2C_BUS, parent, name)); vmstate_register(NULL, -1, &vmstate_i2c_bus, bus); return bus; } @@ -219,7 +223,7 @@ static void i2c_slave_class_init(ObjectClass *klass, = void *data) { DeviceClass *k =3D DEVICE_CLASS(klass); k->init =3D i2c_slave_qdev_init; - k->bus_info =3D &i2c_bus_info; + k->bus_type =3D TYPE_I2C_BUS; k->props =3D i2c_props; } =20 @@ -234,6 +238,7 @@ static TypeInfo i2c_slave_type_info =3D { =20 static void i2c_slave_register_types(void) { + type_register_static(&i2c_bus_info); type_register_static(&i2c_slave_type_info); } =20 diff --git a/hw/ide/internal.h b/hw/ide/internal.h index f8a027d..1a02f57 100644 --- a/hw/ide/internal.h +++ b/hw/ide/internal.h @@ -25,6 +25,9 @@ typedef struct IDEState IDEState; typedef struct IDEDMA IDEDMA; typedef struct IDEDMAOps IDEDMAOps; =20 +#define TYPE_IDE_BUS "IDE" +#define IDE_BUS(obj) OBJECT_CHECK(IDEBus, (obj), TYPE_IDE_BUS) + /* Bits of HD_STATUS */ #define ERR_STAT 0x01 #define INDEX_STAT 0x02 diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c index a91e878..c122395 100644 --- a/hw/ide/qdev.c +++ b/hw/ide/qdev.c @@ -32,15 +32,23 @@ static Property ide_props[] =3D { DEFINE_PROP_END_OF_LIST(), }; =20 -static struct BusInfo ide_bus_info =3D { - .name =3D "IDE", - .size =3D sizeof(IDEBus), - .get_fw_dev_path =3D idebus_get_fw_dev_path, +static void ide_bus_class_init(ObjectClass *klass, void *data) +{ + BusClass *k =3D BUS_CLASS(klass); + + k->get_fw_dev_path =3D idebus_get_fw_dev_path; +} + +static const TypeInfo ide_bus_info =3D { + .name =3D TYPE_IDE_BUS, + .parent =3D TYPE_BUS, + .instance_size =3D sizeof(IDEBus), + .class_init =3D ide_bus_class_init, }; =20 void ide_bus_new(IDEBus *idebus, DeviceState *dev, int bus_id) { - qbus_create_inplace(&idebus->qbus, &ide_bus_info, dev, NULL); + qbus_create_inplace(&idebus->qbus, TYPE_IDE_BUS, dev, NULL); idebus->bus_id =3D bus_id; } =20 @@ -249,7 +257,7 @@ static void ide_device_class_init(ObjectClass *klass,= void *data) { DeviceClass *k =3D DEVICE_CLASS(klass); k->init =3D ide_qdev_init; - k->bus_info =3D &ide_bus_info; + k->bus_type =3D TYPE_IDE_BUS; k->props =3D ide_props; } =20 @@ -264,6 +272,7 @@ static TypeInfo ide_device_type_info =3D { =20 static void ide_register_types(void) { + type_register_static(&ide_bus_info); type_register_static(&ide_hd_info); type_register_static(&ide_cd_info); type_register_static(&ide_drive_info); diff --git a/hw/intel-hda.c b/hw/intel-hda.c index e2bd41e..e343096 100644 --- a/hw/intel-hda.c +++ b/hw/intel-hda.c @@ -34,16 +34,17 @@ static Property hda_props[] =3D { DEFINE_PROP_END_OF_LIST() }; =20 -static struct BusInfo hda_codec_bus_info =3D { - .name =3D "HDA", - .size =3D sizeof(HDACodecBus), +static const TypeInfo hda_codec_bus_info =3D { + .name =3D TYPE_HDA_BUS, + .parent =3D TYPE_BUS, + .instance_size =3D sizeof(HDACodecBus), }; =20 void hda_codec_bus_init(DeviceState *dev, HDACodecBus *bus, hda_codec_response_func response, hda_codec_xfer_func xfer) { - qbus_create_inplace(&bus->qbus, &hda_codec_bus_info, dev, NULL); + qbus_create_inplace(&bus->qbus, TYPE_HDA_BUS, dev, NULL); bus->response =3D response; bus->xfer =3D xfer; } @@ -1276,7 +1277,7 @@ static void hda_codec_device_class_init(ObjectClass= *klass, void *data) DeviceClass *k =3D DEVICE_CLASS(klass); k->init =3D hda_codec_dev_init; k->exit =3D hda_codec_dev_exit; - k->bus_info =3D &hda_codec_bus_info; + k->bus_type =3D TYPE_HDA_BUS; k->props =3D hda_props; } =20 @@ -1291,6 +1292,7 @@ static TypeInfo hda_codec_device_type_info =3D { =20 static void intel_hda_register_types(void) { + type_register_static(&hda_codec_bus_info); type_register_static(&intel_hda_info); type_register_static(&hda_codec_device_type_info); } diff --git a/hw/intel-hda.h b/hw/intel-hda.h index a1cca5b..22e0968 100644 --- a/hw/intel-hda.h +++ b/hw/intel-hda.h @@ -14,6 +14,9 @@ #define HDA_CODEC_DEVICE_GET_CLASS(obj) \ OBJECT_GET_CLASS(HDACodecDeviceClass, (obj), TYPE_HDA_CODEC_DEVICE) =20 +#define TYPE_HDA_BUS "HDA" +#define HDA_BUS(obj) OBJECT_CHECK(HDACodecBus, (obj), TYPE_HDA_BUS) + typedef struct HDACodecBus HDACodecBus; typedef struct HDACodecDevice HDACodecDevice; =20 diff --git a/hw/isa-bus.c b/hw/isa-bus.c index 5a43f03..f9b2373 100644 --- a/hw/isa-bus.c +++ b/hw/isa-bus.c @@ -28,11 +28,19 @@ target_phys_addr_t isa_mem_base =3D 0; static void isabus_dev_print(Monitor *mon, DeviceState *dev, int indent)= ; static char *isabus_get_fw_dev_path(DeviceState *dev); =20 -static struct BusInfo isa_bus_info =3D { - .name =3D "ISA", - .size =3D sizeof(ISABus), - .print_dev =3D isabus_dev_print, - .get_fw_dev_path =3D isabus_get_fw_dev_path, +static void isa_bus_class_init(ObjectClass *klass, void *data) +{ + BusClass *k =3D BUS_CLASS(klass); + + k->print_dev =3D isabus_dev_print; + k->get_fw_dev_path =3D isabus_get_fw_dev_path; +} + +static const TypeInfo isa_bus_info =3D { + .name =3D TYPE_ISA_BUS, + .parent =3D TYPE_BUS, + .instance_size =3D sizeof(ISABus), + .class_init =3D isa_bus_class_init, }; =20 ISABus *isa_bus_new(DeviceState *dev, MemoryRegion *address_space_io) @@ -46,7 +54,7 @@ ISABus *isa_bus_new(DeviceState *dev, MemoryRegion *add= ress_space_io) qdev_init_nofail(dev); } =20 - isabus =3D FROM_QBUS(ISABus, qbus_create(&isa_bus_info, dev, NULL)); + isabus =3D FROM_QBUS(ISABus, qbus_create(TYPE_ISA_BUS, dev, NULL)); isabus->address_space_io =3D address_space_io; return isabus; } @@ -198,7 +206,7 @@ static void isa_device_class_init(ObjectClass *klass,= void *data) { DeviceClass *k =3D DEVICE_CLASS(klass); k->init =3D isa_qdev_init; - k->bus_info =3D &isa_bus_info; + k->bus_type =3D TYPE_ISA_BUS; } =20 static TypeInfo isa_device_type_info =3D { @@ -212,6 +220,7 @@ static TypeInfo isa_device_type_info =3D { =20 static void isabus_register_types(void) { + type_register_static(&isa_bus_info); type_register_static(&isabus_bridge_info); type_register_static(&isa_device_type_info); } diff --git a/hw/isa.h b/hw/isa.h index f7bc4b5..f7ddf23 100644 --- a/hw/isa.h +++ b/hw/isa.h @@ -19,6 +19,9 @@ typedef struct ISADevice ISADevice; #define ISA_DEVICE_GET_CLASS(obj) \ OBJECT_GET_CLASS(ISADeviceClass, (obj), TYPE_ISA_DEVICE) =20 +#define TYPE_ISA_BUS "ISA" +#define ISA_BUS(obj) OBJECT_CHECK(ISABus, (obj), TYPE_ISA_BUS) + typedef struct ISADeviceClass { DeviceClass parent_class; int (*init)(ISADevice *dev); diff --git a/hw/pci-hotplug.c b/hw/pci-hotplug.c index 61257f4..e7fb780 100644 --- a/hw/pci-hotplug.c +++ b/hw/pci-hotplug.c @@ -80,11 +80,7 @@ static int scsi_hot_add(Monitor *mon, DeviceState *ada= pter, SCSIBus *scsibus; SCSIDevice *scsidev; =20 - scsibus =3D DO_UPCAST(SCSIBus, qbus, QLIST_FIRST(&adapter->child_bus= )); - if (!scsibus || strcmp(scsibus->qbus.info->name, "SCSI") !=3D 0) { - error_report("Device is not a SCSI adapter"); - return -1; - } + scsibus =3D SCSI_BUS(QLIST_FIRST(&adapter->child_bus)); =20 /* * drive_init() tries to find a default for dinfo->unit. Doesn't diff --git a/hw/pci.c b/hw/pci.c index 09ce4e7..d6ce9a5 100644 --- a/hw/pci.c +++ b/hw/pci.c @@ -55,13 +55,21 @@ static Property pci_props[] =3D { DEFINE_PROP_END_OF_LIST() }; =20 -struct BusInfo pci_bus_info =3D { - .name =3D "PCI", - .size =3D sizeof(PCIBus), - .print_dev =3D pcibus_dev_print, - .get_dev_path =3D pcibus_get_dev_path, - .get_fw_dev_path =3D pcibus_get_fw_dev_path, - .reset =3D pcibus_reset, +static void pci_bus_class_init(ObjectClass *klass, void *data) +{ + BusClass *k =3D BUS_CLASS(klass); + + k->print_dev =3D pcibus_dev_print; + k->get_dev_path =3D pcibus_get_dev_path; + k->get_fw_dev_path =3D pcibus_get_fw_dev_path; + k->reset =3D pcibus_reset; +} + +static const TypeInfo pci_bus_info =3D { + .name =3D TYPE_PCI_BUS, + .parent =3D TYPE_BUS, + .instance_size =3D sizeof(PCIBus), + .class_init =3D pci_bus_class_init, }; =20 static PCIBus *pci_find_bus_nr(PCIBus *bus, int bus_num); @@ -266,7 +274,7 @@ void pci_bus_new_inplace(PCIBus *bus, DeviceState *pa= rent, MemoryRegion *address_space_io, uint8_t devfn_min) { - qbus_create_inplace(&bus->qbus, &pci_bus_info, parent, name); + qbus_create_inplace(&bus->qbus, TYPE_PCI_BUS, parent, name); assert(PCI_FUNC(devfn_min) =3D=3D 0); bus->devfn_min =3D devfn_min; bus->address_space_mem =3D address_space_mem; @@ -287,7 +295,7 @@ PCIBus *pci_bus_new(DeviceState *parent, const char *= name, PCIBus *bus; =20 bus =3D g_malloc0(sizeof(*bus)); - bus->qbus.qdev_allocated =3D 1; + bus->qbus.glib_allocated =3D true; pci_bus_new_inplace(bus, parent, name, address_space_mem, address_space_io, devfn_min); return bus; @@ -2001,7 +2009,7 @@ static void pci_device_class_init(ObjectClass *klas= s, void *data) k->init =3D pci_qdev_init; k->unplug =3D pci_unplug_device; k->exit =3D pci_unregister_device; - k->bus_info =3D &pci_bus_info; + k->bus_type =3D TYPE_PCI_BUS; k->props =3D pci_props; } =20 @@ -2016,6 +2024,7 @@ static TypeInfo pci_device_type_info =3D { =20 static void pci_register_types(void) { + type_register_static(&pci_bus_info); type_register_static(&pci_device_type_info); } =20 diff --git a/hw/pci_bridge.c b/hw/pci_bridge.c index 866f0b6..253e034 100644 --- a/hw/pci_bridge.c +++ b/hw/pci_bridge.c @@ -324,7 +324,7 @@ int pci_bridge_initfn(PCIDevice *dev) br->bus_name =3D dev->qdev.id; } =20 - qbus_create_inplace(&sec_bus->qbus, &pci_bus_info, &dev->qdev, + qbus_create_inplace(&sec_bus->qbus, TYPE_PCI_BUS, &dev->qdev, br->bus_name); sec_bus->parent_dev =3D dev; sec_bus->map_irq =3D br->map_irq; diff --git a/hw/pci_internals.h b/hw/pci_internals.h index 96690b7..399c6d4 100644 --- a/hw/pci_internals.h +++ b/hw/pci_internals.h @@ -12,7 +12,8 @@ * Use accessor function in pci.h, pci_bridge.h */ =20 -extern struct BusInfo pci_bus_info; +#define TYPE_PCI_BUS "PCI" +#define PCI_BUS(obj) OBJECT_CHECK(PCIBus, (obj), TYPE_PCI_BUS) =20 struct PCIBus { BusState qbus; diff --git a/hw/qdev-monitor.c b/hw/qdev-monitor.c index 390d467..691b864 100644 --- a/hw/qdev-monitor.c +++ b/hw/qdev-monitor.c @@ -75,8 +75,8 @@ static void qdev_print_devinfo(ObjectClass *klass, void= *opaque) } =20 error_printf("name \"%s\"", object_class_get_name(klass)); - if (dc->bus_info) { - error_printf(", bus %s", dc->bus_info->name); + if (dc->bus_type) { + error_printf(", bus %s", dc->bus_type); } if (qdev_class_has_alias(dc)) { error_printf(", alias \"%s\"", qdev_class_get_alias(dc)); @@ -262,7 +262,7 @@ static DeviceState *qbus_find_dev(BusState *bus, char= *elem) } =20 static BusState *qbus_find_recursive(BusState *bus, const char *name, - const BusInfo *info) + const char *bus_typename) { DeviceState *dev; BusState *child, *ret; @@ -271,7 +271,8 @@ static BusState *qbus_find_recursive(BusState *bus, c= onst char *name, if (name && (strcmp(bus->name, name) !=3D 0)) { match =3D 0; } - if (info && (bus->info !=3D info)) { + if (bus_typename && + (strcmp(object_get_typename(OBJECT(bus)), bus_typename) !=3D 0))= { match =3D 0; } if (match) { @@ -280,7 +281,7 @@ static BusState *qbus_find_recursive(BusState *bus, c= onst char *name, =20 QTAILQ_FOREACH(dev, &bus->children, sibling) { QLIST_FOREACH(child, &dev->child_bus, sibling) { - ret =3D qbus_find_recursive(child, name, info); + ret =3D qbus_find_recursive(child, name, bus_typename); if (ret) { return ret; } @@ -415,16 +416,16 @@ DeviceState *qdev_device_add(QemuOpts *opts) if (!bus) { return NULL; } - if (bus->info !=3D k->bus_info) { + if (strcmp(object_get_typename(OBJECT(bus)), k->bus_type) !=3D 0= ) { qerror_report(QERR_BAD_BUS_FOR_DEVICE, - driver, bus->info->name); + driver, object_get_typename(OBJECT(bus))); return NULL; } } else { - bus =3D qbus_find_recursive(sysbus_get_default(), NULL, k->bus_i= nfo); + bus =3D qbus_find_recursive(sysbus_get_default(), NULL, k->bus_t= ype); if (!bus) { qerror_report(QERR_NO_BUS_FOR_DEVICE, - driver, k->bus_info->name); + driver, k->bus_type); return NULL; } } @@ -497,6 +498,15 @@ static void qdev_print_props(Monitor *mon, DeviceSta= te *dev, Property *props, } } =20 +static void bus_print_dev(BusState *bus, Monitor *mon, DeviceState *dev,= int indent) +{ + BusClass *bc =3D BUS_GET_CLASS(bus); + + if (bc->print_dev) { + bc->print_dev(mon, dev, indent); + } +} + static void qdev_print(Monitor *mon, DeviceState *dev, int indent) { ObjectClass *class; @@ -515,8 +525,7 @@ static void qdev_print(Monitor *mon, DeviceState *dev= , int indent) qdev_print_props(mon, dev, DEVICE_CLASS(class)->props, indent); class =3D object_class_get_parent(class); } while (class !=3D object_class_by_name(TYPE_DEVICE)); - if (dev->parent_bus->info->print_dev) - dev->parent_bus->info->print_dev(mon, dev, indent); + bus_print_dev(dev->parent_bus, mon, dev, indent + 2); QLIST_FOREACH(child, &dev->child_bus, sibling) { qbus_print(mon, child, indent); } @@ -528,7 +537,7 @@ static void qbus_print(Monitor *mon, BusState *bus, i= nt indent) =20 qdev_printf("bus: %s\n", bus->name); indent +=3D 2; - qdev_printf("type %s\n", bus->info->name); + qdev_printf("type %s\n", object_get_typename(OBJECT(bus))); QTAILQ_FOREACH(dev, &bus->children, sibling) { qdev_print(mon, dev, indent); } diff --git a/hw/qdev.c b/hw/qdev.c index 7816a37..63012b5 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -81,7 +81,7 @@ DeviceState *qdev_create(BusState *bus, const char *nam= e) if (!dev) { if (bus) { hw_error("Unknown device '%s' for bus '%s'\n", name, - bus->info->name); + object_get_typename(OBJECT(bus))); } else { hw_error("Unknown device '%s' for default sysbus\n", name); } @@ -186,8 +186,9 @@ static int qdev_reset_one(DeviceState *dev, void *opa= que) =20 static int qbus_reset_one(BusState *bus, void *opaque) { - if (bus->info->reset) { - return bus->info->reset(bus); + BusClass *bc =3D BUS_GET_CLASS(bus); + if (bc->reset) { + return bc->reset(bus); } return 0; } @@ -370,13 +371,13 @@ DeviceState *qdev_find_recursive(BusState *bus, con= st char *id) return NULL; } =20 -void qbus_create_inplace(BusState *bus, BusInfo *info, - DeviceState *parent, const char *name) +/* FIXME move this logic into instance_init */ +static void do_qbus_create_inplace(BusState *bus, const char *typename, + DeviceState *parent, const char *name= ) { char *buf; int i,len; =20 - bus->info =3D info; bus->parent =3D parent; =20 if (name) { @@ -390,9 +391,9 @@ void qbus_create_inplace(BusState *bus, BusInfo *info= , bus->name =3D buf; } else { /* no id -> use lowercase bus type for bus name */ - len =3D strlen(info->name) + 16; + len =3D strlen(typename) + 16; buf =3D g_malloc(len); - len =3D snprintf(buf, len, "%s.%d", info->name, + len =3D snprintf(buf, len, "%s.%d", typename, parent ? parent->num_child_bus : 0); for (i =3D 0; i < len; i++) buf[i] =3D qemu_tolower(buf[i]); @@ -410,13 +411,20 @@ void qbus_create_inplace(BusState *bus, BusInfo *in= fo, } } =20 -BusState *qbus_create(BusInfo *info, DeviceState *parent, const char *na= me) +void qbus_create_inplace(BusState *bus, const char *typename, + DeviceState *parent, const char *name) +{ + object_initialize(bus, typename); + do_qbus_create_inplace(bus, typename, parent, name); +} + +BusState *qbus_create(const char *typename, DeviceState *parent, const c= har *name) { BusState *bus; =20 - bus =3D g_malloc0(info->size); - bus->qdev_allocated =3D 1; - qbus_create_inplace(bus, info, parent, name); + bus =3D BUS(object_new(typename)); + bus->qom_allocated =3D true; + do_qbus_create_inplace(bus, typename, parent, name); return bus; } =20 @@ -435,9 +443,25 @@ void qbus_free(BusState *bus) qemu_unregister_reset(qbus_reset_all_fn, bus); } g_free((void*)bus->name); - if (bus->qdev_allocated) { - g_free(bus); + if (bus->qom_allocated) { + object_delete(OBJECT(bus)); + } else { + object_finalize(OBJECT(bus)); + if (bus->glib_allocated) { + g_free(bus); + } + } +} + +static char *bus_get_fw_dev_path(BusState *bus, DeviceState *dev) +{ + BusClass *bc =3D BUS_GET_CLASS(bus); + + if (bc->get_fw_dev_path) { + return bc->get_fw_dev_path(dev); } + + return NULL; } =20 static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int si= ze) @@ -447,8 +471,8 @@ static int qdev_get_fw_dev_path_helper(DeviceState *d= ev, char *p, int size) if (dev && dev->parent_bus) { char *d; l =3D qdev_get_fw_dev_path_helper(dev->parent_bus->parent, p, si= ze); - if (dev->parent_bus->info->get_fw_dev_path) { - d =3D dev->parent_bus->info->get_fw_dev_path(dev); + d =3D bus_get_fw_dev_path(dev->parent_bus, dev); + if (d) { l +=3D snprintf(p + l, size - l, "%s", d); g_free(d); } else { @@ -474,15 +498,15 @@ char* qdev_get_fw_dev_path(DeviceState *dev) =20 char *qdev_get_dev_path(DeviceState *dev) { - BusInfo *businfo; + BusClass *bc; =20 if (!dev || !dev->parent_bus) { return NULL; } =20 - businfo =3D dev->parent_bus->info; - if (businfo->get_dev_path) { - return businfo->get_dev_path(dev); + bc =3D BUS_GET_CLASS(dev->parent_bus); + if (bc->get_dev_path) { + return bc->get_dev_path(dev); } =20 return NULL; @@ -700,8 +724,17 @@ static TypeInfo device_type_info =3D { .class_size =3D sizeof(DeviceClass), }; =20 +static const TypeInfo bus_info =3D { + .name =3D TYPE_BUS, + .parent =3D TYPE_OBJECT, + .instance_size =3D sizeof(BusState), + .abstract =3D true, + .class_size =3D sizeof(BusClass), +}; + static void qdev_register_types(void) { + type_register_static(&bus_info); type_register_static(&device_type_info); } =20 diff --git a/hw/qdev.h b/hw/qdev.h index 013ccf2..736271e 100644 --- a/hw/qdev.h +++ b/hw/qdev.h @@ -17,7 +17,7 @@ typedef struct CompatProperty CompatProperty; =20 typedef struct BusState BusState; =20 -typedef struct BusInfo BusInfo; +typedef struct BusClass BusClass; =20 enum DevState { DEV_STATE_CREATED =3D 1, @@ -55,7 +55,7 @@ typedef struct DeviceClass { qdev_initfn init; qdev_event unplug; qdev_event exit; - BusInfo *bus_info; + const char *bus_type; } DeviceClass; =20 /* This structure should not be accessed directly. We declare it here @@ -79,31 +79,40 @@ struct DeviceState { int alias_required_for_version; }; =20 -typedef void (*bus_dev_printfn)(Monitor *mon, DeviceState *dev, int inde= nt); -typedef char *(*bus_get_dev_path)(DeviceState *dev); /* * This callback is used to create Open Firmware device path in accordan= ce with * OF spec http://forthworks.com/standards/of1275.pdf. Indicidual bus bi= ndings * can be found here http://playground.sun.com/1275/bindings/. */ -typedef char *(*bus_get_fw_dev_path)(DeviceState *dev); -typedef int (qbus_resetfn)(BusState *bus); =20 -struct BusInfo { - const char *name; - size_t size; - bus_dev_printfn print_dev; - bus_get_dev_path get_dev_path; - bus_get_fw_dev_path get_fw_dev_path; - qbus_resetfn *reset; +#define TYPE_BUS "bus" +#define BUS(obj) OBJECT_CHECK(BusState, (obj), TYPE_BUS) +#define BUS_CLASS(klass) OBJECT_CLASS_CHECK(BusClass, (klass), TYPE_BUS) +#define BUS_GET_CLASS(obj) OBJECT_GET_CLASS(BusClass, (obj), TYPE_BUS) + +struct BusClass { + ObjectClass parent_class; + + /* FIXME first arg should be BusState */ + void (*print_dev)(Monitor *mon, DeviceState *dev, int indent); + char *(*get_dev_path)(DeviceState *dev); + char *(*get_fw_dev_path)(DeviceState *dev); + int (*reset)(BusState *bus); }; =20 +/** + * BusState: + * @qom_allocated: Indicates whether the object was allocated by QOM. + * @glib_allocated: Indicates whether the object was initialized in-plac= e + * yet is expected to be freed with g_free(). + */ struct BusState { + Object obj; DeviceState *parent; - BusInfo *info; const char *name; int allow_hotplug; - int qdev_allocated; + bool qom_allocated; + bool glib_allocated; QTAILQ_HEAD(ChildrenHead, DeviceState) children; QLIST_ENTRY(BusState) sibling; }; @@ -174,9 +183,9 @@ DeviceState *qdev_find_recursive(BusState *bus, const= char *id); typedef int (qbus_walkerfn)(BusState *bus, void *opaque); typedef int (qdev_walkerfn)(DeviceState *dev, void *opaque); =20 -void qbus_create_inplace(BusState *bus, BusInfo *info, +void qbus_create_inplace(BusState *bus, const char *typename, DeviceState *parent, const char *name); -BusState *qbus_create(BusInfo *info, DeviceState *parent, const char *na= me); +BusState *qbus_create(const char *typename, DeviceState *parent, const c= har *name); /* Returns > 0 if either devfn or busfn skip walk somewhere in cursion, * < 0 if either devfn or busfn terminate walk somewhere in curs= ion, * 0 otherwise. */ @@ -317,9 +326,6 @@ void error_set_from_qdev_prop_error(Error **errp, int= ret, DeviceState *dev, =20 char *qdev_get_fw_dev_path(DeviceState *dev); =20 -/* This is a nasty hack to allow passing a NULL bus to qdev_create. */ -extern struct BusInfo system_bus_info; - /** * @qdev_property_add_static - add a @Property to a device referencing a * field in a struct. diff --git a/hw/s390-virtio-bus.c b/hw/s390-virtio-bus.c index 23ef35b..2aec756 100644 --- a/hw/s390-virtio-bus.c +++ b/hw/s390-virtio-bus.c @@ -45,9 +45,10 @@ =20 #define VIRTIO_EXT_CODE 0x2603 =20 -struct BusInfo s390_virtio_bus_info =3D { - .name =3D "s390-virtio", - .size =3D sizeof(VirtIOS390Bus), +static const TypeInfo s390_virtio_bus_info =3D { + .name =3D TYPE_S390_VIRTIO_BUS, + .parent =3D TYPE_BUS, + .instance_size =3D sizeof(VirtIOS390Bus), }; =20 static const VirtIOBindings virtio_s390_bindings; @@ -92,7 +93,7 @@ VirtIOS390Bus *s390_virtio_bus_init(ram_addr_t *ram_siz= e) =20 /* Create bus on bridge device */ =20 - _bus =3D qbus_create(&s390_virtio_bus_info, dev, "s390-virtio"); + _bus =3D qbus_create(TYPE_S390_VIRTIO_BUS, dev, "s390-virtio"); bus =3D DO_UPCAST(VirtIOS390Bus, bus, _bus); =20 bus->dev_page =3D *ram_size; @@ -460,7 +461,7 @@ static void virtio_s390_device_class_init(ObjectClass= *klass, void *data) DeviceClass *dc =3D DEVICE_CLASS(klass); =20 dc->init =3D s390_virtio_busdev_init; - dc->bus_info =3D &s390_virtio_bus_info; + dc->bus_type =3D TYPE_S390_VIRTIO_BUS; dc->unplug =3D qdev_simple_unplug_cb; } =20 @@ -521,6 +522,7 @@ static TypeInfo s390_virtio_bridge_info =3D { =20 static void s390_virtio_register_types(void) { + type_register_static(&s390_virtio_bus_info); type_register_static(&virtio_s390_device_info); type_register_static(&s390_virtio_serial); type_register_static(&s390_virtio_blk); diff --git a/hw/s390-virtio-bus.h b/hw/s390-virtio-bus.h index 4b99d02..4873134 100644 --- a/hw/s390-virtio-bus.h +++ b/hw/s390-virtio-bus.h @@ -52,6 +52,10 @@ #define VIRTIO_S390_DEVICE_GET_CLASS(obj) \ OBJECT_GET_CLASS(VirtIOS390DeviceClass, (obj), TYPE_VIRTIO_S390_DEV= ICE) =20 +#define TYPE_S390_VIRTIO_BUS "s390-virtio-bus" +#define S390_VIRTIO_BUS(obj) \ + OBJECT_CHECK(VirtIOS390Bus, (obj), TYPE_S390_VIRTIO_BUS) + typedef struct VirtIOS390Device VirtIOS390Device; =20 typedef struct VirtIOS390DeviceClass { diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c index e79bb54..276c794 100644 --- a/hw/scsi-bus.c +++ b/hw/scsi-bus.c @@ -19,11 +19,19 @@ static Property scsi_props[] =3D { DEFINE_PROP_END_OF_LIST(), }; =20 -static struct BusInfo scsi_bus_info =3D { - .name =3D "SCSI", - .size =3D sizeof(SCSIBus), - .get_dev_path =3D scsibus_get_dev_path, - .get_fw_dev_path =3D scsibus_get_fw_dev_path, +static void scsi_bus_class_init(ObjectClass *klass, void *data) +{ + BusClass *k =3D BUS_CLASS(klass); + + k->get_dev_path =3D scsibus_get_dev_path; + k->get_fw_dev_path =3D scsibus_get_fw_dev_path; +} + +static const TypeInfo scsi_bus_info =3D { + .name =3D TYPE_SCSI_BUS, + .parent =3D TYPE_BUS, + .instance_size =3D sizeof(SCSIBus), + .class_init =3D scsi_bus_class_init, }; static int next_scsi_bus; =20 @@ -66,7 +74,7 @@ static void scsi_device_unit_attention_reported(SCSIDev= ice *s) /* Create a scsi bus, and attach devices to it. */ void scsi_bus_new(SCSIBus *bus, DeviceState *host, const SCSIBusInfo *in= fo) { - qbus_create_inplace(&bus->qbus, &scsi_bus_info, host, NULL); + qbus_create_inplace(&bus->qbus, TYPE_SCSI_BUS, host, NULL); bus->busnr =3D next_scsi_bus++; bus->info =3D info; bus->qbus.allow_hotplug =3D 1; @@ -1594,7 +1602,7 @@ const VMStateDescription vmstate_scsi_device =3D { static void scsi_device_class_init(ObjectClass *klass, void *data) { DeviceClass *k =3D DEVICE_CLASS(klass); - k->bus_info =3D &scsi_bus_info; + k->bus_type =3D TYPE_SCSI_BUS; k->init =3D scsi_qdev_init; k->unplug =3D qdev_simple_unplug_cb; k->exit =3D scsi_qdev_exit; @@ -1612,6 +1620,7 @@ static TypeInfo scsi_device_type_info =3D { =20 static void scsi_register_types(void) { + type_register_static(&scsi_bus_info); type_register_static(&scsi_device_type_info); } =20 diff --git a/hw/scsi.h b/hw/scsi.h index 2eb66f7..76f06d4 100644 --- a/hw/scsi.h +++ b/hw/scsi.h @@ -136,6 +136,9 @@ struct SCSIBusInfo { void *(*load_request)(QEMUFile *f, SCSIRequest *req); }; =20 +#define TYPE_SCSI_BUS "SCSI" +#define SCSI_BUS(obj) OBJECT_CHECK(SCSIBus, (obj), TYPE_SCSI_BUS) + struct SCSIBus { BusState qbus; int busnr; diff --git a/hw/spapr_vio.c b/hw/spapr_vio.c index cf84952..b7611ff 100644 --- a/hw/spapr_vio.c +++ b/hw/spapr_vio.c @@ -54,9 +54,10 @@ static Property spapr_vio_props[] =3D { DEFINE_PROP_END_OF_LIST(), }; =20 -static struct BusInfo spapr_vio_bus_info =3D { - .name =3D "spapr-vio", - .size =3D sizeof(VIOsPAPRBus), +static const TypeInfo spapr_vio_bus_info =3D { + .name =3D TYPE_SPAPR_VIO_BUS, + .parent =3D TYPE_BUS, + .instance_size =3D sizeof(VIOsPAPRBus), }; =20 VIOsPAPRDevice *spapr_vio_find_by_reg(VIOsPAPRBus *bus, uint32_t reg) @@ -743,7 +744,7 @@ VIOsPAPRBus *spapr_vio_bus_init(void) =20 /* Create bus on bridge device */ =20 - qbus =3D qbus_create(&spapr_vio_bus_info, dev, "spapr-vio"); + qbus =3D qbus_create(TYPE_SPAPR_VIO_BUS, dev, "spapr-vio"); bus =3D DO_UPCAST(VIOsPAPRBus, bus, qbus); bus->next_reg =3D 0x1000; =20 @@ -795,7 +796,7 @@ static void vio_spapr_device_class_init(ObjectClass *= klass, void *data) DeviceClass *k =3D DEVICE_CLASS(klass); k->init =3D spapr_vio_busdev_init; k->reset =3D spapr_vio_busdev_reset; - k->bus_info =3D &spapr_vio_bus_info; + k->bus_type =3D TYPE_SPAPR_VIO_BUS; k->props =3D spapr_vio_props; } =20 @@ -810,6 +811,7 @@ static TypeInfo spapr_vio_type_info =3D { =20 static void spapr_vio_register_types(void) { + type_register_static(&spapr_vio_bus_info); type_register_static(&spapr_vio_bridge_info); type_register_static(&spapr_vio_type_info); } diff --git a/hw/spapr_vio.h b/hw/spapr_vio.h index 87816e4..2adad77 100644 --- a/hw/spapr_vio.h +++ b/hw/spapr_vio.h @@ -40,6 +40,9 @@ enum VIOsPAPR_TCEAccess { #define VIO_SPAPR_DEVICE_GET_CLASS(obj) \ OBJECT_GET_CLASS(VIOsPAPRDeviceClass, (obj), TYPE_VIO_SPAPR_DEVICE) =20 +#define TYPE_SPAPR_VIO_BUS "spapr-vio-bus" +#define SPAPR_VIO_BUS(obj) OBJECT_CHECK(VIOsPAPRBus, (obj), TYPE_SPAPR_V= IO_BUS) + struct VIOsPAPRDevice; =20 typedef struct VIOsPAPR_RTCE { diff --git a/hw/ssi.c b/hw/ssi.c index 8f2d9bc..8db99c2 100644 --- a/hw/ssi.c +++ b/hw/ssi.c @@ -16,9 +16,13 @@ struct SSIBus { BusState qbus; }; =20 -static struct BusInfo ssi_bus_info =3D { - .name =3D "SSI", - .size =3D sizeof(SSIBus), +#define TYPE_SSI_BUS "SSI" +#define SSI_BUS(obj) OBJECT_CHECK(SSIBus, (obj), TYPE_SSI_BUS) + +static const TypeInfo ssi_bus_info =3D { + .name =3D TYPE_SSI_BUS, + .parent =3D TYPE_BUS, + .instance_size =3D sizeof(SSIBus), }; =20 static int ssi_slave_init(DeviceState *dev) @@ -40,7 +44,7 @@ static void ssi_slave_class_init(ObjectClass *klass, vo= id *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); dc->init =3D ssi_slave_init; - dc->bus_info =3D &ssi_bus_info; + dc->bus_type =3D TYPE_SSI_BUS; } =20 static TypeInfo ssi_slave_info =3D { @@ -62,7 +66,7 @@ DeviceState *ssi_create_slave(SSIBus *bus, const char *= name) SSIBus *ssi_create_bus(DeviceState *parent, const char *name) { BusState *bus; - bus =3D qbus_create(&ssi_bus_info, parent, name); + bus =3D qbus_create(TYPE_SSI_BUS, parent, name); return FROM_QBUS(SSIBus, bus); } =20 @@ -82,6 +86,7 @@ uint32_t ssi_transfer(SSIBus *bus, uint32_t val) =20 static void ssi_slave_register_types(void) { + type_register_static(&ssi_bus_info); type_register_static(&ssi_slave_info); } =20 diff --git a/hw/sysbus.c b/hw/sysbus.c index fe5c421..2347f51 100644 --- a/hw/sysbus.c +++ b/hw/sysbus.c @@ -24,11 +24,19 @@ static void sysbus_dev_print(Monitor *mon, DeviceState *dev, int indent)= ; static char *sysbus_get_fw_dev_path(DeviceState *dev); =20 -struct BusInfo system_bus_info =3D { - .name =3D "System", - .size =3D sizeof(BusState), - .print_dev =3D sysbus_dev_print, - .get_fw_dev_path =3D sysbus_get_fw_dev_path, +static void system_bus_class_init(ObjectClass *klass, void *data) +{ + BusClass *k =3D BUS_CLASS(klass); + + k->print_dev =3D sysbus_dev_print; + k->get_fw_dev_path =3D sysbus_get_fw_dev_path; +} + +static const TypeInfo system_bus_info =3D { + .name =3D TYPE_SYSTEM_BUS, + .parent =3D TYPE_BUS, + .instance_size =3D sizeof(BusState), + .class_init =3D system_bus_class_init, }; =20 void sysbus_connect_irq(SysBusDevice *dev, int n, qemu_irq irq) @@ -244,7 +252,7 @@ static void sysbus_device_class_init(ObjectClass *kla= ss, void *data) { DeviceClass *k =3D DEVICE_CLASS(klass); k->init =3D sysbus_device_init; - k->bus_info =3D &system_bus_info; + k->bus_type =3D TYPE_SYSTEM_BUS; } =20 static TypeInfo sysbus_device_type_info =3D { @@ -263,10 +271,10 @@ static void main_system_bus_create(void) { /* assign main_system_bus before qbus_create_inplace() * in order to make "if (bus !=3D sysbus_get_default())" work */ - main_system_bus =3D g_malloc0(system_bus_info.size); - main_system_bus->qdev_allocated =3D 1; - qbus_create_inplace(main_system_bus, &system_bus_info, NULL, + main_system_bus =3D g_malloc0(system_bus_info.instance_size); + qbus_create_inplace(main_system_bus, TYPE_SYSTEM_BUS, NULL, "main-system-bus"); + main_system_bus->glib_allocated =3D true; } =20 BusState *sysbus_get_default(void) @@ -279,6 +287,7 @@ BusState *sysbus_get_default(void) =20 static void sysbus_register_types(void) { + type_register_static(&system_bus_info); type_register_static(&sysbus_device_type_info); } =20 diff --git a/hw/sysbus.h b/hw/sysbus.h index 22555cd..acfbcfb 100644 --- a/hw/sysbus.h +++ b/hw/sysbus.h @@ -10,6 +10,9 @@ #define QDEV_MAX_PIO 32 #define QDEV_MAX_IRQ 512 =20 +#define TYPE_SYSTEM_BUS "System" +#define SYSTEM_BUS(obj) OBJECT_CHECK(IDEBus, (obj), TYPE_IDE_BUS) + typedef struct SysBusDevice SysBusDevice; =20 #define TYPE_SYS_BUS_DEVICE "sys-bus-device" diff --git a/hw/usb.h b/hw/usb.h index ae7ccda..2a56fe5 100644 --- a/hw/usb.h +++ b/hw/usb.h @@ -421,6 +421,9 @@ void musb_set_size(MUSBState *s, int epnum, int size,= int is_tx); =20 /* usb-bus.c */ =20 +#define TYPE_USB_BUS "usb-bus" +#define USB_BUS(obj) OBJECT_CHECK(USBBus, (obj), TYPE_USB_BUS) + struct USBBus { BusState qbus; USBBusOps *ops; diff --git a/hw/usb/bus.c b/hw/usb/bus.c index 8b08f93..f87cc5f 100644 --- a/hw/usb/bus.c +++ b/hw/usb/bus.c @@ -18,12 +18,20 @@ static Property usb_props[] =3D { DEFINE_PROP_END_OF_LIST() }; =20 -static struct BusInfo usb_bus_info =3D { - .name =3D "USB", - .size =3D sizeof(USBBus), - .print_dev =3D usb_bus_dev_print, - .get_dev_path =3D usb_get_dev_path, - .get_fw_dev_path =3D usb_get_fw_dev_path, +static void usb_bus_class_init(ObjectClass *klass, void *data) +{ + BusClass *k =3D BUS_CLASS(klass); + + k->print_dev =3D usb_bus_dev_print; + k->get_dev_path =3D usb_get_dev_path; + k->get_fw_dev_path =3D usb_get_fw_dev_path; +} + +static const TypeInfo usb_bus_info =3D { + .name =3D TYPE_USB_BUS, + .parent =3D TYPE_BUS, + .instance_size =3D sizeof(USBBus), + .class_init =3D usb_bus_class_init, }; =20 static int next_usb_bus =3D 0; @@ -47,7 +55,7 @@ const VMStateDescription vmstate_usb_device =3D { =20 void usb_bus_new(USBBus *bus, USBBusOps *ops, DeviceState *host) { - qbus_create_inplace(&bus->qbus, &usb_bus_info, host, NULL); + qbus_create_inplace(&bus->qbus, TYPE_USB_BUS, host, NULL); bus->ops =3D ops; bus->busnr =3D next_usb_bus++; bus->qbus.allow_hotplug =3D 1; /* Yes, we can */ @@ -577,7 +585,7 @@ USBDevice *usbdevice_create(const char *cmdline) static void usb_device_class_init(ObjectClass *klass, void *data) { DeviceClass *k =3D DEVICE_CLASS(klass); - k->bus_info =3D &usb_bus_info; + k->bus_type =3D TYPE_USB_BUS; k->init =3D usb_qdev_init; k->unplug =3D qdev_simple_unplug_cb; k->exit =3D usb_qdev_exit; @@ -595,6 +603,7 @@ static TypeInfo usb_device_type_info =3D { =20 static void usb_register_types(void) { + type_register_static(&usb_bus_info); type_register_static(&usb_device_type_info); } =20 diff --git a/hw/usb/dev-smartcard-reader.c b/hw/usb/dev-smartcard-reader.= c index a4ab6e5..6cf4a1a 100644 --- a/hw/usb/dev-smartcard-reader.c +++ b/hw/usb/dev-smartcard-reader.c @@ -1060,9 +1060,13 @@ static Property ccid_props[] =3D { DEFINE_PROP_END_OF_LIST(), }; =20 -static struct BusInfo ccid_bus_info =3D { - .name =3D "ccid-bus", - .size =3D sizeof(CCIDBus), +#define TYPE_CCID_BUS "ccid-bus" +#define CCID_BUS(obj) OBJECT_CHECK(CCIDBus, (obj), TYPE_CCID_BUS) + +static const TypeInfo ccid_bus_info =3D { + .name =3D TYPE_CCID_BUS, + .parent =3D TYPE_BUS, + .instance_size =3D sizeof(CCIDBus), }; =20 void ccid_card_send_apdu_to_guest(CCIDCardState *card, @@ -1192,7 +1196,7 @@ static int ccid_initfn(USBDevice *dev) =20 usb_desc_create_serial(dev); usb_desc_init(dev); - qbus_create_inplace(&s->bus.qbus, &ccid_bus_info, &dev->qdev, NULL); + qbus_create_inplace(&s->bus.qbus, TYPE_CCID_BUS, &dev->qdev, NULL); s->intr =3D usb_ep_get(dev, USB_TOKEN_IN, CCID_INT_IN_EP); s->bus.qbus.allow_hotplug =3D 1; s->card =3D NULL; @@ -1343,7 +1347,7 @@ static TypeInfo ccid_info =3D { static void ccid_card_class_init(ObjectClass *klass, void *data) { DeviceClass *k =3D DEVICE_CLASS(klass); - k->bus_info =3D &ccid_bus_info; + k->bus_type =3D TYPE_CCID_BUS; k->init =3D ccid_card_init; k->exit =3D ccid_card_exit; k->props =3D ccid_props; @@ -1360,6 +1364,7 @@ static TypeInfo ccid_card_type_info =3D { =20 static void ccid_register_types(void) { + type_register_static(&ccid_bus_info); type_register_static(&ccid_card_type_info); type_register_static(&ccid_info); usb_legacy_register(CCID_DEV_NAME, "ccid", NULL); diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c index d47d870..96382a4 100644 --- a/hw/virtio-serial-bus.c +++ b/hw/virtio-serial-bus.c @@ -734,10 +734,21 @@ static Property virtser_props[] =3D { DEFINE_PROP_END_OF_LIST() }; =20 -static struct BusInfo virtser_bus_info =3D { - .name =3D "virtio-serial-bus", - .size =3D sizeof(VirtIOSerialBus), - .print_dev =3D virtser_bus_dev_print, +#define TYPE_VIRTIO_SERIAL_BUS "virtio-serial-bus" +#define VIRTIO_SERIAL_BUS(obj) \ + OBJECT_CHECK(VirtIOSerialBus, (obj), TYPE_VIRTIO_SERIAL_BUS) + +static void virtser_bus_class_init(ObjectClass *klass, void *data) +{ + BusClass *k =3D BUS_CLASS(klass); + k->print_dev =3D virtser_bus_dev_print; +} + +static const TypeInfo virtser_bus_info =3D { + .name =3D TYPE_VIRTIO_SERIAL_BUS, + .parent =3D TYPE_BUS, + .instance_size =3D sizeof(VirtIOSerialBus), + .class_init =3D virtser_bus_class_init, }; =20 static void virtser_bus_dev_print(Monitor *mon, DeviceState *qdev, int i= ndent) @@ -905,7 +916,7 @@ VirtIODevice *virtio_serial_init(DeviceState *dev, vi= rtio_serial_conf *conf) vser =3D DO_UPCAST(VirtIOSerial, vdev, vdev); =20 /* Spawn a new virtio-serial bus on which the ports will ride as dev= ices */ - qbus_create_inplace(&vser->bus.qbus, &virtser_bus_info, dev, NULL); + qbus_create_inplace(&vser->bus.qbus, TYPE_VIRTIO_SERIAL_BUS, dev, NU= LL); vser->bus.qbus.allow_hotplug =3D 1; vser->bus.vser =3D vser; QTAILQ_INIT(&vser->ports); @@ -981,7 +992,7 @@ static void virtio_serial_port_class_init(ObjectClass= *klass, void *data) { DeviceClass *k =3D DEVICE_CLASS(klass); k->init =3D virtser_port_qdev_init; - k->bus_info =3D &virtser_bus_info; + k->bus_type =3D TYPE_VIRTIO_SERIAL_BUS; k->exit =3D virtser_port_qdev_exit; k->unplug =3D qdev_simple_unplug_cb; k->props =3D virtser_props; @@ -998,6 +1009,7 @@ static TypeInfo virtio_serial_port_type_info =3D { =20 static void virtio_serial_register_types(void) { + type_register_static(&virtser_bus_info); type_register_static(&virtio_serial_port_type_info); } =20 --=20 1.7.7