|
@@ -194,6 +194,11 @@ static void cpu_common_parse_features(const char *typename, char *features,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void qemu_plugin_vcpu_init__async(CPUState *cpu, run_on_cpu_data unused)
|
|
|
+{
|
|
|
+ qemu_plugin_vcpu_init_hook(cpu);
|
|
|
+}
|
|
|
+
|
|
|
static void cpu_common_realizefn(DeviceState *dev, Error **errp)
|
|
|
{
|
|
|
CPUState *cpu = CPU(dev);
|
|
@@ -217,9 +222,9 @@ static void cpu_common_realizefn(DeviceState *dev, Error **errp)
|
|
|
cpu_resume(cpu);
|
|
|
}
|
|
|
|
|
|
- /* Plugin initialization must wait until the cpu is fully realized. */
|
|
|
+ /* Plugin initialization must wait until the cpu start executing code */
|
|
|
if (tcg_enabled()) {
|
|
|
- qemu_plugin_vcpu_init_hook(cpu);
|
|
|
+ async_run_on_cpu(cpu, qemu_plugin_vcpu_init__async, RUN_ON_CPU_NULL);
|
|
|
}
|
|
|
|
|
|
/* NOTE: latest generic point where the cpu is fully realized */
|