x86: fpus is uint16_t not unsigned int

We save more that fpus on that 16 bits (fpstt), we need an additional field

Signed-off-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
Juan Quintela 2009-09-29 22:48:51 +02:00 committed by Anthony Liguori
parent eb83162311
commit 67b8f41957
2 changed files with 10 additions and 9 deletions

View File

@ -593,7 +593,8 @@ typedef struct CPUX86State {
/* FPU state */ /* FPU state */
unsigned int fpstt; /* top of stack index */ unsigned int fpstt; /* top of stack index */
unsigned int fpus; uint16_t fpus;
uint16_t fpus_vmstate;
uint16_t fpuc; uint16_t fpuc;
uint8_t fptags[8]; /* 0 = valid, 1 = empty */ uint8_t fptags[8]; /* 0 = valid, 1 = empty */
union { union {

View File

@ -26,7 +26,7 @@ static void cpu_get_seg(QEMUFile *f, SegmentCache *dt)
void cpu_save(QEMUFile *f, void *opaque) void cpu_save(QEMUFile *f, void *opaque)
{ {
CPUState *env = opaque; CPUState *env = opaque;
uint16_t fptag, fpus, fpregs_format; uint16_t fptag, fpregs_format;
int32_t pending_irq; int32_t pending_irq;
int i, bit; int i, bit;
@ -39,14 +39,14 @@ void cpu_save(QEMUFile *f, void *opaque)
qemu_put_be32s(f, &env->hflags); qemu_put_be32s(f, &env->hflags);
/* FPU */ /* FPU */
fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11; env->fpus_vmstate = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11;
fptag = 0; fptag = 0;
for(i = 0; i < 8; i++) { for(i = 0; i < 8; i++) {
fptag |= ((!env->fptags[i]) << i); fptag |= ((!env->fptags[i]) << i);
} }
qemu_put_be16s(f, &env->fpuc); qemu_put_be16s(f, &env->fpuc);
qemu_put_be16s(f, &fpus); qemu_put_be16s(f, &env->fpus_vmstate);
qemu_put_be16s(f, &fptag); qemu_put_be16s(f, &fptag);
#ifdef USE_X86LDOUBLE #ifdef USE_X86LDOUBLE
@ -197,7 +197,7 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id)
{ {
CPUState *env = opaque; CPUState *env = opaque;
int i, guess_mmx; int i, guess_mmx;
uint16_t fpus, fptag, fpregs_format; uint16_t fptag, fpregs_format;
int32_t pending_irq; int32_t pending_irq;
cpu_synchronize_state(env); cpu_synchronize_state(env);
@ -210,14 +210,14 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id)
qemu_get_be32s(f, &env->hflags); qemu_get_be32s(f, &env->hflags);
qemu_get_be16s(f, &env->fpuc); qemu_get_be16s(f, &env->fpuc);
qemu_get_be16s(f, &fpus); qemu_get_be16s(f, &env->fpus_vmstate);
qemu_get_be16s(f, &fptag); qemu_get_be16s(f, &fptag);
qemu_get_be16s(f, &fpregs_format); qemu_get_be16s(f, &fpregs_format);
/* NOTE: we cannot always restore the FPU state if the image come /* NOTE: we cannot always restore the FPU state if the image come
from a host with a different 'USE_X86LDOUBLE' define. We guess from a host with a different 'USE_X86LDOUBLE' define. We guess
if we are in an MMX state to restore correctly in that case. */ if we are in an MMX state to restore correctly in that case. */
guess_mmx = ((fptag == 0xff) && (fpus & 0x3800) == 0); guess_mmx = ((fptag == 0xff) && (env->fpus_vmstate & 0x3800) == 0);
for(i = 0; i < 8; i++) { for(i = 0; i < 8; i++) {
uint64_t mant; uint64_t mant;
uint16_t exp; uint16_t exp;
@ -260,8 +260,8 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id)
} }
/* XXX: restore FPU round state */ /* XXX: restore FPU round state */
env->fpstt = (fpus >> 11) & 7; env->fpstt = (env->fpus_vmstate >> 11) & 7;
env->fpus = fpus & ~0x3800; env->fpus = env->fpus_vmstate & ~0x3800;
fptag ^= 0xff; fptag ^= 0xff;
for(i = 0; i < 8; i++) { for(i = 0; i < 8; i++) {
env->fptags[i] = (fptag >> i) & 1; env->fptags[i] = (fptag >> i) & 1;