81d8ccb1be
Let the caller know of load success. Note that this also changes slightly the behaviour of the function to try loading on subsequent calls if the previous ones failed. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
71 lines
2.5 KiB
C
71 lines
2.5 KiB
C
/*
|
|
* 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
|
|
|
|
|
|
#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
|
|
/* This should not be used directly. Use block_init etc. instead. */
|
|
#define module_init(function, type) \
|
|
static void __attribute__((constructor)) do_qemu_init_ ## function(void) \
|
|
{ \
|
|
register_module_init(function, type); \
|
|
}
|
|
#endif
|
|
|
|
typedef enum {
|
|
MODULE_INIT_BLOCK,
|
|
MODULE_INIT_OPTS,
|
|
MODULE_INIT_QOM,
|
|
MODULE_INIT_TRACE,
|
|
MODULE_INIT_XEN_BACKEND,
|
|
MODULE_INIT_LIBQOS,
|
|
MODULE_INIT_MAX
|
|
} module_init_type;
|
|
|
|
#define block_init(function) module_init(function, MODULE_INIT_BLOCK)
|
|
#define opts_init(function) module_init(function, MODULE_INIT_OPTS)
|
|
#define type_init(function) module_init(function, MODULE_INIT_QOM)
|
|
#define trace_init(function) module_init(function, MODULE_INIT_TRACE)
|
|
#define xen_backend_init(function) module_init(function, \
|
|
MODULE_INIT_XEN_BACKEND)
|
|
#define libqos_init(function) module_init(function, MODULE_INIT_LIBQOS)
|
|
|
|
#define block_module_load_one(lib) module_load_one("block-", lib)
|
|
#define ui_module_load_one(lib) module_load_one("ui-", lib)
|
|
#define audio_module_load_one(lib) module_load_one("audio-", lib)
|
|
|
|
void register_module_init(void (*fn)(void), module_init_type type);
|
|
void register_dso_module_init(void (*fn)(void), module_init_type type);
|
|
|
|
void module_call_init(module_init_type type);
|
|
bool module_load_one(const char *prefix, const char *lib_name);
|
|
|
|
#endif
|