Revision 468f6581 target-i386/machine.c
b/target-i386/machine.c | ||
---|---|---|
205 | 205 |
} |
206 | 206 |
#endif |
207 | 207 |
|
208 |
static int cpu_pre_load(void *opaque) |
|
209 |
{ |
|
210 |
CPUState *env = opaque; |
|
211 |
|
|
212 |
cpu_synchronize_state(env); |
|
213 |
return 0; |
|
214 |
} |
|
215 |
|
|
216 |
static int cpu_post_load(void *opaque, int version_id) |
|
217 |
{ |
|
218 |
CPUState *env = opaque; |
|
219 |
int i; |
|
220 |
|
|
221 |
/* XXX: restore FPU round state */ |
|
222 |
env->fpstt = (env->fpus_vmstate >> 11) & 7; |
|
223 |
env->fpus = env->fpus_vmstate & ~0x3800; |
|
224 |
env->fptag_vmstate ^= 0xff; |
|
225 |
for(i = 0; i < 8; i++) { |
|
226 |
env->fptags[i] = (env->fptag_vmstate >> i) & 1; |
|
227 |
} |
|
228 |
|
|
229 |
cpu_breakpoint_remove_all(env, BP_CPU); |
|
230 |
cpu_watchpoint_remove_all(env, BP_CPU); |
|
231 |
for (i = 0; i < 4; i++) |
|
232 |
hw_breakpoint_insert(env, i); |
|
233 |
|
|
234 |
if (version_id >= 9) { |
|
235 |
memset(&env->interrupt_bitmap, 0, sizeof(env->interrupt_bitmap)); |
|
236 |
if (env->pending_irq_vmstate >= 0) { |
|
237 |
env->interrupt_bitmap[env->pending_irq_vmstate / 64] |= |
|
238 |
(uint64_t)1 << (env->pending_irq_vmstate % 64); |
|
239 |
} |
|
240 |
} |
|
241 |
|
|
242 |
return cpu_post_load(env, version_id); |
|
243 |
} |
|
244 |
|
|
208 | 245 |
int cpu_load(QEMUFile *f, void *opaque, int version_id) |
209 | 246 |
{ |
210 | 247 |
CPUState *env = opaque; |
211 | 248 |
int i, guess_mmx; |
212 | 249 |
|
213 |
cpu_synchronize_state(env); |
|
250 |
cpu_pre_load(env); |
|
251 |
|
|
214 | 252 |
if (version_id < 3 || version_id > CPU_SAVE_VERSION) |
215 | 253 |
return -EINVAL; |
216 | 254 |
for(i = 0; i < CPU_NB_REGS; i++) |
... | ... | |
269 | 307 |
} |
270 | 308 |
} |
271 | 309 |
|
272 |
/* XXX: restore FPU round state */ |
|
273 |
env->fpstt = (env->fpus_vmstate >> 11) & 7; |
|
274 |
env->fpus = env->fpus_vmstate & ~0x3800; |
|
275 |
env->fptag_vmstate ^= 0xff; |
|
276 |
for(i = 0; i < 8; i++) { |
|
277 |
env->fptags[i] = (env->fptag_vmstate >> i) & 1; |
|
278 |
} |
|
279 |
|
|
280 | 310 |
for(i = 0; i < 6; i++) |
281 | 311 |
cpu_get_seg(f, &env->segs[i]); |
282 | 312 |
cpu_get_seg(f, &env->ldt); |
... | ... | |
300 | 330 |
|
301 | 331 |
for(i = 0; i < 8; i++) |
302 | 332 |
qemu_get_betls(f, &env->dr[i]); |
303 |
cpu_breakpoint_remove_all(env, BP_CPU); |
|
304 |
cpu_watchpoint_remove_all(env, BP_CPU); |
|
305 |
for (i = 0; i < 4; i++) |
|
306 |
hw_breakpoint_insert(env, i); |
|
307 | 333 |
|
308 | 334 |
qemu_get_sbe32s(f, &env->a20_mask); |
309 | 335 |
|
... | ... | |
355 | 381 |
|
356 | 382 |
if (version_id >= 9) { |
357 | 383 |
qemu_get_sbe32s(f, &env->pending_irq_vmstate); |
358 |
memset(&env->interrupt_bitmap, 0, sizeof(env->interrupt_bitmap)); |
|
359 |
if (env->pending_irq_vmstate >= 0) { |
|
360 |
env->interrupt_bitmap[env->pending_irq_vmstate / 64] |= |
|
361 |
(uint64_t)1 << (env->pending_irq_vmstate % 64); |
|
362 |
} |
|
363 | 384 |
qemu_get_be32s(f, &env->mp_state); |
364 | 385 |
qemu_get_be64s(f, &env->tsc); |
365 | 386 |
} |
Also available in: Unified diff