diff options
author | 2008-06-05 15:19:41 +0300 | |
---|---|---|
committer | 2008-06-05 15:19:41 +0300 | |
commit | 273e9ef0226e8fd40e0a6d36a8a5fcfc25065f3d (patch) | |
tree | bd0a25d1aece9b54f11c8da95464d671b1ad6b9f /target-i386/machine.c | |
parent | Avoid deadlock in qemu_cond_wait() (diff) | |
parent | Free constant temporaries. (diff) | |
download | qemu-kvm-273e9ef0226e8fd40e0a6d36a8a5fcfc25065f3d.tar.gz qemu-kvm-273e9ef0226e8fd40e0a6d36a8a5fcfc25065f3d.tar.bz2 qemu-kvm-273e9ef0226e8fd40e0a6d36a8a5fcfc25065f3d.zip |
Merge branch 'qemu-cvs'
Conflicts:
qemu/Makefile.target
qemu/configure
qemu/cpu-exec.c
qemu/exec.c
qemu/hw/apic.c
qemu/hw/boards.h
qemu/hw/pc.c
qemu/monitor.c
qemu/sysemu.h
qemu/target-i386/cpu.h
qemu/target-i386/helper2.c
qemu/target-i386/machine.c
qemu/vl.c
Signed-off-by: Avi Kivity <avi@qumranet.com>
Diffstat (limited to 'target-i386/machine.c')
-rw-r--r-- | target-i386/machine.c | 43 |
1 files changed, 37 insertions, 6 deletions
diff --git a/target-i386/machine.c b/target-i386/machine.c index 8f38e5793..0da657f3b 100644 --- a/target-i386/machine.c +++ b/target-i386/machine.c @@ -126,6 +126,20 @@ void cpu_save(QEMUFile *f, void *opaque) qemu_put_be64s(f, &env->kernelgsbase); #endif qemu_put_be32s(f, &env->smbase); + qemu_put_be64s(f, &env->pat); + qemu_put_be32s(f, &env->hflags2); + qemu_put_be32s(f, (uint32_t *)&env->halted); + + qemu_put_be64s(f, &env->vm_hsave); + qemu_put_be64s(f, &env->vm_vmcb); + qemu_put_be64s(f, &env->tsc_offset); + qemu_put_be64s(f, &env->intercept); + qemu_put_be16s(f, &env->intercept_cr_read); + qemu_put_be16s(f, &env->intercept_cr_write); + qemu_put_be16s(f, &env->intercept_dr_read); + qemu_put_be16s(f, &env->intercept_dr_write); + qemu_put_be32s(f, &env->intercept_exceptions); + qemu_put_8s(f, &env->v_tpr); if (kvm_enabled()) { for (i = 0; i < NR_IRQ_WORDS ; i++) { @@ -168,7 +182,7 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id) uint16_t fpus, fpuc, fptag, fpregs_format; int32_t a20_mask; - if (version_id < 3 || version_id > 5) + if (version_id != 3 && version_id != 4 && version_id != 5) return -EINVAL; for(i = 0; i < CPU_NB_REGS; i++) qemu_get_betls(f, &env->regs[i]); @@ -272,16 +286,33 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id) qemu_get_be64s(f, &env->fmask); qemu_get_be64s(f, &env->kernelgsbase); #endif - if (version_id >= 4) + if (version_id >= 4) { qemu_get_be32s(f, &env->smbase); - - /* XXX: compute hflags from scratch, except for CPL and IIF */ + } + if (version_id >= 5) { + qemu_get_be64s(f, &env->pat); + qemu_get_be32s(f, &env->hflags2); + qemu_get_be32s(f, (uint32_t *)&env->halted); + + qemu_get_be64s(f, &env->vm_hsave); + qemu_get_be64s(f, &env->vm_vmcb); + qemu_get_be64s(f, &env->tsc_offset); + qemu_get_be64s(f, &env->intercept); + qemu_get_be16s(f, &env->intercept_cr_read); + qemu_get_be16s(f, &env->intercept_cr_write); + qemu_get_be16s(f, &env->intercept_dr_read); + qemu_get_be16s(f, &env->intercept_dr_write); + qemu_get_be32s(f, &env->intercept_exceptions); + qemu_get_8s(f, &env->v_tpr); + } + /* XXX: ensure compatiblity for halted bit ? */ + /* XXX: compute redundant hflags bits */ env->hflags = hflags; tlb_flush(env, 1); if (kvm_enabled()) { - /* when in-kernel irqchip is used, HF_HALTED_MASK causes deadlock + /* when in-kernel irqchip is used, env->halted causes deadlock because no userspace IRQs will ever clear this flag */ - env->hflags &= ~HF_HALTED_MASK; + env->halted = 0; for (i = 0; i < NR_IRQ_WORDS ; i++) { qemu_get_be32s(f, &env->kvm_interrupt_bitmap[i]); } |