module: qom module support

Add support for qom types provided by modules.  For starters use a
manually maintained list which maps qom type to module and prefix.

Two load functions are added:  One to load the module for a specific
type, and one to load all modules (needed for object/device lists as
printed by -- for example -- qemu -device help).

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Message-id: 20200624131045.14512-2-kraxel@redhat.com
This commit is contained in:
Gerd Hoffmann 2020-06-24 15:10:36 +02:00
parent 7623b5ba01
commit 28457744c3
2 changed files with 57 additions and 0 deletions

View File

@ -70,5 +70,7 @@ void register_dso_module_init(void (*fn)(void), module_init_type type);
void module_call_init(module_init_type type); void module_call_init(module_init_type type);
bool module_load_one(const char *prefix, const char *lib_name); bool module_load_one(const char *prefix, const char *lib_name);
void module_load_qom_one(const char *type);
void module_load_qom_all(void);
#endif #endif

View File

@ -245,3 +245,58 @@ bool module_load_one(const char *prefix, const char *lib_name)
#endif #endif
return success; return success;
} }
/*
* Building devices and other qom objects modular is mostly useful in
* case they have dependencies to external shared libraries, so we can
* cut down the core qemu library dependencies. Which is the case for
* only a very few devices & objects.
*
* So with the expectation that this will be rather the exception than
* to rule and the list will not gain that many entries go with a
* simple manually maintained list for now.
*/
static struct {
const char *type;
const char *prefix;
const char *module;
} const qom_modules[] = {
};
static bool module_loaded_qom_all;
void module_load_qom_one(const char *type)
{
int i;
if (module_loaded_qom_all) {
return;
}
for (i = 0; i < ARRAY_SIZE(qom_modules); i++) {
if (strcmp(qom_modules[i].type, type) == 0) {
module_load_one(qom_modules[i].prefix,
qom_modules[i].module);
return;
}
}
}
void module_load_qom_all(void)
{
int i;
if (module_loaded_qom_all) {
return;
}
for (i = 0; i < ARRAY_SIZE(qom_modules); i++) {
if (i > 0 && (strcmp(qom_modules[i - 1].module,
qom_modules[i].module) == 0 &&
strcmp(qom_modules[i - 1].prefix,
qom_modules[i].prefix) == 0)) {
/* one module implementing multiple types -> load only once */
continue;
}
module_load_one(qom_modules[i].prefix, qom_modules[i].module);
}
module_loaded_qom_all = true;
}