提交 d253e096 编写于 作者: A Anthony Liguori

qdev: allow classes to overload qdev functions

This allows us to drop per-Device registration functions by allowing the
class_init functions to overload qdev methods.
Signed-off-by: NAnthony Liguori <aliguori@us.ibm.com>
上级 6e008585
...@@ -50,21 +50,39 @@ static void qdev_subclass_init(ObjectClass *klass, void *data) ...@@ -50,21 +50,39 @@ static void qdev_subclass_init(ObjectClass *klass, void *data)
DeviceClass *dc = DEVICE_CLASS(klass); DeviceClass *dc = DEVICE_CLASS(klass);
DeviceInfo *info = data; DeviceInfo *info = data;
dc->fw_name = info->fw_name; if (info->fw_name) {
dc->alias = info->alias; dc->fw_name = info->fw_name;
dc->desc = info->desc; }
dc->props = info->props; if (info->alias) {
dc->no_user = info->no_user; dc->alias = info->alias;
}
dc->reset = info->reset; if (info->desc) {
dc->desc = info->desc;
dc->vmsd = info->vmsd; }
if (info->props) {
dc->init = info->init; dc->props = info->props;
dc->unplug = info->unplug; }
dc->exit = info->exit; if (info->no_user) {
dc->bus_info = info->bus_info; dc->no_user = info->no_user;
}
if (info->reset) {
dc->reset = info->reset;
}
if (info->vmsd) {
dc->vmsd = info->vmsd;
}
if (info->init) {
dc->init = info->init;
}
if (info->unplug) {
dc->unplug = info->unplug;
}
if (info->exit) {
dc->exit = info->exit;
}
if (info->bus_info) {
dc->bus_info = info->bus_info;
}
if (info->class_init) { if (info->class_init) {
info->class_init(klass, data); info->class_init(klass, data);
} }
...@@ -131,8 +149,6 @@ static DeviceInfo *qdev_find_info(BusInfo *bus_info, const char *name) ...@@ -131,8 +149,6 @@ static DeviceInfo *qdev_find_info(BusInfo *bus_info, const char *name)
/* first check device names */ /* first check device names */
for (info = device_info_list; info != NULL; info = info->next) { for (info = device_info_list; info != NULL; info = info->next) {
if (bus_info && info->bus_info != bus_info)
continue;
if (strcmp(info->name, name) != 0) if (strcmp(info->name, name) != 0)
continue; continue;
return info; return info;
...@@ -140,8 +156,6 @@ static DeviceInfo *qdev_find_info(BusInfo *bus_info, const char *name) ...@@ -140,8 +156,6 @@ static DeviceInfo *qdev_find_info(BusInfo *bus_info, const char *name)
/* failing that check the aliases */ /* failing that check the aliases */
for (info = device_info_list; info != NULL; info = info->next) { for (info = device_info_list; info != NULL; info = info->next) {
if (bus_info && info->bus_info != bus_info)
continue;
if (!info->alias) if (!info->alias)
continue; continue;
if (strcmp(info->alias, name) != 0) if (strcmp(info->alias, name) != 0)
...@@ -164,7 +178,6 @@ static DeviceState *qdev_create_from_info(BusState *bus, DeviceInfo *info) ...@@ -164,7 +178,6 @@ static DeviceState *qdev_create_from_info(BusState *bus, DeviceInfo *info)
DeviceState *dev; DeviceState *dev;
Property *prop; Property *prop;
assert(bus->info == info->bus_info);
dev = DEVICE(object_new(info->name)); dev = DEVICE(object_new(info->name));
dev->parent_bus = bus; dev->parent_bus = bus;
qdev_prop_set_defaults(dev, qdev_get_props(dev)); qdev_prop_set_defaults(dev, qdev_get_props(dev));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册