summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAvi Kivity <avi@redhat.com>2009-08-31 12:09:49 +0300
committerAvi Kivity <avi@redhat.com>2009-08-31 12:34:43 +0300
commit54d2473ed6e9733b508a2dcc589435779e2cc7f0 (patch)
tree44c276f2a691a4eb7c4d1bc96daaeb917dbf7b52
parentMerge branch 'upstream-merge' (diff)
downloadqemu-kvm-54d2473ed6e9733b508a2dcc589435779e2cc7f0.tar.gz
qemu-kvm-54d2473ed6e9733b508a2dcc589435779e2cc7f0.tar.bz2
qemu-kvm-54d2473ed6e9733b508a2dcc589435779e2cc7f0.zip
Fix mpstate reloads
Signed-off-by: Avi Kivity <avi@redhat.com>
-rw-r--r--hw/apic.c5
-rw-r--r--qemu-kvm-x86.c2
-rw-r--r--qemu-kvm.c4
-rw-r--r--target-i386/kvm.c4
4 files changed, 8 insertions, 7 deletions
diff --git a/hw/apic.c b/hw/apic.c
index 18db3be4e..68e5de379 100644
--- a/hw/apic.c
+++ b/hw/apic.c
@@ -488,6 +488,7 @@ void apic_init_reset(CPUState *env)
if (!s)
return;
+ cpu_synchronize_state(env);
s->tpr = 0;
s->spurious_vec = 0xff;
s->log_dest = 0;
@@ -507,6 +508,10 @@ void apic_init_reset(CPUState *env)
s->wait_for_sipi = 1;
env->halted = !(s->apicbase & MSR_IA32_APICBASE_BSP);
+#ifdef KVM_CAP_MP_STATE
+ env->mp_state
+ = env->halted ? KVM_MP_STATE_INIT_RECEIVED : KVM_MP_STATE_RUNNABLE;
+#endif
}
static void apic_startup(APICState *s, int vector_num)
diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c
index 64398fbdf..f80d82bf8 100644
--- a/qemu-kvm-x86.c
+++ b/qemu-kvm-x86.c
@@ -1035,6 +1035,8 @@ void kvm_arch_save_mpstate(CPUState *env)
env->mp_state = -1;
else
env->mp_state = mp_state.mp_state;
+#else
+ env->mp_state = -1;
#endif
}
diff --git a/qemu-kvm.c b/qemu-kvm.c
index 2d3ca7166..d554749c3 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -878,7 +878,6 @@ void kvm_cpu_synchronize_state(CPUState *env)
{
if (!env->kvm_cpu_state.regs_modified) {
kvm_arch_get_registers(env);
- kvm_arch_save_mpstate(env);
env->kvm_cpu_state.regs_modified = 1;
}
}
@@ -966,8 +965,8 @@ int kvm_run(kvm_vcpu_context_t vcpu, void *env)
#endif
if (_env->kvm_cpu_state.regs_modified) {
+ printf("%s: cpu %d mp_state %d\n", __func__, _env->cpu_index, _env->mp_state);
kvm_arch_put_registers(_env);
- kvm_arch_load_mpstate(_env);
_env->kvm_cpu_state.regs_modified = 0;
}
@@ -1609,7 +1608,6 @@ static void kvm_do_save_mpstate(void *_env)
CPUState *env = _env;
kvm_arch_save_mpstate(env);
- env->halted = (env->mp_state == KVM_MP_STATE_HALTED);
}
void kvm_save_mpstate(CPUState *env)
diff --git a/target-i386/kvm.c b/target-i386/kvm.c
index cfa5b80d5..1566eacab 100644
--- a/target-i386/kvm.c
+++ b/target-i386/kvm.c
@@ -689,10 +689,6 @@ int kvm_arch_put_registers(CPUState *env)
if (ret < 0)
return ret;
- ret = kvm_get_mp_state(env);
- if (ret < 0)
- return ret;
-
return 0;
}