mirror of https://gitee.com/openkylin/qemu.git
qdev: move qdev->info to class
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 <aliguori@us.ibm.com>
This commit is contained in:
parent
32fea4025b
commit
30fbb9fc7c
|
@ -280,7 +280,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);
|
||||
|
||||
|
@ -491,7 +491,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);
|
||||
}
|
||||
|
|
|
@ -31,7 +31,7 @@ void cpu_set_apic_base(DeviceState *d, uint64_t val)
|
|||
trace_cpu_set_apic_base(val);
|
||||
|
||||
if (s) {
|
||||
info = DO_UPCAST(APICCommonInfo, busdev.qdev, s->busdev.qdev.info);
|
||||
info = DO_UPCAST(APICCommonInfo, busdev.qdev, qdev_get_info(&s->busdev.qdev));
|
||||
info->set_base(s, val);
|
||||
}
|
||||
}
|
||||
|
@ -51,7 +51,7 @@ void cpu_set_apic_tpr(DeviceState *d, uint8_t val)
|
|||
APICCommonInfo *info;
|
||||
|
||||
if (s) {
|
||||
info = DO_UPCAST(APICCommonInfo, busdev.qdev, s->busdev.qdev.info);
|
||||
info = DO_UPCAST(APICCommonInfo, busdev.qdev, qdev_get_info(&s->busdev.qdev));
|
||||
info->set_tpr(s, val);
|
||||
}
|
||||
}
|
||||
|
@ -89,7 +89,7 @@ void apic_deliver_nmi(DeviceState *d)
|
|||
APICCommonState *s = DO_UPCAST(APICCommonState, busdev.qdev, d);
|
||||
APICCommonInfo *info;
|
||||
|
||||
info = DO_UPCAST(APICCommonInfo, busdev.qdev, s->busdev.qdev.info);
|
||||
info = DO_UPCAST(APICCommonInfo, busdev.qdev, qdev_get_info(&s->busdev.qdev));
|
||||
info->external_nmi(s);
|
||||
}
|
||||
|
||||
|
@ -232,7 +232,7 @@ static int apic_init_common(SysBusDevice *dev)
|
|||
}
|
||||
s->idx = apic_no++;
|
||||
|
||||
info = DO_UPCAST(APICCommonInfo, busdev.qdev, s->busdev.qdev.info);
|
||||
info = DO_UPCAST(APICCommonInfo, busdev.qdev, qdev_get_info(&s->busdev.qdev));
|
||||
info->init(s);
|
||||
|
||||
sysbus_init_mmio(&s->busdev, &s->io_memory);
|
||||
|
@ -243,7 +243,7 @@ static int apic_dispatch_post_load(void *opaque, int version_id)
|
|||
{
|
||||
APICCommonState *s = opaque;
|
||||
APICCommonInfo *info =
|
||||
DO_UPCAST(APICCommonInfo, busdev.qdev, s->busdev.qdev.info);
|
||||
DO_UPCAST(APICCommonInfo, busdev.qdev, qdev_get_info(&s->busdev.qdev));
|
||||
|
||||
if (info->post_load) {
|
||||
info->post_load(s);
|
||||
|
|
|
@ -2921,7 +2921,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 */
|
||||
|
|
|
@ -1182,7 +1182,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);
|
||||
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -49,7 +49,7 @@ static void pic_dispatch_pre_save(void *opaque)
|
|||
{
|
||||
PICCommonState *s = opaque;
|
||||
PICCommonInfo *info =
|
||||
DO_UPCAST(PICCommonInfo, isadev.qdev, s->dev.qdev.info);
|
||||
DO_UPCAST(PICCommonInfo, isadev.qdev, qdev_get_info(&s->dev.qdev));
|
||||
|
||||
if (info->pre_save) {
|
||||
info->pre_save(s);
|
||||
|
@ -60,7 +60,7 @@ static int pic_dispatch_post_load(void *opaque, int version_id)
|
|||
{
|
||||
PICCommonState *s = opaque;
|
||||
PICCommonInfo *info =
|
||||
DO_UPCAST(PICCommonInfo, isadev.qdev, s->dev.qdev.info);
|
||||
DO_UPCAST(PICCommonInfo, isadev.qdev, qdev_get_info(&s->dev.qdev));
|
||||
|
||||
if (info->post_load) {
|
||||
info->post_load(s);
|
||||
|
@ -72,7 +72,7 @@ static int pic_init_common(ISADevice *dev)
|
|||
{
|
||||
PICCommonState *s = DO_UPCAST(PICCommonState, dev, dev);
|
||||
PICCommonInfo *info =
|
||||
DO_UPCAST(PICCommonInfo, isadev.qdev, dev->qdev.info);
|
||||
DO_UPCAST(PICCommonInfo, isadev.qdev, qdev_get_info(&dev->qdev));
|
||||
|
||||
info->init(s);
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@ static void ioapic_dispatch_pre_save(void *opaque)
|
|||
{
|
||||
IOAPICCommonState *s = opaque;
|
||||
IOAPICCommonInfo *info =
|
||||
DO_UPCAST(IOAPICCommonInfo, busdev.qdev, s->busdev.qdev.info);
|
||||
DO_UPCAST(IOAPICCommonInfo, busdev.qdev, qdev_get_info(&s->busdev.qdev));
|
||||
|
||||
if (info->pre_save) {
|
||||
info->pre_save(s);
|
||||
|
@ -51,7 +51,7 @@ static int ioapic_dispatch_post_load(void *opaque, int version_id)
|
|||
{
|
||||
IOAPICCommonState *s = opaque;
|
||||
IOAPICCommonInfo *info =
|
||||
DO_UPCAST(IOAPICCommonInfo, busdev.qdev, s->busdev.qdev.info);
|
||||
DO_UPCAST(IOAPICCommonInfo, busdev.qdev, qdev_get_info(&s->busdev.qdev));
|
||||
|
||||
if (info->post_load) {
|
||||
info->post_load(s);
|
||||
|
@ -69,7 +69,7 @@ static int ioapic_init_common(SysBusDevice *dev)
|
|||
return -1;
|
||||
}
|
||||
|
||||
info = DO_UPCAST(IOAPICCommonInfo, busdev.qdev, s->busdev.qdev.info);
|
||||
info = DO_UPCAST(IOAPICCommonInfo, busdev.qdev, qdev_get_info(&s->busdev.qdev));
|
||||
info->init(s, ioapic_no);
|
||||
|
||||
sysbus_init_mmio(&s->busdev, &s->io_memory);
|
||||
|
|
|
@ -1221,7 +1221,7 @@ static int lan9118_init1(SysBusDevice *dev)
|
|||
qemu_macaddr_default_if_unset(&s->conf.macaddr);
|
||||
|
||||
s->nic = qemu_new_nic(&net_lan9118_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->eeprom[0] = 0xa5;
|
||||
for (i = 0; i < 6; i++) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -240,7 +240,7 @@ static int mipsnet_sysbus_init(SysBusDevice *dev)
|
|||
sysbus_init_irq(dev, &s->irq);
|
||||
|
||||
s->nic = qemu_new_nic(&net_mipsnet_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);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -717,7 +717,7 @@ static int sysbus_open_eth_init(SysBusDevice *dev)
|
|||
sysbus_init_irq(dev, &s->irq);
|
||||
|
||||
s->nic = qemu_new_nic(&net_open_eth_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);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
16
hw/pci.c
16
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);
|
||||
|
@ -1737,10 +1739,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, name, size);
|
||||
vmstate_register_ram(&pdev->rom, &pdev->qdev);
|
||||
|
@ -1981,7 +1983,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;
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -966,7 +966,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;
|
||||
|
||||
|
@ -989,16 +989,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;
|
||||
|
@ -1018,7 +1018,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);
|
||||
|
@ -1039,12 +1039,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);
|
||||
|
@ -1093,7 +1093,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;
|
||||
}
|
||||
|
@ -1165,8 +1165,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) {
|
||||
|
|
70
hw/qdev.c
70
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);
|
||||
|
||||
|
@ -102,9 +115,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);
|
||||
|
@ -117,12 +129,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);
|
||||
}
|
||||
|
@ -355,19 +367,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;
|
||||
}
|
||||
|
@ -386,17 +398,17 @@ 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);
|
||||
|
||||
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;
|
||||
|
@ -447,7 +459,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);
|
||||
|
@ -508,15 +520,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);
|
||||
}
|
||||
|
@ -708,7 +720,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 = ", ";
|
||||
|
@ -723,7 +735,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 = ", ";
|
||||
|
@ -759,12 +771,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;
|
||||
}
|
||||
}
|
||||
|
@ -966,7 +978,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) {
|
||||
|
@ -975,7 +987,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);
|
||||
|
@ -1056,7 +1068,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, "/");
|
||||
|
@ -1078,7 +1090,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)
|
||||
|
@ -1288,7 +1300,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, qdev_release_child_property,
|
||||
|
@ -1340,7 +1352,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);
|
||||
|
|
16
hw/qdev.h
16
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;
|
||||
|
@ -389,9 +391,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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -752,7 +752,7 @@ static int smc91c111_init1(SysBusDevice *dev)
|
|||
sysbus_init_irq(dev, &s->irq);
|
||||
qemu_macaddr_default_if_unset(&s->conf.macaddr);
|
||||
s->nic = qemu_new_nic(&net_smc91c111_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);
|
||||
/* ??? Save/restore. */
|
||||
return 0;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
@ -700,7 +700,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;
|
||||
|
|
|
@ -163,7 +163,7 @@ VIOsPAPRDevice *spapr_vty_get_default(VIOsPAPRBus *bus)
|
|||
selected = NULL;
|
||||
QTAILQ_FOREACH(iter, &bus->bus.children, sibling) {
|
||||
/* Only look at VTY devices */
|
||||
if (iter->info != &spapr_vty.qdev) {
|
||||
if (qdev_get_info(iter) != &spapr_vty.qdev) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
@ -250,7 +250,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");
|
||||
}
|
||||
|
|
|
@ -1114,7 +1114,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);
|
||||
|
||||
|
|
|
@ -1337,7 +1337,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",
|
||||
|
|
|
@ -1777,7 +1777,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;
|
||||
|
|
|
@ -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.");
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -138,7 +138,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;
|
||||
|
@ -373,7 +373,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:
|
||||
|
@ -824,7 +824,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);
|
||||
|
|
|
@ -390,7 +390,7 @@ static int xgmac_enet_init(SysBusDevice *dev)
|
|||
|
||||
qemu_macaddr_default_if_unset(&s->conf.macaddr);
|
||||
s->nic = qemu_new_nic(&net_xgmac_enet_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->regs[XGMAC_ADDR_HIGH(0)] = (s->conf.macaddr.a[5] << 8) |
|
||||
|
|
Loading…
Reference in New Issue