@@ -844,6 +844,11 @@ CPUState *pc_new_cpu(int cpu, const char *cpu_model, int pci_enabled)
if (pci_enabled) {
apic_init(env);
}
+
+ /* kvm needs this to run after the apic is initialized. Otherwise,
+ * it can access invalid state and crash.
+ */
+ qemu_init_vcpu(env);
return env;
}
@@ -527,6 +527,8 @@ int kvm_arch_qemu_init_env(CPUState *cenv)
CPUState copy;
uint32_t i, j, limit;
+ qemu_kvm_load_lapic(cenv);
+
copy = *cenv;
#ifdef KVM_CPUID_SIGNATURE
@@ -1699,7 +1699,5 @@ CPUX86State *cpu_x86_init(const char *cpu_model)
kqemu_init(env);
#endif
- qemu_init_vcpu(env);
-
return env;
}
KVM access some state that is only present late in cpu initialization. This happens in kvm_vcpu_init(). APIC is an example of that. So we have to make sure that kvm_vcpu_init is the last thing called in the initialization process. We also have to explicitly call qemu_kvm_load_apic(), since the first call will find the vcpu non initialized. Signed-off-by: Glauber Costa <glommer@redhat.com> --- hw/pc.c | 5 +++++ qemu-kvm-x86.c | 2 ++ target-i386/helper.c | 2 -- 3 files changed, 7 insertions(+), 2 deletions(-)