Commit 5cc1d1e628f37424f2c96c585477aaf79ce0d9cc
1 parent
33c263df
save more CPU state
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4669 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
39 additions
and
7 deletions
hw/pc.c
@@ -766,7 +766,7 @@ static void pc_init1(ram_addr_t ram_size, int vga_ram_size, | @@ -766,7 +766,7 @@ static void pc_init1(ram_addr_t ram_size, int vga_ram_size, | ||
766 | /* XXX: enable it in all cases */ | 766 | /* XXX: enable it in all cases */ |
767 | env->cpuid_features |= CPUID_APIC; | 767 | env->cpuid_features |= CPUID_APIC; |
768 | } | 768 | } |
769 | - register_savevm("cpu", i, 4, cpu_save, cpu_load, env); | 769 | + register_savevm("cpu", i, 5, cpu_save, cpu_load, env); |
770 | qemu_register_reset(main_cpu_reset, env); | 770 | qemu_register_reset(main_cpu_reset, env); |
771 | if (pci_enabled) { | 771 | if (pci_enabled) { |
772 | apic_init(env); | 772 | apic_init(env); |
target-i386/cpu.h
@@ -541,8 +541,8 @@ typedef struct CPUX86State { | @@ -541,8 +541,8 @@ typedef struct CPUX86State { | ||
541 | uint64_t efer; | 541 | uint64_t efer; |
542 | uint64_t star; | 542 | uint64_t star; |
543 | 543 | ||
544 | - target_phys_addr_t vm_hsave; | ||
545 | - target_phys_addr_t vm_vmcb; | 544 | + uint64_t vm_hsave; |
545 | + uint64_t vm_vmcb; | ||
546 | uint64_t tsc_offset; | 546 | uint64_t tsc_offset; |
547 | uint64_t intercept; | 547 | uint64_t intercept; |
548 | uint16_t intercept_cr_read; | 548 | uint16_t intercept_cr_read; |
target-i386/machine.c
@@ -120,6 +120,21 @@ void cpu_save(QEMUFile *f, void *opaque) | @@ -120,6 +120,21 @@ void cpu_save(QEMUFile *f, void *opaque) | ||
120 | qemu_put_be64s(f, &env->kernelgsbase); | 120 | qemu_put_be64s(f, &env->kernelgsbase); |
121 | #endif | 121 | #endif |
122 | qemu_put_be32s(f, &env->smbase); | 122 | qemu_put_be32s(f, &env->smbase); |
123 | + | ||
124 | + qemu_put_be64s(f, &env->pat); | ||
125 | + qemu_put_be32s(f, &env->hflags2); | ||
126 | + qemu_put_be32s(f, (uint32_t *)&env->halted); | ||
127 | + | ||
128 | + qemu_put_be64s(f, &env->vm_hsave); | ||
129 | + qemu_put_be64s(f, &env->vm_vmcb); | ||
130 | + qemu_put_be64s(f, &env->tsc_offset); | ||
131 | + qemu_put_be64s(f, &env->intercept); | ||
132 | + qemu_put_be16s(f, &env->intercept_cr_read); | ||
133 | + qemu_put_be16s(f, &env->intercept_cr_write); | ||
134 | + qemu_put_be16s(f, &env->intercept_dr_read); | ||
135 | + qemu_put_be16s(f, &env->intercept_dr_write); | ||
136 | + qemu_put_be32s(f, &env->intercept_exceptions); | ||
137 | + qemu_put_8s(f, &env->v_tpr); | ||
123 | } | 138 | } |
124 | 139 | ||
125 | #ifdef USE_X86LDOUBLE | 140 | #ifdef USE_X86LDOUBLE |
@@ -154,7 +169,7 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id) | @@ -154,7 +169,7 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id) | ||
154 | uint16_t fpus, fpuc, fptag, fpregs_format; | 169 | uint16_t fpus, fpuc, fptag, fpregs_format; |
155 | int32_t a20_mask; | 170 | int32_t a20_mask; |
156 | 171 | ||
157 | - if (version_id != 3 && version_id != 4) | 172 | + if (version_id != 3 && version_id != 4 && version_id != 5) |
158 | return -EINVAL; | 173 | return -EINVAL; |
159 | for(i = 0; i < CPU_NB_REGS; i++) | 174 | for(i = 0; i < CPU_NB_REGS; i++) |
160 | qemu_get_betls(f, &env->regs[i]); | 175 | qemu_get_betls(f, &env->regs[i]); |
@@ -258,10 +273,27 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id) | @@ -258,10 +273,27 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id) | ||
258 | qemu_get_be64s(f, &env->fmask); | 273 | qemu_get_be64s(f, &env->fmask); |
259 | qemu_get_be64s(f, &env->kernelgsbase); | 274 | qemu_get_be64s(f, &env->kernelgsbase); |
260 | #endif | 275 | #endif |
261 | - if (version_id >= 4) | 276 | + if (version_id >= 4) { |
262 | qemu_get_be32s(f, &env->smbase); | 277 | qemu_get_be32s(f, &env->smbase); |
263 | - | ||
264 | - /* XXX: compute hflags from scratch, except for CPL and IIF */ | 278 | + } |
279 | + if (version_id >= 5) { | ||
280 | + qemu_get_be64s(f, &env->pat); | ||
281 | + qemu_get_be32s(f, &env->hflags2); | ||
282 | + qemu_get_be32s(f, (uint32_t *)&env->halted); | ||
283 | + | ||
284 | + qemu_get_be64s(f, &env->vm_hsave); | ||
285 | + qemu_get_be64s(f, &env->vm_vmcb); | ||
286 | + qemu_get_be64s(f, &env->tsc_offset); | ||
287 | + qemu_get_be64s(f, &env->intercept); | ||
288 | + qemu_get_be16s(f, &env->intercept_cr_read); | ||
289 | + qemu_get_be16s(f, &env->intercept_cr_write); | ||
290 | + qemu_get_be16s(f, &env->intercept_dr_read); | ||
291 | + qemu_get_be16s(f, &env->intercept_dr_write); | ||
292 | + qemu_get_be32s(f, &env->intercept_exceptions); | ||
293 | + qemu_get_8s(f, &env->v_tpr); | ||
294 | + } | ||
295 | + /* XXX: ensure compatiblity for halted bit ? */ | ||
296 | + /* XXX: compute redundant hflags bits */ | ||
265 | env->hflags = hflags; | 297 | env->hflags = hflags; |
266 | tlb_flush(env, 1); | 298 | tlb_flush(env, 1); |
267 | return 0; | 299 | return 0; |