aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hw/apic.c3
-rw-r--r--kvm-all.c36
-rw-r--r--kvm.h1
-rw-r--r--vl.c11
4 files changed, 16 insertions, 35 deletions
diff --git a/hw/apic.c b/hw/apic.c
index 3ec4156cf2..cb9f8ee04d 100644
--- a/hw/apic.c
+++ b/hw/apic.c
@@ -23,6 +23,7 @@
#include "msix.h"
#include "qemu-timer.h"
#include "host-utils.h"
+#include "kvm.h"
//#define DEBUG_APIC
@@ -953,6 +954,8 @@ static void apic_reset(void *opaque)
*/
s->lvt[APIC_LVT_LINT0] = 0x700;
}
+
+ cpu_synchronize_state(s->cpu_env, 1);
}
static CPUReadMemoryFunc *apic_mem_read[3] = {
diff --git a/kvm-all.c b/kvm-all.c
index d843338f39..017296bc0e 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -143,6 +143,15 @@ static int kvm_set_user_memory_region(KVMState *s, KVMSlot *slot)
return kvm_vm_ioctl(s, KVM_SET_USER_MEMORY_REGION, &mem);
}
+static void kvm_reset_vcpu(void *opaque)
+{
+ CPUState *env = opaque;
+
+ if (kvm_arch_put_registers(env)) {
+ fprintf(stderr, "Fatal: kvm vcpu reset failed\n");
+ abort();
+ }
+}
int kvm_init_vcpu(CPUState *env)
{
@@ -176,7 +185,10 @@ int kvm_init_vcpu(CPUState *env)
}
ret = kvm_arch_init_vcpu(env);
-
+ if (ret == 0) {
+ qemu_register_reset(kvm_reset_vcpu, 0, env);
+ ret = kvm_arch_put_registers(env);
+ }
err:
return ret;
}
@@ -201,21 +213,6 @@ int kvm_get_mp_state(CPUState *env)
return 0;
}
-int kvm_sync_vcpus(void)
-{
- CPUState *env;
-
- for (env = first_cpu; env != NULL; env = env->next_cpu) {
- int ret;
-
- ret = kvm_arch_put_registers(env);
- if (ret)
- return ret;
- }
-
- return 0;
-}
-
/*
* dirty pages logging control
*/
@@ -397,11 +394,6 @@ int kvm_check_extension(KVMState *s, unsigned int extension)
return ret;
}
-static void kvm_reset_vcpus(void *opaque)
-{
- kvm_sync_vcpus();
-}
-
int kvm_init(int smp_cpus)
{
static const char upgrade_note[] =
@@ -492,8 +484,6 @@ int kvm_init(int smp_cpus)
if (ret < 0)
goto err;
- qemu_register_reset(kvm_reset_vcpus, INT_MAX, NULL);
-
kvm_state = s;
return 0;
diff --git a/kvm.h b/kvm.h
index 560aef3872..96b4d72609 100644
--- a/kvm.h
+++ b/kvm.h
@@ -32,7 +32,6 @@ struct kvm_run;
int kvm_init(int smp_cpus);
int kvm_init_vcpu(CPUState *env);
-int kvm_sync_vcpus(void);
int kvm_cpu_exec(CPUState *env);
diff --git a/vl.c b/vl.c
index eb2449a133..c84e2d1bc9 100644
--- a/vl.c
+++ b/vl.c
@@ -6057,17 +6057,6 @@ int main(int argc, char **argv, char **envp)
current_machine = machine;
- /* Set KVM's vcpu state to qemu's initial CPUState. */
- if (kvm_enabled()) {
- int ret;
-
- ret = kvm_sync_vcpus();
- if (ret < 0) {
- fprintf(stderr, "failed to initialize vcpus\n");
- exit(1);
- }
- }
-
/* init USB devices */
if (usb_enabled) {
for(i = 0; i < usb_devices_index; i++) {