diff options
author | Anthony Liguori <aliguori@us.ibm.com> | 2011-12-09 12:08:01 -0600 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2012-02-03 10:41:05 -0600 |
commit | 18b6dade8c0799c48f5c5e124b8c407cd5e22e96 (patch) | |
tree | 542fbd189d42cba0199d4dcc8c92d48ce632a8c0 | |
parent | d253e0961965262d30843b7a0eefa687d5cbc85d (diff) |
qdev: refactor device creation to allow bus_info to be set only in class
As we use class_init to set class members, DeviceInfo no longer holds this
information.
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
-rw-r--r-- | hw/qdev.c | 42 |
1 files changed, 19 insertions, 23 deletions
@@ -119,21 +119,29 @@ const char *qdev_fw_name(DeviceState *dev) return object_get_typename(OBJECT(dev)); } -void qdev_register_subclass(DeviceInfo *info, const char *parent) +static void qdev_do_register_subclass(DeviceInfo *info, const char *parent, + const char *name) { TypeInfo type_info = {}; assert(info->size >= sizeof(DeviceState)); assert(!info->next); - type_info.name = info->name; + type_info.name = name; type_info.parent = parent; type_info.instance_size = info->size; type_info.class_init = qdev_subclass_init; type_info.class_data = info; type_register_static(&type_info); +} +void qdev_register_subclass(DeviceInfo *info, const char *parent) +{ + qdev_do_register_subclass(info, parent, info->name); + if (info->alias) { + qdev_do_register_subclass(info, parent, info->alias); + } info->next = device_info_list; device_info_list = info; } @@ -173,12 +181,12 @@ bool qdev_exists(const char *name) static void qdev_property_add_legacy(DeviceState *dev, Property *prop, Error **errp); -static DeviceState *qdev_create_from_info(BusState *bus, DeviceInfo *info) +static DeviceState *qdev_create_from_info(BusState *bus, const char *typename) { DeviceState *dev; Property *prop; - dev = DEVICE(object_new(info->name)); + dev = DEVICE(object_new(typename)); dev->parent_bus = bus; qdev_prop_set_defaults(dev, qdev_get_props(dev)); qdev_prop_set_defaults(dev, dev->parent_bus->info->props); @@ -230,18 +238,11 @@ DeviceState *qdev_create(BusState *bus, const char *name) DeviceState *qdev_try_create(BusState *bus, const char *name) { - DeviceInfo *info; - if (!bus) { bus = sysbus_get_default(); } - info = qdev_find_info(bus->info, name); - if (!info) { - return NULL; - } - - return qdev_create_from_info(bus, info); + return qdev_create_from_info(bus, name); } static void qdev_print_devinfo(DeviceInfo *info) @@ -352,8 +353,8 @@ static DeviceState *qdev_get_peripheral_anon(void) DeviceState *qdev_device_add(QemuOpts *opts) { + DeviceClass *k; const char *driver, *path, *id; - DeviceInfo *info; DeviceState *qdev; BusState *bus; @@ -364,12 +365,7 @@ DeviceState *qdev_device_add(QemuOpts *opts) } /* find driver */ - info = qdev_find_info(NULL, driver); - if (!info || info->no_user) { - qerror_report(QERR_INVALID_PARAMETER_VALUE, "driver", "a driver name"); - error_printf_unless_qmp("Try with argument '?' for a list.\n"); - return NULL; - } + k = DEVICE_CLASS(object_class_by_name(driver)); /* find bus */ path = qemu_opt_get(opts, "bus"); @@ -378,16 +374,16 @@ DeviceState *qdev_device_add(QemuOpts *opts) if (!bus) { return NULL; } - if (bus->info != info->bus_info) { + if (bus->info != k->bus_info) { qerror_report(QERR_BAD_BUS_FOR_DEVICE, driver, bus->info->name); return NULL; } } else { - bus = qbus_find_recursive(main_system_bus, NULL, info->bus_info); + bus = qbus_find_recursive(main_system_bus, NULL, k->bus_info); if (!bus) { qerror_report(QERR_NO_BUS_FOR_DEVICE, - info->name, info->bus_info->name); + driver, k->bus_info->name); return NULL; } } @@ -397,7 +393,7 @@ DeviceState *qdev_device_add(QemuOpts *opts) } /* create device, set properties */ - qdev = qdev_create_from_info(bus, info); + qdev = qdev_create_from_info(bus, driver); id = qemu_opts_id(opts); if (id) { qdev->id = id; |