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