Commit 7ab6e7fc authored by Gerd Hoffmann's avatar Gerd Hoffmann
Browse files

qdev: device module support



Hook module loading into the places where we
need it when building devices as modules.

Signed-off-by: default avatarGerd Hoffmann <kraxel@redhat.com>
Message-id: 20200624131045.14512-4-kraxel@redhat.com
parent 0f8198f1
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -137,6 +137,9 @@ void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
 */
DeviceState *qdev_new(const char *name)
{
    if (!object_class_by_name(name)) {
        module_load_qom_one(name);
    }
    return DEVICE(object_new(name));
}

@@ -147,10 +150,9 @@ DeviceState *qdev_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 DEVICE(object_new(name));
}

+3 −2
Original line number Diff line number Diff line
@@ -147,6 +147,7 @@ static void qdev_print_devinfos(bool show_no_user)
    int i;
    bool cat_printed;

    module_load_qom_all();
    list = object_class_get_list_sorted(TYPE_DEVICE, false);

    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;
    const char *original_name = *driver;

    oc = object_class_by_name(*driver);
    oc = module_object_class_by_name(*driver);
    if (!oc) {
        const char *typename = find_typename_by_alias(*driver);

        if (typename) {
            *driver = typename;
            oc = object_class_by_name(*driver);
            oc = module_object_class_by_name(*driver);
        }
    }

+2 −1
Original line number Diff line number Diff line
@@ -116,6 +116,7 @@ ObjectTypeInfoList *qmp_qom_list_types(bool has_implements,
{
    ObjectTypeInfoList *ret = NULL;

    module_load_qom_all();
    object_class_foreach(qom_list_types_tramp, implements, abstract, &ret);

    return ret;
@@ -130,7 +131,7 @@ ObjectPropertyInfoList *qmp_device_list_properties(const char *typename,
    ObjectPropertyIterator iter;
    ObjectPropertyInfoList *prop_list = NULL;

    klass = object_class_by_name(typename);
    klass = module_object_class_by_name(typename);
    if (klass == NULL) {
        error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
                  "Device '%s' not found", typename);
+2 −2
Original line number Diff line number Diff line
@@ -1772,8 +1772,8 @@ static bool vga_interface_available(VGAInterfaceType t)

    assert(t < VGA_TYPE_MAX);
    return !ti->class_names[0] ||
           object_class_by_name(ti->class_names[0]) ||
           object_class_by_name(ti->class_names[1]);
           module_object_class_by_name(ti->class_names[0]) ||
           module_object_class_by_name(ti->class_names[1]);
}

static const char *