static void qdev_subclass_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
+ DeviceInfo *info = data;
- dc->info = data;
- dc->reset = dc->info->reset;
+ dc->fw_name = info->fw_name;
+ dc->alias = info->alias;
+ dc->desc = info->desc;
+ dc->props = info->props;
+ dc->no_user = info->no_user;
- /* Poison to try to detect future uses */
- dc->info->reset = NULL;
+ dc->reset = info->reset;
- if (dc->info->class_init) {
- dc->info->class_init(klass, data);
- }
-}
+ dc->vmsd = info->vmsd;
-static DeviceInfo *qdev_get_info(DeviceState *dev)
-{
- return DEVICE_GET_CLASS(dev)->info;
+ dc->init = info->init;
+ dc->unplug = info->unplug;
+ dc->exit = info->exit;
+ dc->bus_info = info->bus_info;
+
+ if (info->class_init) {
+ info->class_init(klass, data);
+ }
}
const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
{
- return qdev_get_info(dev)->vmsd;
+ DeviceClass *dc = DEVICE_GET_CLASS(dev);
+ return dc->vmsd;
}
BusInfo *qdev_get_bus_info(DeviceState *dev)
{
- return qdev_get_info(dev)->bus_info;
+ DeviceClass *dc = DEVICE_GET_CLASS(dev);
+ return dc->bus_info;
}
Property *qdev_get_props(DeviceState *dev)
{
- return qdev_get_info(dev)->props;
+ DeviceClass *dc = DEVICE_GET_CLASS(dev);
+ return dc->props;
}
const char *qdev_fw_name(DeviceState *dev)
{
- DeviceInfo *info = qdev_get_info(dev);
+ DeviceClass *dc = DEVICE_GET_CLASS(dev);
- if (info->fw_name) {
- return info->fw_name;
- } else if (info->alias) {
- return info->alias;
+ if (dc->fw_name) {
+ return dc->fw_name;
+ } else if (dc->alias) {
+ return dc->alias;
}
return object_get_typename(OBJECT(dev));
assert(bus->info == info->bus_info);
dev = DEVICE(object_new(info->name));
dev->parent_bus = bus;
- qdev_prop_set_defaults(dev, qdev_get_info(dev)->props);
+ qdev_prop_set_defaults(dev, qdev_get_props(dev));
qdev_prop_set_defaults(dev, dev->parent_bus->info->props);
qdev_prop_set_globals(dev);
QTAILQ_INSERT_HEAD(&bus->children, dev, sibling);
QTAILQ_INIT(&dev->properties);
dev->state = DEV_STATE_CREATED;
- for (prop = qdev_get_info(dev)->props; prop && prop->name; prop++) {
+ for (prop = qdev_get_props(dev); prop && prop->name; prop++) {
qdev_property_add_legacy(dev, prop, NULL);
qdev_property_add_static(dev, prop, NULL);
}
- for (prop = qdev_get_info(dev)->bus_info->props; prop && prop->name; prop++) {
+ for (prop = qdev_get_bus_info(dev)->props; prop && prop->name; prop++) {
qdev_property_add_legacy(dev, prop, NULL);
qdev_property_add_static(dev, prop, NULL);
}
Return 0 on success. */
int qdev_init(DeviceState *dev)
{
+ DeviceClass *dc = DEVICE_GET_CLASS(dev);
int rc;
assert(dev->state == DEV_STATE_CREATED);
- rc = qdev_get_info(dev)->init(dev, qdev_get_info(dev));
+
+ /* FIXME hopefully this doesn't break anything */
+ rc = dc->init(dev, NULL);
if (rc < 0) {
qdev_free(dev);
return rc;
}
- if (qdev_get_info(dev)->vmsd) {
- vmstate_register_with_alias_id(dev, -1, qdev_get_info(dev)->vmsd, dev,
+ if (qdev_get_vmsd(dev)) {
+ vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
dev->instance_id_alias,
dev->alias_required_for_version);
}
int qdev_unplug(DeviceState *dev)
{
+ DeviceClass *dc = DEVICE_GET_CLASS(dev);
+
if (!dev->parent_bus->allow_hotplug) {
qerror_report(QERR_BUS_NO_HOTPLUG, dev->parent_bus->name);
return -1;
}
- assert(qdev_get_info(dev)->unplug != NULL);
+ assert(dc->unplug != NULL);
qdev_hot_removed = true;
- return qdev_get_info(dev)->unplug(dev);
+ return dc->unplug(dev);
}
static int qdev_reset_one(DeviceState *dev, void *opaque)
way is somewhat unclean, and best avoided. */
void qdev_init_nofail(DeviceState *dev)
{
- DeviceInfo *info = qdev_get_info(dev);
-
if (qdev_init(dev) < 0) {
- error_report("Initialization of device %s failed", info->name);
+ error_report("Initialization of device %s failed",
+ object_get_typename(OBJECT(dev)));
exit(1);
}
}
{
BusState *bus;
Property *prop;
+ DeviceClass *dc = DEVICE_GET_CLASS(dev);
qdev_property_del_all(dev);
bus = QLIST_FIRST(&dev->child_bus);
qbus_free(bus);
}
- 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)
+ if (qdev_get_vmsd(dev)) {
+ vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
+ }
+ if (dc->exit) {
+ dc->exit(dev);
+ }
+ if (dev->opts) {
qemu_opts_del(dev->opts);
+ }
}
QTAILQ_REMOVE(&dev->parent_bus->children, dev, sibling);
- for (prop = qdev_get_info(dev)->props; prop && prop->name; prop++) {
+ for (prop = qdev_get_props(dev); prop && prop->name; prop++) {
if (prop->info->free) {
prop->info->free(dev, prop);
}
}
}
QTAILQ_FOREACH(dev, &bus->children, sibling) {
- if (qdev_get_info(dev)->alias && strcmp(qdev_get_info(dev)->alias, elem) == 0) {
+ DeviceClass *dc = DEVICE_GET_CLASS(dev);
+
+ if (dc->alias && strcmp(dc->alias, elem) == 0) {
return dev;
}
}
if (dev->num_gpio_out) {
qdev_printf("gpio-out %d\n", dev->num_gpio_out);
}
- qdev_print_props(mon, dev, qdev_get_info(dev)->props, "dev", indent);
+ qdev_print_props(mon, dev, qdev_get_props(dev), "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);