diff options
author | Gleb Natapov <gleb@redhat.com> | 2009-10-14 15:52:32 +0200 |
---|---|---|
committer | Marcelo Tosatti <mtosatti@redhat.com> | 2009-10-14 15:35:06 -0300 |
commit | b8a7857071b477b28d3055e33ff0298fc91f329a (patch) | |
tree | 138cbf2456d3637930dfea09edf53905e41aba82 /target-i386/machine.c | |
parent | Complete cpu initialization before signaling main thread. (diff) | |
download | qemu-kvm-b8a7857071b477b28d3055e33ff0298fc91f329a.tar.gz qemu-kvm-b8a7857071b477b28d3055e33ff0298fc91f329a.tar.bz2 qemu-kvm-b8a7857071b477b28d3055e33ff0298fc91f329a.zip |
Don't sync mpstate to/from kernel when unneeded.
mp_state, unlike other cpu state, can be changed not only from vcpu
context it belongs to, but by other vcpus too. That makes its loading
from kernel/saving back not safe if mp_state value is changed inside
kernel between load and save. For example vcpu 1 loads mp_sate into
user-space and the state is RUNNING, vcpu 0 sends INIT/SIPI to vcpu 1
so in-kernel mp_sate becomes SIPI, vcpu 1 save user-space copy into
kernel and calls vcpu_run(). SIPI sate is lost.
The patch copies mp_sate into kernel only when it is knows that
int-kernel value is outdated. This happens on reset and vmload.
Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'target-i386/machine.c')
-rw-r--r-- | target-i386/machine.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/target-i386/machine.c b/target-i386/machine.c index e640dad4b..16d9c57ba 100644 --- a/target-i386/machine.c +++ b/target-i386/machine.c @@ -324,6 +324,7 @@ static void cpu_pre_save(void *opaque) int i, bit; cpu_synchronize_state(env); + kvm_save_mpstate(env); /* FPU */ env->fpus_vmstate = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11; @@ -385,6 +386,8 @@ static int cpu_post_load(void *opaque, int version_id) } tlb_flush(env, 1); + kvm_load_mpstate(env); + return 0; } |