From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Jz6yj-0004ka-1O for qemu-devel@nongnu.org; Thu, 22 May 2008 05:20:53 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Jz6ye-0004i5-7E for qemu-devel@nongnu.org; Thu, 22 May 2008 05:20:50 -0400 Received: from [199.232.76.173] (port=49376 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Jz6yd-0004h6-Au for qemu-devel@nongnu.org; Thu, 22 May 2008 05:20:47 -0400 Received: from savannah.gnu.org ([199.232.41.3]:59684 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1Jz6yc-0004Y7-TF for qemu-devel@nongnu.org; Thu, 22 May 2008 05:20:47 -0400 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1Jz6yb-0004uG-EO for qemu-devel@nongnu.org; Thu, 22 May 2008 09:20:45 +0000 Received: from bellard by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1Jz6ya-0004uB-K6 for qemu-devel@nongnu.org; Thu, 22 May 2008 09:20:45 +0000 MIME-Version: 1.0 Errors-To: bellard Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Fabrice Bellard Message-Id: Date: Thu, 22 May 2008 09:20:44 +0000 Subject: [Qemu-devel] [4520] fxsave/fxrstor 64 bit fix Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 4520 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=4520 Author: bellard Date: 2008-05-22 09:20:43 +0000 (Thu, 22 May 2008) Log Message: ----------- fxsave/fxrstor 64 bit fix Modified Paths: -------------- trunk/target-i386/helper.c Modified: trunk/target-i386/helper.c =================================================================== --- trunk/target-i386/helper.c 2008-05-21 19:17:29 UTC (rev 4519) +++ trunk/target-i386/helper.c 2008-05-22 09:20:43 UTC (rev 4520) @@ -4248,6 +4248,18 @@ stw(ptr, env->fpuc); stw(ptr + 2, fpus); stw(ptr + 4, fptag ^ 0xff); +#ifdef TARGET_X86_64 + if (data64) { + stq(ptr + 0x08, 0); /* rip */ + stq(ptr + 0x10, 0); /* rdp */ + } else +#endif + { + stl(ptr + 0x08, 0); /* eip */ + stl(ptr + 0x0c, 0); /* sel */ + stl(ptr + 0x10, 0); /* dp */ + stl(ptr + 0x14, 0); /* sel */ + } addr = ptr + 0x20; for(i = 0;i < 8; i++) { @@ -4260,7 +4272,10 @@ /* XXX: finish it */ stl(ptr + 0x18, env->mxcsr); /* mxcsr */ stl(ptr + 0x1c, 0x0000ffff); /* mxcsr_mask */ - nb_xmm_regs = 8 << data64; + if (env->hflags & HF_CS64_MASK) + nb_xmm_regs = 16; + else + nb_xmm_regs = 8; addr = ptr + 0xa0; for(i = 0; i < nb_xmm_regs; i++) { stq(addr, env->xmm_regs[i].XMM_Q(0)); @@ -4297,7 +4312,10 @@ /* XXX: finish it */ env->mxcsr = ldl(ptr + 0x18); //ldl(ptr + 0x1c); - nb_xmm_regs = 8 << data64; + if (env->hflags & HF_CS64_MASK) + nb_xmm_regs = 16; + else + nb_xmm_regs = 8; addr = ptr + 0xa0; for(i = 0; i < nb_xmm_regs; i++) { env->xmm_regs[i].XMM_Q(0) = ldq(addr);