QOM TYPE_INTERFACE was registered with device_init(), whose constructors are executed rather late in vl.c's main().
Introduce a new module init type and register it very early so that QOM can safely be used for machines and CPUs. Note that *_init() defines an attributed function, so no semicolon is needed after the brace. Signed-off-by: Andreas Färber <afaer...@suse.de> Cc: Anthony Liguori <aligu...@us.ibm.com> --- module.h | 2 ++ qom/object.c | 2 +- vl.c | 2 ++ 3 files changed, 5 insertions(+), 1 deletions(-) diff --git a/module.h b/module.h index ef66730..567ff3a 100644 --- a/module.h +++ b/module.h @@ -21,6 +21,7 @@ static void __attribute__((constructor)) do_qemu_init_ ## function(void) { \ } typedef enum { + MODULE_INIT_EARLY, MODULE_INIT_BLOCK, MODULE_INIT_DEVICE, MODULE_INIT_MACHINE, @@ -28,6 +29,7 @@ typedef enum { MODULE_INIT_MAX } module_init_type; +#define early_init(function) module_init(function, MODULE_INIT_EARLY) #define block_init(function) module_init(function, MODULE_INIT_BLOCK) #define device_init(function) module_init(function, MODULE_INIT_DEVICE) #define machine_init(function) module_init(function, MODULE_INIT_MACHINE) diff --git a/qom/object.c b/qom/object.c index 1821959..3c79e1d 100644 --- a/qom/object.c +++ b/qom/object.c @@ -388,7 +388,7 @@ static void register_interface(void) type_register_static(&interface_info); } -device_init(register_interface); +early_init(register_interface) Object *object_dynamic_cast_assert(Object *obj, const char *typename) { diff --git a/vl.c b/vl.c index d88a18c..379ca4e 100644 --- a/vl.c +++ b/vl.c @@ -2208,6 +2208,8 @@ int main(int argc, char **argv, char **envp) #endif } + module_call_init(MODULE_INIT_EARLY); + runstate_init(); init_clocks(); -- 1.7.7