26 |
26 |
void cpu_save(QEMUFile *f, void *opaque)
|
27 |
27 |
{
|
28 |
28 |
CPUState *env = opaque;
|
29 |
|
uint16_t fptag, fpus, fpregs_format;
|
|
29 |
uint16_t fptag, fpregs_format;
|
30 |
30 |
int32_t pending_irq;
|
31 |
31 |
int i, bit;
|
32 |
32 |
|
... | ... | |
39 |
39 |
qemu_put_be32s(f, &env->hflags);
|
40 |
40 |
|
41 |
41 |
/* FPU */
|
42 |
|
fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11;
|
|
42 |
env->fpus_vmstate = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11;
|
43 |
43 |
fptag = 0;
|
44 |
44 |
for(i = 0; i < 8; i++) {
|
45 |
45 |
fptag |= ((!env->fptags[i]) << i);
|
46 |
46 |
}
|
47 |
47 |
|
48 |
48 |
qemu_put_be16s(f, &env->fpuc);
|
49 |
|
qemu_put_be16s(f, &fpus);
|
|
49 |
qemu_put_be16s(f, &env->fpus_vmstate);
|
50 |
50 |
qemu_put_be16s(f, &fptag);
|
51 |
51 |
|
52 |
52 |
#ifdef USE_X86LDOUBLE
|
... | ... | |
197 |
197 |
{
|
198 |
198 |
CPUState *env = opaque;
|
199 |
199 |
int i, guess_mmx;
|
200 |
|
uint16_t fpus, fptag, fpregs_format;
|
|
200 |
uint16_t fptag, fpregs_format;
|
201 |
201 |
int32_t pending_irq;
|
202 |
202 |
|
203 |
203 |
cpu_synchronize_state(env);
|
... | ... | |
210 |
210 |
qemu_get_be32s(f, &env->hflags);
|
211 |
211 |
|
212 |
212 |
qemu_get_be16s(f, &env->fpuc);
|
213 |
|
qemu_get_be16s(f, &fpus);
|
|
213 |
qemu_get_be16s(f, &env->fpus_vmstate);
|
214 |
214 |
qemu_get_be16s(f, &fptag);
|
215 |
215 |
qemu_get_be16s(f, &fpregs_format);
|
216 |
216 |
|
217 |
217 |
/* NOTE: we cannot always restore the FPU state if the image come
|
218 |
218 |
from a host with a different 'USE_X86LDOUBLE' define. We guess
|
219 |
219 |
if we are in an MMX state to restore correctly in that case. */
|
220 |
|
guess_mmx = ((fptag == 0xff) && (fpus & 0x3800) == 0);
|
|
220 |
guess_mmx = ((fptag == 0xff) && (env->fpus_vmstate & 0x3800) == 0);
|
221 |
221 |
for(i = 0; i < 8; i++) {
|
222 |
222 |
uint64_t mant;
|
223 |
223 |
uint16_t exp;
|
... | ... | |
260 |
260 |
}
|
261 |
261 |
|
262 |
262 |
/* XXX: restore FPU round state */
|
263 |
|
env->fpstt = (fpus >> 11) & 7;
|
264 |
|
env->fpus = fpus & ~0x3800;
|
|
263 |
env->fpstt = (env->fpus_vmstate >> 11) & 7;
|
|
264 |
env->fpus = env->fpus_vmstate & ~0x3800;
|
265 |
265 |
fptag ^= 0xff;
|
266 |
266 |
for(i = 0; i < 8; i++) {
|
267 |
267 |
env->fptags[i] = (fptag >> i) & 1;
|