@@ -30,6 +30,13 @@ static void __attribute__((constructor)) do_qemu_init_ ## function(void) \
{ \
register_dso_module_init(function, type); \
}
+
+#define module_init_prio(function, type, prio) \
+static void __attribute__((constructor(prio))) 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) \
@@ -37,6 +44,11 @@ static void __attribute__((constructor)) do_qemu_init_ ## function(void) \
{ \
register_module_init(function, type); \
}
+#define module_init_prio(function, type, prio) \
+static void __attribute__((constructor(prio))) do_qemu_init_ ## function(void) \
+{ \
+ register_module_init(function, type); \
+}
#endif
typedef enum {
@@ -55,7 +67,10 @@ typedef enum {
#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 accel_cpu_init(function) module_init(function, MODULE_INIT_ACCEL_CPU)
+#define accel_cpu_init(function) \
+ module_init_prio(function, MODULE_INIT_ACCEL_CPU, 101)
+#define accel_cpu_init_last(function) \
+ module_init_prio(function, MODULE_INIT_ACCEL_CPU, 65535)
#define trace_init(function) module_init(function, MODULE_INIT_TRACE)
#define xen_backend_init(function) module_init(function, \
MODULE_INIT_XEN_BACKEND)
@@ -7050,8 +7050,16 @@ static TypeInfo x86_base_cpu_type_info = {
*/
void x86_cpu_register_cpu_models(const char *parent_type)
{
+ static bool x86_cpu_models_registered;
int i;
+ if (x86_cpu_models_registered) {
+ /*
+ * already registered by an accelerator-specific specialization
+ * of x86_cpu
+ */
+ return;
+ }
for (i = 0; i < ARRAY_SIZE(builtin_x86_defs); i++) {
x86_register_cpudef(&builtin_x86_defs[i], parent_type);
}
@@ -7060,6 +7068,8 @@ void x86_cpu_register_cpu_models(const char *parent_type)
x86_base_cpu_type_info.parent = parent_type;
type_register(&x86_base_cpu_type_info);
+
+ x86_cpu_models_registered = true;
}
static void x86_cpu_register_base_type(void)
@@ -7077,9 +7087,7 @@ static void x86_cpu_type_init(void)
/*
* I would like something better than this check.
*/
- if (!tcg_enabled() && !kvm_enabled() && !hvf_enabled()) {
- x86_cpu_register_cpu_models(TYPE_X86_CPU);
- }
+ x86_cpu_register_cpu_models(TYPE_X86_CPU);
}
-accel_cpu_init(x86_cpu_type_init);
+accel_cpu_init_last(x86_cpu_type_init);
add a new version of module_init that also takes a priority argument, and use it to be able to run a constructor last for INIT_ACCEL_CPU, and thus avoid the manual work of keeping track how to conditionalize the generic x86 cpu models registration. Signed-off-by: Claudio Fontana <cfontana@suse.de> --- include/qemu/module.h | 17 ++++++++++++++++- target/i386/cpu.c | 16 ++++++++++++---- 2 files changed, 28 insertions(+), 5 deletions(-)