mirror of https://github.com/xemu-project/xemu.git
qdev: device module support
Hook module loading into the places where we need it when building devices as modules. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Message-id: 20200624131045.14512-4-kraxel@redhat.com
This commit is contained in:
parent
0f8198f1b2
commit
7ab6e7fcce
|
@ -137,6 +137,9 @@ void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
|
||||||
*/
|
*/
|
||||||
DeviceState *qdev_new(const char *name)
|
DeviceState *qdev_new(const char *name)
|
||||||
{
|
{
|
||||||
|
if (!object_class_by_name(name)) {
|
||||||
|
module_load_qom_one(name);
|
||||||
|
}
|
||||||
return DEVICE(object_new(name));
|
return DEVICE(object_new(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -147,10 +150,9 @@ DeviceState *qdev_new(const char *name)
|
||||||
*/
|
*/
|
||||||
DeviceState *qdev_try_new(const char *name)
|
DeviceState *qdev_try_new(const char *name)
|
||||||
{
|
{
|
||||||
if (!object_class_by_name(name)) {
|
if (!module_object_class_by_name(name)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return DEVICE(object_new(name));
|
return DEVICE(object_new(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -147,6 +147,7 @@ static void qdev_print_devinfos(bool show_no_user)
|
||||||
int i;
|
int i;
|
||||||
bool cat_printed;
|
bool cat_printed;
|
||||||
|
|
||||||
|
module_load_qom_all();
|
||||||
list = object_class_get_list_sorted(TYPE_DEVICE, false);
|
list = object_class_get_list_sorted(TYPE_DEVICE, false);
|
||||||
|
|
||||||
for (i = 0; i <= DEVICE_CATEGORY_MAX; i++) {
|
for (i = 0; i <= DEVICE_CATEGORY_MAX; i++) {
|
||||||
|
@ -215,13 +216,13 @@ static DeviceClass *qdev_get_device_class(const char **driver, Error **errp)
|
||||||
DeviceClass *dc;
|
DeviceClass *dc;
|
||||||
const char *original_name = *driver;
|
const char *original_name = *driver;
|
||||||
|
|
||||||
oc = object_class_by_name(*driver);
|
oc = module_object_class_by_name(*driver);
|
||||||
if (!oc) {
|
if (!oc) {
|
||||||
const char *typename = find_typename_by_alias(*driver);
|
const char *typename = find_typename_by_alias(*driver);
|
||||||
|
|
||||||
if (typename) {
|
if (typename) {
|
||||||
*driver = typename;
|
*driver = typename;
|
||||||
oc = object_class_by_name(*driver);
|
oc = module_object_class_by_name(*driver);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -116,6 +116,7 @@ ObjectTypeInfoList *qmp_qom_list_types(bool has_implements,
|
||||||
{
|
{
|
||||||
ObjectTypeInfoList *ret = NULL;
|
ObjectTypeInfoList *ret = NULL;
|
||||||
|
|
||||||
|
module_load_qom_all();
|
||||||
object_class_foreach(qom_list_types_tramp, implements, abstract, &ret);
|
object_class_foreach(qom_list_types_tramp, implements, abstract, &ret);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -130,7 +131,7 @@ ObjectPropertyInfoList *qmp_device_list_properties(const char *typename,
|
||||||
ObjectPropertyIterator iter;
|
ObjectPropertyIterator iter;
|
||||||
ObjectPropertyInfoList *prop_list = NULL;
|
ObjectPropertyInfoList *prop_list = NULL;
|
||||||
|
|
||||||
klass = object_class_by_name(typename);
|
klass = module_object_class_by_name(typename);
|
||||||
if (klass == NULL) {
|
if (klass == NULL) {
|
||||||
error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
|
error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
|
||||||
"Device '%s' not found", typename);
|
"Device '%s' not found", typename);
|
||||||
|
|
|
@ -1772,8 +1772,8 @@ static bool vga_interface_available(VGAInterfaceType t)
|
||||||
|
|
||||||
assert(t < VGA_TYPE_MAX);
|
assert(t < VGA_TYPE_MAX);
|
||||||
return !ti->class_names[0] ||
|
return !ti->class_names[0] ||
|
||||||
object_class_by_name(ti->class_names[0]) ||
|
module_object_class_by_name(ti->class_names[0]) ||
|
||||||
object_class_by_name(ti->class_names[1]);
|
module_object_class_by_name(ti->class_names[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
|
|
Loading…
Reference in New Issue