Commit d6205959f95cb51799ff729549845a1730f13092
1 parent
2585afbd
fxsave/fxrstor 64 bit fix
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4520 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
20 additions
and
2 deletions
target-i386/helper.c
... | ... | @@ -4248,6 +4248,18 @@ void helper_fxsave(target_ulong ptr, int data64) |
4248 | 4248 | stw(ptr, env->fpuc); |
4249 | 4249 | stw(ptr + 2, fpus); |
4250 | 4250 | stw(ptr + 4, fptag ^ 0xff); |
4251 | +#ifdef TARGET_X86_64 | |
4252 | + if (data64) { | |
4253 | + stq(ptr + 0x08, 0); /* rip */ | |
4254 | + stq(ptr + 0x10, 0); /* rdp */ | |
4255 | + } else | |
4256 | +#endif | |
4257 | + { | |
4258 | + stl(ptr + 0x08, 0); /* eip */ | |
4259 | + stl(ptr + 0x0c, 0); /* sel */ | |
4260 | + stl(ptr + 0x10, 0); /* dp */ | |
4261 | + stl(ptr + 0x14, 0); /* sel */ | |
4262 | + } | |
4251 | 4263 | |
4252 | 4264 | addr = ptr + 0x20; |
4253 | 4265 | for(i = 0;i < 8; i++) { |
... | ... | @@ -4260,7 +4272,10 @@ void helper_fxsave(target_ulong ptr, int data64) |
4260 | 4272 | /* XXX: finish it */ |
4261 | 4273 | stl(ptr + 0x18, env->mxcsr); /* mxcsr */ |
4262 | 4274 | stl(ptr + 0x1c, 0x0000ffff); /* mxcsr_mask */ |
4263 | - nb_xmm_regs = 8 << data64; | |
4275 | + if (env->hflags & HF_CS64_MASK) | |
4276 | + nb_xmm_regs = 16; | |
4277 | + else | |
4278 | + nb_xmm_regs = 8; | |
4264 | 4279 | addr = ptr + 0xa0; |
4265 | 4280 | for(i = 0; i < nb_xmm_regs; i++) { |
4266 | 4281 | stq(addr, env->xmm_regs[i].XMM_Q(0)); |
... | ... | @@ -4297,7 +4312,10 @@ void helper_fxrstor(target_ulong ptr, int data64) |
4297 | 4312 | /* XXX: finish it */ |
4298 | 4313 | env->mxcsr = ldl(ptr + 0x18); |
4299 | 4314 | //ldl(ptr + 0x1c); |
4300 | - nb_xmm_regs = 8 << data64; | |
4315 | + if (env->hflags & HF_CS64_MASK) | |
4316 | + nb_xmm_regs = 16; | |
4317 | + else | |
4318 | + nb_xmm_regs = 8; | |
4301 | 4319 | addr = ptr + 0xa0; |
4302 | 4320 | for(i = 0; i < nb_xmm_regs; i++) { |
4303 | 4321 | env->xmm_regs[i].XMM_Q(0) = ldq(addr); | ... | ... |