2009-05-14 18:29:53 +00:00
|
|
|
/*
|
|
|
|
* QEMU Module Infrastructure
|
|
|
|
*
|
|
|
|
* Copyright IBM, Corp. 2009
|
|
|
|
*
|
|
|
|
* Authors:
|
|
|
|
* Anthony Liguori <aliguori@us.ibm.com>
|
|
|
|
*
|
|
|
|
* This work is licensed under the terms of the GNU GPL, version 2. See
|
|
|
|
* the COPYING file in the top-level directory.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef QEMU_MODULE_H
|
|
|
|
#define QEMU_MODULE_H
|
|
|
|
|
2014-02-10 06:48:57 +00:00
|
|
|
|
|
|
|
#define DSO_STAMP_FUN glue(qemu_stamp, CONFIG_STAMP)
|
|
|
|
#define DSO_STAMP_FUN_STR stringify(DSO_STAMP_FUN)
|
|
|
|
|
|
|
|
#ifdef BUILD_DSO
|
|
|
|
void DSO_STAMP_FUN(void);
|
|
|
|
/* This is a dummy symbol to identify a loaded DSO as a QEMU module, so we can
|
|
|
|
* distinguish "version mismatch" from "not a QEMU module", when the stamp
|
|
|
|
* check fails during module loading */
|
|
|
|
void qemu_module_dummy(void);
|
|
|
|
|
|
|
|
#define module_init(function, type) \
|
|
|
|
static void __attribute__((constructor)) do_qemu_init_ ## function(void) \
|
|
|
|
{ \
|
|
|
|
register_dso_module_init(function, type); \
|
|
|
|
}
|
|
|
|
#else
|
2009-05-14 18:29:53 +00:00
|
|
|
/* This should not be used directly. Use block_init etc. instead. */
|
|
|
|
#define module_init(function, type) \
|
2014-02-10 06:48:57 +00:00
|
|
|
static void __attribute__((constructor)) do_qemu_init_ ## function(void) \
|
|
|
|
{ \
|
2009-05-14 22:57:31 +00:00
|
|
|
register_module_init(function, type); \
|
2009-05-14 18:29:53 +00:00
|
|
|
}
|
2014-02-10 06:48:57 +00:00
|
|
|
#endif
|
2009-05-14 18:29:53 +00:00
|
|
|
|
|
|
|
typedef enum {
|
2020-01-22 17:55:02 +00:00
|
|
|
MODULE_INIT_MIGRATION,
|
2009-05-14 18:29:53 +00:00
|
|
|
MODULE_INIT_BLOCK,
|
2016-02-16 20:59:07 +00:00
|
|
|
MODULE_INIT_OPTS,
|
2012-02-09 14:20:55 +00:00
|
|
|
MODULE_INIT_QOM,
|
2016-10-04 13:35:52 +00:00
|
|
|
MODULE_INIT_TRACE,
|
2019-01-08 14:49:00 +00:00
|
|
|
MODULE_INIT_XEN_BACKEND,
|
2018-06-13 15:07:21 +00:00
|
|
|
MODULE_INIT_LIBQOS,
|
2020-02-20 04:11:00 +00:00
|
|
|
MODULE_INIT_FUZZ_TARGET,
|
2009-05-14 22:57:31 +00:00
|
|
|
MODULE_INIT_MAX
|
2009-05-14 18:29:53 +00:00
|
|
|
} module_init_type;
|
|
|
|
|
|
|
|
#define block_init(function) module_init(function, MODULE_INIT_BLOCK)
|
2016-02-16 20:59:07 +00:00
|
|
|
#define opts_init(function) module_init(function, MODULE_INIT_OPTS)
|
2012-02-09 14:20:55 +00:00
|
|
|
#define type_init(function) module_init(function, MODULE_INIT_QOM)
|
2016-10-04 13:35:52 +00:00
|
|
|
#define trace_init(function) module_init(function, MODULE_INIT_TRACE)
|
2019-01-08 14:49:00 +00:00
|
|
|
#define xen_backend_init(function) module_init(function, \
|
|
|
|
MODULE_INIT_XEN_BACKEND)
|
2018-06-13 15:07:21 +00:00
|
|
|
#define libqos_init(function) module_init(function, MODULE_INIT_LIBQOS)
|
2020-02-20 04:11:00 +00:00
|
|
|
#define fuzz_target_init(function) module_init(function, \
|
|
|
|
MODULE_INIT_FUZZ_TARGET)
|
2020-01-22 17:55:02 +00:00
|
|
|
#define migration_init(function) module_init(function, MODULE_INIT_MIGRATION)
|
2020-09-23 09:12:17 +00:00
|
|
|
#define block_module_load_one(lib) module_load_one("block-", lib, false)
|
|
|
|
#define ui_module_load_one(lib) module_load_one("ui-", lib, false)
|
|
|
|
#define audio_module_load_one(lib) module_load_one("audio-", lib, false)
|
blockdev: Add dynamic module loading for block drivers
Extend the current module interface to allow for block drivers to be
loaded dynamically on request. The only block drivers that can be
converted into modules are the drivers that don't perform any init
operation except for registering themselves.
In addition, only the protocol drivers are being modularized, as they
are the only ones which see significant performance benefits. The format
drivers do not generally link to external libraries, so modularizing
them is of no benefit from a performance perspective.
All the necessary module information is located in a new structure found
in module_block.h
This spoils the purpose of 5505e8b76f (block/dmg: make it modular).
Before this patch, if module build is enabled, block-dmg.so is linked to
libbz2, whereas the main binary is not. In downstream, theoretically, it
means only the qemu-block-extra package depends on libbz2, while the
main QEMU package needn't to. With this patch, we (temporarily) change
the case so that the main QEMU depends on libbz2 again.
Signed-off-by: Marc Marí <markmb@redhat.com>
Signed-off-by: Colin Lord <clord@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Message-id: 1471008424-16465-4-git-send-email-clord@redhat.com
Reviewed-by: Max Reitz <mreitz@redhat.com>
[mreitz: Do a signed comparison against the length of
block_driver_modules[], so it will not cause a compile error when
empty]
Signed-off-by: Max Reitz <mreitz@redhat.com>
2016-08-12 13:27:03 +00:00
|
|
|
|
2009-05-14 18:29:53 +00:00
|
|
|
void register_module_init(void (*fn)(void), module_init_type type);
|
2014-02-10 06:48:57 +00:00
|
|
|
void register_dso_module_init(void (*fn)(void), module_init_type type);
|
2009-05-14 18:29:53 +00:00
|
|
|
|
|
|
|
void module_call_init(module_init_type type);
|
2020-09-23 09:12:17 +00:00
|
|
|
bool module_load_one(const char *prefix, const char *lib_name, bool mayfail);
|
2020-06-24 13:10:36 +00:00
|
|
|
void module_load_qom_one(const char *type);
|
|
|
|
void module_load_qom_all(void);
|
2021-06-24 10:38:20 +00:00
|
|
|
void module_allow_arch(const char *arch);
|
2009-05-14 18:29:53 +00:00
|
|
|
|
2021-06-24 10:38:03 +00:00
|
|
|
/**
|
|
|
|
* DOC: module info annotation macros
|
|
|
|
*
|
|
|
|
* `scripts/modinfo-collect.py` will collect module info,
|
|
|
|
* using the preprocessor and -DQEMU_MODINFO.
|
|
|
|
*
|
|
|
|
* `scripts/modinfo-generate.py` will create a module meta-data database
|
|
|
|
* from the collected information so qemu knows about module
|
|
|
|
* dependencies and QOM objects implemented by modules.
|
|
|
|
*
|
|
|
|
* See `*.modinfo` and `modinfo.c` in the build directory to check the
|
|
|
|
* script results.
|
|
|
|
*/
|
|
|
|
#ifdef QEMU_MODINFO
|
|
|
|
# define modinfo(kind, value) \
|
|
|
|
MODINFO_START kind value MODINFO_END
|
|
|
|
#else
|
|
|
|
# define modinfo(kind, value)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/**
|
|
|
|
* module_obj
|
|
|
|
*
|
|
|
|
* @name: QOM type.
|
|
|
|
*
|
|
|
|
* This module implements QOM type @name.
|
|
|
|
*/
|
|
|
|
#define module_obj(name) modinfo(obj, name)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* module_dep
|
|
|
|
*
|
|
|
|
* @name: module name
|
|
|
|
*
|
|
|
|
* This module depends on module @name.
|
|
|
|
*/
|
|
|
|
#define module_dep(name) modinfo(dep, name)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* module_arch
|
|
|
|
*
|
|
|
|
* @name: target architecture
|
|
|
|
*
|
|
|
|
* This module is for target architecture @arch.
|
|
|
|
*
|
|
|
|
* Note that target-dependent modules are tagged automatically, so
|
|
|
|
* this is only needed in case target-independent modules should be
|
|
|
|
* restricted. Use case example: the ccw bus is implemented by s390x
|
|
|
|
* only.
|
|
|
|
*/
|
|
|
|
#define module_arch(name) modinfo(arch, name)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* module_opts
|
|
|
|
*
|
|
|
|
* @name: QemuOpts name
|
|
|
|
*
|
|
|
|
* This module registers QemuOpts @name.
|
|
|
|
*/
|
|
|
|
#define module_opts(name) modinfo(opts, name)
|
|
|
|
|
2021-06-24 10:38:05 +00:00
|
|
|
/*
|
|
|
|
* module info database
|
|
|
|
*
|
|
|
|
* scripts/modinfo-generate.c will build this using the data collected
|
|
|
|
* by scripts/modinfo-collect.py
|
|
|
|
*/
|
|
|
|
typedef struct QemuModinfo QemuModinfo;
|
|
|
|
struct QemuModinfo {
|
|
|
|
const char *name;
|
|
|
|
const char *arch;
|
|
|
|
const char **objs;
|
|
|
|
const char **deps;
|
|
|
|
const char **opts;
|
|
|
|
};
|
|
|
|
extern const QemuModinfo qemu_modinfo[];
|
|
|
|
void module_init_info(const QemuModinfo *info);
|
|
|
|
|
2009-05-14 18:29:53 +00:00
|
|
|
#endif
|