From patchwork Tue Jan 3 00:51:58 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Anthony Liguori X-Patchwork-Id: 133962 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id C3F2AB6FA4 for ; Tue, 3 Jan 2012 13:15:55 +1100 (EST) Received: from localhost ([::1]:55860 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Rhsdc-0003Ih-Bx for incoming@patchwork.ozlabs.org; Mon, 02 Jan 2012 19:54:00 -0500 Received: from eggs.gnu.org ([140.186.70.92]:51683) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RhscZ-0001e9-Iy for qemu-devel@nongnu.org; Mon, 02 Jan 2012 19:52:59 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RhscU-0008K1-FI for qemu-devel@nongnu.org; Mon, 02 Jan 2012 19:52:55 -0500 Received: from e3.ny.us.ibm.com ([32.97.182.143]:49024) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RhscT-0008J4-Jm for qemu-devel@nongnu.org; Mon, 02 Jan 2012 19:52:50 -0500 Received: from /spool/local by e3.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 2 Jan 2012 19:52:48 -0500 Received: from d01relay01.pok.ibm.com (9.56.227.233) by e3.ny.us.ibm.com (192.168.1.103) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Mon, 2 Jan 2012 19:52:35 -0500 Received: from d01av02.pok.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by d01relay01.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q030qYrt260324 for ; Mon, 2 Jan 2012 19:52:34 -0500 Received: from d01av02.pok.ibm.com (loopback [127.0.0.1]) by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q030qY2H001489 for ; Mon, 2 Jan 2012 22:52:34 -0200 Received: from titi.austin.rr.com (sig-9-65-105-201.mts.ibm.com [9.65.105.201]) by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id q030qLpX000958; Mon, 2 Jan 2012 22:52:33 -0200 From: Anthony Liguori To: qemu-devel@nongnu.org Date: Mon, 2 Jan 2012 18:51:58 -0600 Message-Id: <1325551939-24749-10-git-send-email-aliguori@us.ibm.com> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1325551939-24749-1-git-send-email-aliguori@us.ibm.com> References: <1325551939-24749-1-git-send-email-aliguori@us.ibm.com> x-cbid: 12010300-8974-0000-0000-000004D13EA1 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 32.97.182.143 Cc: Paolo Bonzini , Anthony Liguori , Markus Armbruster , =?UTF-8?q?Andreas=20F=C3=A4rber?= Subject: [Qemu-devel] [PATCH 09/30] qdev: move qdev->info to class X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Right now, DeviceInfo acts as the class for qdev. In order to switch to a proper ObjectClass derivative, we need to ween all of the callers off of interacting directly with the info pointer. Signed-off-by: Anthony Liguori Reviewed-by: Andreas Färber --- hw/acpi_piix4.c | 4 +- hw/cirrus_vga.c | 2 +- hw/e1000.c | 2 +- hw/eepro100.c | 4 +- hw/hda-audio.c | 2 +- hw/ide/piix.c | 2 +- hw/intel-hda.c | 6 ++-- hw/lsi53c895a.c | 2 +- hw/ne2000-isa.c | 2 +- hw/ne2000.c | 2 +- hw/pci.c | 16 ++++++----- hw/pcnet.c | 2 +- hw/qdev-properties.c | 20 +++++++------- hw/qdev.c | 70 ++++++++++++++++++++++++++++-------------------- hw/qdev.h | 16 +++++++++- hw/rtl8139.c | 2 +- hw/spapr_vio.c | 6 ++-- hw/spapr_vty.c | 2 +- hw/usb-bus.c | 2 +- hw/usb-ccid.c | 2 +- hw/usb-net.c | 2 +- hw/usb-ohci.c | 2 +- hw/virtio-console.c | 2 +- hw/virtio-net.c | 2 +- hw/virtio-serial-bus.c | 6 ++-- 25 files changed, 103 insertions(+), 77 deletions(-) diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c index d9075e6..30c62ac 100644 --- a/hw/acpi_piix4.c +++ b/hw/acpi_piix4.c @@ -277,7 +277,7 @@ static void piix4_update_hotplug(PIIX4PMState *s) s->pci0_hotplug_enable = ~0; QTAILQ_FOREACH_SAFE(qdev, &bus->children, sibling, next) { - PCIDeviceInfo *info = container_of(qdev->info, PCIDeviceInfo, qdev); + PCIDeviceInfo *info = container_of(qdev_get_info(qdev), PCIDeviceInfo, qdev); PCIDevice *pdev = DO_UPCAST(PCIDevice, qdev, qdev); int slot = PCI_SLOT(pdev->devfn); @@ -488,7 +488,7 @@ static void pciej_write(void *opaque, uint32_t addr, uint32_t val) QTAILQ_FOREACH_SAFE(qdev, &bus->children, sibling, next) { dev = DO_UPCAST(PCIDevice, qdev, qdev); - info = container_of(qdev->info, PCIDeviceInfo, qdev); + info = container_of(qdev_get_info(qdev), PCIDeviceInfo, qdev); if (PCI_SLOT(dev->devfn) == slot && !info->no_hotplug) { qdev_free(qdev); } diff --git a/hw/cirrus_vga.c b/hw/cirrus_vga.c index f7b1d3d..2505f22 100644 --- a/hw/cirrus_vga.c +++ b/hw/cirrus_vga.c @@ -2911,7 +2911,7 @@ static int pci_cirrus_vga_initfn(PCIDevice *dev) { PCICirrusVGAState *d = DO_UPCAST(PCICirrusVGAState, dev, dev); CirrusVGAState *s = &d->cirrus_vga; - PCIDeviceInfo *info = DO_UPCAST(PCIDeviceInfo, qdev, dev->qdev.info); + PCIDeviceInfo *info = DO_UPCAST(PCIDeviceInfo, qdev, qdev_get_info(&dev->qdev)); int16_t device_id = info->device_id; /* setup VGA */ diff --git a/hw/e1000.c b/hw/e1000.c index a29c944..7e17d85 100644 --- a/hw/e1000.c +++ b/hw/e1000.c @@ -1174,7 +1174,7 @@ static int pci_e1000_init(PCIDevice *pci_dev) d->eeprom_data[EEPROM_CHECKSUM_REG] = checksum; d->nic = qemu_new_nic(&net_e1000_info, &d->conf, - d->dev.qdev.info->name, d->dev.qdev.id, d); + qdev_get_info(&d->dev.qdev)->name, d->dev.qdev.id, d); qemu_format_nic_info_str(&d->nic->nc, macaddr); diff --git a/hw/eepro100.c b/hw/eepro100.c index 6a162f6..81a32b8 100644 --- a/hw/eepro100.c +++ b/hw/eepro100.c @@ -1848,7 +1848,7 @@ static int e100_nic_init(PCIDevice *pci_dev) { EEPRO100State *s = DO_UPCAST(EEPRO100State, dev, pci_dev); E100PCIDeviceInfo *e100_device = DO_UPCAST(E100PCIDeviceInfo, pci.qdev, - pci_dev->qdev.info); + qdev_get_info(&pci_dev->qdev)); TRACE(OTHER, logout("\n")); @@ -1878,7 +1878,7 @@ static int e100_nic_init(PCIDevice *pci_dev) nic_reset(s); s->nic = qemu_new_nic(&net_eepro100_info, &s->conf, - pci_dev->qdev.info->name, pci_dev->qdev.id, s); + qdev_get_info(&pci_dev->qdev)->name, pci_dev->qdev.id, s); qemu_format_nic_info_str(&s->nic->nc, s->conf.macaddr.a); TRACE(OTHER, logout("%s\n", s->nic->nc.info_str)); diff --git a/hw/hda-audio.c b/hw/hda-audio.c index 9b089e6..0bc0a25 100644 --- a/hw/hda-audio.c +++ b/hw/hda-audio.c @@ -777,7 +777,7 @@ static int hda_audio_init(HDACodecDevice *hda, const struct desc_codec *desc) uint32_t i, type; a->desc = desc; - a->name = a->hda.qdev.info->name; + a->name = qdev_get_info(&a->hda.qdev)->name; dprint(a, 1, "%s: cad %d\n", __FUNCTION__, a->hda.cad); AUD_register_card("hda", &a->card); diff --git a/hw/ide/piix.c b/hw/ide/piix.c index 3473345..c0e3450 100644 --- a/hw/ide/piix.c +++ b/hw/ide/piix.c @@ -195,7 +195,6 @@ PCIDevice *pci_piix3_xen_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn) PCIDevice *dev; dev = pci_create_simple(bus, devfn, "piix3-ide-xen"); - dev->qdev.info->unplug = pci_piix3_xen_ide_unplug; pci_ide_create_devs(dev, hd_table); return dev; } @@ -253,6 +252,7 @@ static PCIDeviceInfo piix_ide_info[] = { .qdev.name = "piix3-ide-xen", .qdev.size = sizeof(PCIIDEState), .qdev.no_user = 1, + .qdev.unplug = pci_piix3_xen_ide_unplug, .init = pci_piix_ide_initfn, .vendor_id = PCI_VENDOR_ID_INTEL, .device_id = PCI_DEVICE_ID_INTEL_82371SB_1, diff --git a/hw/intel-hda.c b/hw/intel-hda.c index 10769e0..12dcc84 100644 --- a/hw/intel-hda.c +++ b/hw/intel-hda.c @@ -1116,8 +1116,8 @@ static void intel_hda_reset(DeviceState *dev) /* reset codecs */ QTAILQ_FOREACH(qdev, &d->codecs.qbus.children, sibling) { cdev = DO_UPCAST(HDACodecDevice, qdev, qdev); - if (qdev->info->reset) { - qdev->info->reset(qdev); + if (qdev_get_info(qdev)->reset) { + qdev_get_info(qdev)->reset(qdev); } d->state_sts |= (1 << cdev->cad); } @@ -1129,7 +1129,7 @@ static int intel_hda_init(PCIDevice *pci) IntelHDAState *d = DO_UPCAST(IntelHDAState, pci, pci); uint8_t *conf = d->pci.config; - d->name = d->pci.qdev.info->name; + d->name = qdev_get_info(&d->pci.qdev)->name; pci_config_set_interrupt_pin(conf, 1); diff --git a/hw/lsi53c895a.c b/hw/lsi53c895a.c index 0d3a101..9f475e0 100644 --- a/hw/lsi53c895a.c +++ b/hw/lsi53c895a.c @@ -1681,7 +1681,7 @@ static void lsi_reg_writeb(LSIState *s, int offset, uint8_t val) DeviceState *dev; QTAILQ_FOREACH(dev, &s->bus.qbus.children, sibling) { - dev->info->reset(dev); + qdev_get_info(dev)->reset(dev); } s->sstat0 |= LSI_SSTAT0_RST; lsi_script_scsi_interrupt(s, LSI_SIST0_RST, 0); diff --git a/hw/ne2000-isa.c b/hw/ne2000-isa.c index 11ffee7..60dc333 100644 --- a/hw/ne2000-isa.c +++ b/hw/ne2000-isa.c @@ -76,7 +76,7 @@ static int isa_ne2000_initfn(ISADevice *dev) ne2000_reset(s); s->nic = qemu_new_nic(&net_ne2000_isa_info, &s->c, - dev->qdev.info->name, dev->qdev.id, s); + qdev_get_info(&dev->qdev)->name, dev->qdev.id, s); qemu_format_nic_info_str(&s->nic->nc, s->c.macaddr.a); return 0; diff --git a/hw/ne2000.c b/hw/ne2000.c index 62e082f..d016b8e 100644 --- a/hw/ne2000.c +++ b/hw/ne2000.c @@ -760,7 +760,7 @@ static int pci_ne2000_init(PCIDevice *pci_dev) ne2000_reset(s); s->nic = qemu_new_nic(&net_ne2000_info, &s->c, - pci_dev->qdev.info->name, pci_dev->qdev.id, s); + qdev_get_info(&pci_dev->qdev)->name, pci_dev->qdev.id, s); qemu_format_nic_info_str(&s->nic->nc, s->c.macaddr.a); if (!pci_dev->qdev.hotplugged) { diff --git a/hw/pci.c b/hw/pci.c index fd575ac..64cd08f 100644 --- a/hw/pci.c +++ b/hw/pci.c @@ -841,7 +841,7 @@ static void pci_unregister_io_regions(PCIDevice *pci_dev) static int pci_unregister_device(DeviceState *dev) { PCIDevice *pci_dev = DO_UPCAST(PCIDevice, qdev, dev); - PCIDeviceInfo *info = DO_UPCAST(PCIDeviceInfo, qdev, dev->info); + PCIDeviceInfo *info = DO_UPCAST(PCIDeviceInfo, qdev, qdev_get_info(dev)); int ret = 0; if (info->exit) @@ -1531,7 +1531,7 @@ static int pci_qdev_init(DeviceState *qdev, DeviceInfo *base) static int pci_unplug_device(DeviceState *qdev) { PCIDevice *dev = DO_UPCAST(PCIDevice, qdev, qdev); - PCIDeviceInfo *info = container_of(qdev->info, PCIDeviceInfo, qdev); + PCIDeviceInfo *info = container_of(qdev_get_info(qdev), PCIDeviceInfo, qdev); if (info->no_hotplug) { qerror_report(QERR_DEVICE_NO_HOTPLUG, info->qdev.name); @@ -1544,7 +1544,9 @@ static int pci_unplug_device(DeviceState *qdev) void pci_qdev_register(PCIDeviceInfo *info) { info->qdev.init = pci_qdev_init; - info->qdev.unplug = pci_unplug_device; + if (!info->qdev.unplug) { + info->qdev.unplug = pci_unplug_device; + } info->qdev.exit = pci_unregister_device; info->qdev.bus_info = &pci_bus_info; qdev_register(&info->qdev); @@ -1757,10 +1759,10 @@ static int pci_add_option_rom(PCIDevice *pdev, bool is_default_rom) size = 1 << qemu_fls(size); } - if (pdev->qdev.info->vmsd) - snprintf(name, sizeof(name), "%s.rom", pdev->qdev.info->vmsd->name); + if (qdev_get_info(&pdev->qdev)->vmsd) + snprintf(name, sizeof(name), "%s.rom", qdev_get_info(&pdev->qdev)->vmsd->name); else - snprintf(name, sizeof(name), "%s.rom", pdev->qdev.info->name); + snprintf(name, sizeof(name), "%s.rom", qdev_get_info(&pdev->qdev)->name); pdev->has_rom = true; memory_region_init_ram(&pdev->rom, &pdev->qdev, name, size); ptr = memory_region_get_ram_ptr(&pdev->rom); @@ -1999,7 +2001,7 @@ static int pci_qdev_find_recursive(PCIBus *bus, } /* roughly check if given qdev is pci device */ - if (qdev->info->init == &pci_qdev_init && + if (qdev_get_info(qdev)->init == &pci_qdev_init && qdev->parent_bus->info == &pci_bus_info) { *pdev = DO_UPCAST(PCIDevice, qdev, qdev); return 0; diff --git a/hw/pcnet.c b/hw/pcnet.c index cba253b..e58b195 100644 --- a/hw/pcnet.c +++ b/hw/pcnet.c @@ -1718,7 +1718,7 @@ int pcnet_common_init(DeviceState *dev, PCNetState *s, NetClientInfo *info) s->poll_timer = qemu_new_timer_ns(vm_clock, pcnet_poll_timer, s); qemu_macaddr_default_if_unset(&s->conf.macaddr); - s->nic = qemu_new_nic(info, &s->conf, dev->info->name, dev->id, s); + s->nic = qemu_new_nic(info, &s->conf, qdev_get_info(dev)->name, dev->id, s); qemu_format_nic_info_str(&s->nic->nc, s->conf.macaddr.a); add_boot_device_path(s->conf.bootindex, dev, "/ethernet-phy@0"); diff --git a/hw/qdev-properties.c b/hw/qdev-properties.c index 663c2a0..a11127f 100644 --- a/hw/qdev-properties.c +++ b/hw/qdev-properties.c @@ -955,7 +955,7 @@ static Property *qdev_prop_find(DeviceState *dev, const char *name) Property *prop; /* device properties */ - prop = qdev_prop_walk(dev->info->props, name); + prop = qdev_prop_walk(qdev_get_info(dev)->props, name); if (prop) return prop; @@ -978,16 +978,16 @@ void error_set_from_qdev_prop_error(Error **errp, int ret, DeviceState *dev, switch (ret) { case -EEXIST: error_set(errp, QERR_PROPERTY_VALUE_IN_USE, - dev->info->name, prop->name, value); + qdev_get_info(dev)->name, prop->name, value); break; default: case -EINVAL: error_set(errp, QERR_PROPERTY_VALUE_BAD, - dev->info->name, prop->name, value); + qdev_get_info(dev)->name, prop->name, value); break; case -ENOENT: error_set(errp, QERR_PROPERTY_VALUE_NOT_FOUND, - dev->info->name, prop->name, value); + qdev_get_info(dev)->name, prop->name, value); break; case 0: break; @@ -1007,7 +1007,7 @@ int qdev_prop_parse(DeviceState *dev, const char *name, const char *value) * removed along with it. */ if (!prop || !prop->info->parse) { - qerror_report(QERR_PROPERTY_NOT_FOUND, dev->info->name, name); + qerror_report(QERR_PROPERTY_NOT_FOUND, qdev_get_info(dev)->name, name); return -1; } ret = prop->info->parse(dev, prop, value); @@ -1028,12 +1028,12 @@ void qdev_prop_set(DeviceState *dev, const char *name, void *src, enum PropertyT prop = qdev_prop_find(dev, name); if (!prop) { fprintf(stderr, "%s: property \"%s.%s\" not found\n", - __FUNCTION__, dev->info->name, name); + __FUNCTION__, qdev_get_info(dev)->name, name); abort(); } if (prop->info->type != type) { fprintf(stderr, "%s: property \"%s.%s\" type mismatch\n", - __FUNCTION__, dev->info->name, name); + __FUNCTION__, qdev_get_info(dev)->name, name); abort(); } qdev_prop_cpy(dev, prop, src); @@ -1082,7 +1082,7 @@ int qdev_prop_set_drive(DeviceState *dev, const char *name, BlockDriverState *va if (res < 0) { error_report("Can't attach drive %s to %s.%s: %s", bdrv_get_device_name(value), - dev->id ? dev->id : dev->info->name, + dev->id ? dev->id : qdev_get_info(dev)->name, name, strerror(-res)); return -1; } @@ -1154,8 +1154,8 @@ void qdev_prop_set_globals(DeviceState *dev) GlobalProperty *prop; QTAILQ_FOREACH(prop, &global_props, next) { - if (strcmp(dev->info->name, prop->driver) != 0 && - strcmp(dev->info->bus_info->name, prop->driver) != 0) { + if (strcmp(qdev_get_info(dev)->name, prop->driver) != 0 && + strcmp(qdev_get_info(dev)->bus_info->name, prop->driver) != 0) { continue; } if (qdev_prop_parse(dev, prop->property, prop->value) != 0) { diff --git a/hw/qdev.c b/hw/qdev.c index 2646d8e..1b25304 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -45,6 +45,17 @@ static BusState *qbus_find_recursive(BusState *bus, const char *name, static BusState *qbus_find(const char *path); /* Register a new device type. */ +static void qdev_subclass_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + dc->info = data; +} + +DeviceInfo *qdev_get_info(DeviceState *dev) +{ + return DEVICE_GET_CLASS(dev)->info; +} + void qdev_register(DeviceInfo *info) { TypeInfo type_info = {}; @@ -55,6 +66,8 @@ void qdev_register(DeviceInfo *info) type_info.name = info->name; type_info.parent = TYPE_DEVICE; type_info.instance_size = info->size; + type_info.class_init = qdev_subclass_init; + type_info.class_data = info; type_register_static(&type_info); @@ -98,9 +111,8 @@ static DeviceState *qdev_create_from_info(BusState *bus, DeviceInfo *info) assert(bus->info == info->bus_info); dev = DEVICE(object_new(info->name)); - dev->info = info; dev->parent_bus = bus; - qdev_prop_set_defaults(dev, dev->info->props); + qdev_prop_set_defaults(dev, qdev_get_info(dev)->props); qdev_prop_set_defaults(dev, dev->parent_bus->info->props); qdev_prop_set_globals(dev); QTAILQ_INSERT_HEAD(&bus->children, dev, sibling); @@ -113,12 +125,12 @@ static DeviceState *qdev_create_from_info(BusState *bus, DeviceInfo *info) QTAILQ_INIT(&dev->properties); dev->state = DEV_STATE_CREATED; - for (prop = dev->info->props; prop && prop->name; prop++) { + for (prop = qdev_get_info(dev)->props; prop && prop->name; prop++) { qdev_property_add_legacy(dev, prop, NULL); qdev_property_add_static(dev, prop, NULL); } - for (prop = dev->info->bus_info->props; prop && prop->name; prop++) { + for (prop = qdev_get_info(dev)->bus_info->props; prop && prop->name; prop++) { qdev_property_add_legacy(dev, prop, NULL); qdev_property_add_static(dev, prop, NULL); } @@ -351,19 +363,19 @@ int qdev_init(DeviceState *dev) int rc; assert(dev->state == DEV_STATE_CREATED); - rc = dev->info->init(dev, dev->info); + rc = qdev_get_info(dev)->init(dev, qdev_get_info(dev)); if (rc < 0) { qdev_free(dev); return rc; } - if (dev->info->vmsd) { - vmstate_register_with_alias_id(dev, -1, dev->info->vmsd, dev, + if (qdev_get_info(dev)->vmsd) { + vmstate_register_with_alias_id(dev, -1, qdev_get_info(dev)->vmsd, dev, dev->instance_id_alias, dev->alias_required_for_version); } dev->state = DEV_STATE_INITIALIZED; - if (dev->hotplugged && dev->info->reset) { - dev->info->reset(dev); + if (dev->hotplugged && qdev_get_info(dev)->reset) { + qdev_get_info(dev)->reset(dev); } return 0; } @@ -382,7 +394,7 @@ int qdev_unplug(DeviceState *dev) qerror_report(QERR_BUS_NO_HOTPLUG, dev->parent_bus->name); return -1; } - assert(dev->info->unplug != NULL); + assert(qdev_get_info(dev)->unplug != NULL); if (dev->ref != 0) { qerror_report(QERR_DEVICE_IN_USE, dev->id?:""); @@ -391,13 +403,13 @@ int qdev_unplug(DeviceState *dev) qdev_hot_removed = true; - return dev->info->unplug(dev); + return qdev_get_info(dev)->unplug(dev); } static int qdev_reset_one(DeviceState *dev, void *opaque) { - if (dev->info->reset) { - dev->info->reset(dev); + if (qdev_get_info(dev)->reset) { + qdev_get_info(dev)->reset(dev); } return 0; @@ -448,7 +460,7 @@ int qdev_simple_unplug_cb(DeviceState *dev) way is somewhat unclean, and best avoided. */ void qdev_init_nofail(DeviceState *dev) { - DeviceInfo *info = dev->info; + DeviceInfo *info = qdev_get_info(dev); if (qdev_init(dev) < 0) { error_report("Initialization of device %s failed", info->name); @@ -486,15 +498,15 @@ void qdev_free(DeviceState *dev) bus = QLIST_FIRST(&dev->child_bus); qbus_free(bus); } - if (dev->info->vmsd) - vmstate_unregister(dev, dev->info->vmsd, dev); - if (dev->info->exit) - dev->info->exit(dev); + if (qdev_get_info(dev)->vmsd) + vmstate_unregister(dev, qdev_get_info(dev)->vmsd, dev); + if (qdev_get_info(dev)->exit) + qdev_get_info(dev)->exit(dev); if (dev->opts) qemu_opts_del(dev->opts); } QTAILQ_REMOVE(&dev->parent_bus->children, dev, sibling); - for (prop = dev->info->props; prop && prop->name; prop++) { + for (prop = qdev_get_info(dev)->props; prop && prop->name; prop++) { if (prop->info->free) { prop->info->free(dev, prop); } @@ -680,7 +692,7 @@ static void qbus_list_bus(DeviceState *dev) const char *sep = " "; error_printf("child busses at \"%s\":", - dev->id ? dev->id : dev->info->name); + dev->id ? dev->id : qdev_get_info(dev)->name); QLIST_FOREACH(child, &dev->child_bus, sibling) { error_printf("%s\"%s\"", sep, child->name); sep = ", "; @@ -695,7 +707,7 @@ static void qbus_list_dev(BusState *bus) error_printf("devices at \"%s\":", bus->name); QTAILQ_FOREACH(dev, &bus->children, sibling) { - error_printf("%s\"%s\"", sep, dev->info->name); + error_printf("%s\"%s\"", sep, qdev_get_info(dev)->name); if (dev->id) error_printf("/\"%s\"", dev->id); sep = ", "; @@ -731,12 +743,12 @@ static DeviceState *qbus_find_dev(BusState *bus, char *elem) } } QTAILQ_FOREACH(dev, &bus->children, sibling) { - if (strcmp(dev->info->name, elem) == 0) { + if (strcmp(qdev_get_info(dev)->name, elem) == 0) { return dev; } } QTAILQ_FOREACH(dev, &bus->children, sibling) { - if (dev->info->alias && strcmp(dev->info->alias, elem) == 0) { + if (qdev_get_info(dev)->alias && strcmp(qdev_get_info(dev)->alias, elem) == 0) { return dev; } } @@ -938,7 +950,7 @@ static void qdev_print_props(Monitor *mon, DeviceState *dev, Property *props, static void qdev_print(Monitor *mon, DeviceState *dev, int indent) { BusState *child; - qdev_printf("dev: %s, id \"%s\"\n", dev->info->name, + qdev_printf("dev: %s, id \"%s\"\n", qdev_get_info(dev)->name, dev->id ? dev->id : ""); indent += 2; if (dev->num_gpio_in) { @@ -947,7 +959,7 @@ static void qdev_print(Monitor *mon, DeviceState *dev, int indent) if (dev->num_gpio_out) { qdev_printf("gpio-out %d\n", dev->num_gpio_out); } - qdev_print_props(mon, dev, dev->info->props, "dev", indent); + qdev_print_props(mon, dev, qdev_get_info(dev)->props, "dev", indent); qdev_print_props(mon, dev, dev->parent_bus->info->props, "bus", indent); if (dev->parent_bus->info->print_dev) dev->parent_bus->info->print_dev(mon, dev, indent); @@ -1028,7 +1040,7 @@ static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size) l += snprintf(p + l, size - l, "%s", d); g_free(d); } else { - l += snprintf(p + l, size - l, "%s", dev->info->name); + l += snprintf(p + l, size - l, "%s", qdev_get_info(dev)->name); } } l += snprintf(p + l , size - l, "/"); @@ -1050,7 +1062,7 @@ char* qdev_get_fw_dev_path(DeviceState *dev) char *qdev_get_type(DeviceState *dev, Error **errp) { - return g_strdup(dev->info->name); + return g_strdup(qdev_get_info(dev)->name); } void qdev_ref(DeviceState *dev) @@ -1252,7 +1264,7 @@ void qdev_property_add_child(DeviceState *dev, const char *name, { gchar *type; - type = g_strdup_printf("child<%s>", child->info->name); + type = g_strdup_printf("child<%s>", qdev_get_info(child)->name); qdev_property_add(dev, name, type, qdev_get_child_property, NULL, NULL, child, errp); @@ -1303,7 +1315,7 @@ static void qdev_set_link_property(DeviceState *dev, Visitor *v, void *opaque, if (target) { gchar *target_type; - target_type = g_strdup_printf("link<%s>", target->info->name); + target_type = g_strdup_printf("link<%s>", qdev_get_info(target)->name); if (strcmp(target_type, type) == 0) { *child = target; qdev_ref(target); diff --git a/hw/qdev.h b/hw/qdev.h index d45a6e0..702b65f 100644 --- a/hw/qdev.h +++ b/hw/qdev.h @@ -69,9 +69,12 @@ typedef struct DeviceProperty #define TYPE_DEVICE "device" #define DEVICE(obj) OBJECT_CHECK(DeviceState, (obj), TYPE_DEVICE) +#define DEVICE_CLASS(klass) OBJECT_CLASS_CHECK(DeviceClass, (klass), TYPE_DEVICE) +#define DEVICE_GET_CLASS(obj) OBJECT_GET_CLASS(DeviceClass, (obj), TYPE_DEVICE) typedef struct DeviceClass { ObjectClass parent_class; + DeviceInfo *info; } DeviceClass; /* This structure should not be accessed directly. We declare it here @@ -83,7 +86,6 @@ struct DeviceState { enum DevState state; QemuOpts *opts; int hotplugged; - DeviceInfo *info; BusState *parent_bus; int num_gpio_out; qemu_irq *gpio_out; @@ -388,9 +390,19 @@ void qdev_prop_set_globals(DeviceState *dev); void error_set_from_qdev_prop_error(Error **errp, int ret, DeviceState *dev, Property *prop, const char *value); +DeviceInfo *qdev_get_info(DeviceState *dev); + static inline const char *qdev_fw_name(DeviceState *dev) { - return dev->info->fw_name ? : dev->info->alias ? : dev->info->name; + DeviceInfo *info = qdev_get_info(dev); + + if (info->fw_name) { + return info->fw_name; + } else if (info->alias) { + return info->alias; + } + + return info->name; } char *qdev_get_fw_dev_path(DeviceState *dev); diff --git a/hw/rtl8139.c b/hw/rtl8139.c index 0ae9f57..16d948e 100644 --- a/hw/rtl8139.c +++ b/hw/rtl8139.c @@ -3478,7 +3478,7 @@ static int pci_rtl8139_init(PCIDevice *dev) s->eeprom.contents[9] = s->conf.macaddr.a[4] | s->conf.macaddr.a[5] << 8; s->nic = qemu_new_nic(&net_rtl8139_info, &s->conf, - dev->qdev.info->name, dev->qdev.id, s); + qdev_get_info(&dev->qdev)->name, dev->qdev.id, s); qemu_format_nic_info_str(&s->nic->nc, s->conf.macaddr.a); s->cplus_txbuffer = NULL; diff --git a/hw/spapr_vio.c b/hw/spapr_vio.c index 5a35541..be6d2bd 100644 --- a/hw/spapr_vio.c +++ b/hw/spapr_vio.c @@ -75,7 +75,7 @@ VIOsPAPRDevice *spapr_vio_find_by_reg(VIOsPAPRBus *bus, uint32_t reg) static char *vio_format_dev_name(VIOsPAPRDevice *dev) { - VIOsPAPRDeviceInfo *info = (VIOsPAPRDeviceInfo *)dev->qdev.info; + VIOsPAPRDeviceInfo *info = (VIOsPAPRDeviceInfo *)qdev_get_info(&dev->qdev); char *name; /* Device tree style name device@reg */ @@ -90,7 +90,7 @@ static char *vio_format_dev_name(VIOsPAPRDevice *dev) static int vio_make_devnode(VIOsPAPRDevice *dev, void *fdt) { - VIOsPAPRDeviceInfo *info = (VIOsPAPRDeviceInfo *)dev->qdev.info; + VIOsPAPRDeviceInfo *info = (VIOsPAPRDeviceInfo *)qdev_get_info(&dev->qdev); int vdevice_off, node_off, ret; char *dt_name; @@ -668,7 +668,7 @@ static target_ulong h_vio_signal(CPUState *env, sPAPREnvironment *spapr, return H_PARAMETER; } - info = (VIOsPAPRDeviceInfo *)dev->qdev.info; + info = (VIOsPAPRDeviceInfo *)qdev_get_info(&dev->qdev); if (mode & ~info->signal_mask) { return H_PARAMETER; diff --git a/hw/spapr_vty.c b/hw/spapr_vty.c index e217314..9291beb 100644 --- a/hw/spapr_vty.c +++ b/hw/spapr_vty.c @@ -163,7 +163,7 @@ static VIOsPAPRDevice *vty_lookup(sPAPREnvironment *spapr, target_ulong reg) * (early debug does work there, despite having no vty with * reg==0. */ QTAILQ_FOREACH(qdev, &spapr->vio_bus->bus.children, sibling) { - if (qdev->info == &spapr_vty.qdev) { + if (qdev_get_info(qdev) == &spapr_vty.qdev) { return DO_UPCAST(VIOsPAPRDevice, qdev, qdev); } } diff --git a/hw/usb-bus.c b/hw/usb-bus.c index 8203390..71ef794 100644 --- a/hw/usb-bus.c +++ b/hw/usb-bus.c @@ -249,7 +249,7 @@ int usb_claim_port(USBDevice *dev) return -1; } } else { - if (bus->nfree == 1 && strcmp(dev->qdev.info->name, "usb-hub") != 0) { + if (bus->nfree == 1 && strcmp(qdev_get_info(&dev->qdev)->name, "usb-hub") != 0) { /* Create a new hub and chain it on */ usb_create_simple(bus, "usb-hub"); } diff --git a/hw/usb-ccid.c b/hw/usb-ccid.c index cd349f3..8a79729 100644 --- a/hw/usb-ccid.c +++ b/hw/usb-ccid.c @@ -1122,7 +1122,7 @@ static int ccid_card_exit(DeviceState *qdev) { int ret = 0; CCIDCardState *card = DO_UPCAST(CCIDCardState, qdev, qdev); - CCIDCardInfo *info = DO_UPCAST(CCIDCardInfo, qdev, qdev->info); + CCIDCardInfo *info = DO_UPCAST(CCIDCardInfo, qdev, qdev_get_info(qdev)); USBCCIDState *s = DO_UPCAST(USBCCIDState, dev.qdev, card->qdev.parent_bus->parent); diff --git a/hw/usb-net.c b/hw/usb-net.c index f91fa32..710c4d9 100644 --- a/hw/usb-net.c +++ b/hw/usb-net.c @@ -1351,7 +1351,7 @@ static int usb_net_initfn(USBDevice *dev) qemu_macaddr_default_if_unset(&s->conf.macaddr); s->nic = qemu_new_nic(&net_usbnet_info, &s->conf, - s->dev.qdev.info->name, s->dev.qdev.id, s); + qdev_get_info(&s->dev.qdev)->name, s->dev.qdev.id, s); qemu_format_nic_info_str(&s->nic->nc, s->conf.macaddr.a); snprintf(s->usbstring_mac, sizeof(s->usbstring_mac), "%02x%02x%02x%02x%02x%02x", diff --git a/hw/usb-ohci.c b/hw/usb-ohci.c index e68be70..833fa7c 100644 --- a/hw/usb-ohci.c +++ b/hw/usb-ohci.c @@ -1775,7 +1775,7 @@ static int usb_ohci_init(OHCIState *ohci, DeviceState *dev, memory_region_init_io(&ohci->mem, &ohci_mem_ops, ohci, "ohci", 256); ohci->localmem_base = localmem_base; - ohci->name = dev->info->name; + ohci->name = qdev_get_info(dev)->name; usb_packet_init(&ohci->usb_packet); ohci->async_td = 0; diff --git a/hw/virtio-console.c b/hw/virtio-console.c index 73d866a..cd20174 100644 --- a/hw/virtio-console.c +++ b/hw/virtio-console.c @@ -110,7 +110,7 @@ static int virtconsole_initfn(VirtIOSerialPort *port) { VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port); VirtIOSerialPortInfo *info = DO_UPCAST(VirtIOSerialPortInfo, qdev, - vcon->port.dev.info); + qdev_get_info(&vcon->port.dev)); if (port->id == 0 && !info->is_console) { error_report("Port number 0 on virtio-serial devices reserved for virtconsole devices for backward compatibility."); diff --git a/hw/virtio-net.c b/hw/virtio-net.c index 8c2f460..6c785d0 100644 --- a/hw/virtio-net.c +++ b/hw/virtio-net.c @@ -1030,7 +1030,7 @@ VirtIODevice *virtio_net_init(DeviceState *dev, NICConf *conf, memcpy(&n->mac[0], &conf->macaddr, sizeof(n->mac)); n->status = VIRTIO_NET_S_LINK_UP; - n->nic = qemu_new_nic(&net_virtio_info, conf, dev->info->name, dev->id, n); + n->nic = qemu_new_nic(&net_virtio_info, conf, qdev_get_info(dev)->name, dev->id, n); qemu_format_nic_info_str(&n->nic->nc, conf->macaddr.a); diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c index fe0233f..cc4e4f6 100644 --- a/hw/virtio-serial-bus.c +++ b/hw/virtio-serial-bus.c @@ -135,7 +135,7 @@ static void do_flush_queued_data(VirtIOSerialPort *port, VirtQueue *vq, assert(port); assert(virtio_queue_ready(vq)); - info = DO_UPCAST(VirtIOSerialPortInfo, qdev, port->dev.info); + info = DO_UPCAST(VirtIOSerialPortInfo, qdev, qdev_get_info(&port->dev)); while (!port->throttled) { unsigned int i; @@ -358,7 +358,7 @@ static void handle_control_message(VirtIOSerial *vser, void *buf, size_t len) trace_virtio_serial_handle_control_message_port(port->id); - info = DO_UPCAST(VirtIOSerialPortInfo, qdev, port->dev.info); + info = DO_UPCAST(VirtIOSerialPortInfo, qdev, qdev_get_info(&port->dev)); switch(cpkt.event) { case VIRTIO_CONSOLE_PORT_READY: @@ -809,7 +809,7 @@ static int virtser_port_qdev_exit(DeviceState *qdev) { VirtIOSerialPort *port = DO_UPCAST(VirtIOSerialPort, dev, qdev); VirtIOSerialPortInfo *info = DO_UPCAST(VirtIOSerialPortInfo, qdev, - port->dev.info); + qdev_get_info(&port->dev)); VirtIOSerial *vser = port->vser; qemu_bh_delete(port->bh);