From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52053) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XN6Vl-0000dq-1z for qemu-devel@nongnu.org; Thu, 28 Aug 2014 16:41:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XN6Vc-0005C8-0J for qemu-devel@nongnu.org; Thu, 28 Aug 2014 16:41:37 -0400 Received: from mail-wg0-x231.google.com ([2a00:1450:400c:c00::231]:57950) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XN6Vb-0005Bv-JI for qemu-devel@nongnu.org; Thu, 28 Aug 2014 16:41:27 -0400 Received: by mail-wg0-f49.google.com with SMTP id y10so1295281wgg.32 for ; Thu, 28 Aug 2014 13:41:25 -0700 (PDT) Received: from workstation.home (ANice-552-1-182-94.w86-203.abo.wanadoo.fr. [86.203.57.94]) by mx.google.com with ESMTPSA id ot5sm12683015wjc.42.2014.08.28.13.41.24 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 28 Aug 2014 13:41:25 -0700 (PDT) From: Jaume Marti Farriol Date: Thu, 28 Aug 2014 22:44:40 +0200 Message-Id: <1409258680-15555-9-git-send-email-jaume.martif@gmail.com> In-Reply-To: <1409258680-15555-1-git-send-email-jaume.martif@gmail.com> References: <1409258680-15555-1-git-send-email-jaume.martif@gmail.com> Subject: [Qemu-devel] [PATCH v2 8/8] target-i386: x87 exception pointers using TCG. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Hello, This patch contains changes to the tests/tcg/test-i386.c file to test the storage of the x87 exception pointers by instructions fnstenv and fxsave. Best regards, Jaume test-i386.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 62 insertions(+), 4 deletions(-) signed-off: jaume.martif@gmail.com diff --git a/tests/tcg/test-i386.c b/tests/tcg/test-i386.c index b05572b..3f34c2c 100644 --- a/tests/tcg/test-i386.c +++ b/tests/tcg/test-i386.c @@ -2322,17 +2322,61 @@ void test_sse_comi(double a1, double b1) r.l[0]);\ } -struct fpxstate { +struct fnstate { uint16_t fpuc; + uint16_t dummy0; uint16_t fpus; + uint16_t dummy1; uint16_t fptag; - uint16_t fop; + uint16_t dummy2; uint32_t fpuip; uint16_t cs_sel; - uint16_t dummy0; + uint16_t fop; uint32_t fpudp; uint16_t ds_sel; - uint16_t dummy1; +}; + +static struct fnstate fn_state __attribute__((aligned(16))); +float tmp_mem_operand; + +void test_fnstenv(void) +{ + struct fnstate *fp = &fn_state; + + asm(" fld1\n" + " fmul tmp_mem_operand\n" + " fnstenv %0\n" + : "=m" (*(uint32_t *)fp) : ); + printf("fpuc=%04x\n", fp->fpuc); + printf("fpus=%04x\n", fp->fpus); + printf("fptag=%04x\n", fp->fptag); + printf("fpuip=%04x\n", fp->fpuip); + printf("cs_sel=%04x\n", fp->cs_sel); + printf("fpudp=%04x\n", fp->fpudp); + printf("ds_sel=%04x\n", fp->ds_sel); +} + +struct fpxstate { + uint16_t fpuc; + uint16_t fpus; + uint16_t fptag; + uint16_t fop; + union { + struct { + uint32_t fpuip; + uint16_t cs_sel; + uint16_t dummy0; + } mode_non_64_ins; + uint64_t mode_64_fpuip; + }; + union { + struct { + uint32_t fpudp; + uint16_t ds_sel; + uint16_t dummy1; + } mode_non_64_data; + uint64_t mode_64_fpudp; + }; uint32_t mxcsr; uint32_t mxcsr_mask; uint8_t fpregs1[8 * 16]; @@ -2362,6 +2406,7 @@ void test_fxsave(void) " fld1\n" " fldpi\n" " fldln2\n" + " fmul tmp_mem_operand\n" " fxsave %0\n" " fxrstor %0\n" " fxsave %1\n" @@ -2371,6 +2416,18 @@ void test_fxsave(void) printf("fpuc=%04x\n", fp->fpuc); printf("fpus=%04x\n", fp->fpus); printf("fptag=%04x\n", fp->fptag); +#if defined(__x86_64__) + printf("fpuip=%04llx\n", (long long unsigned int) fp->mode_64_fpuip); +#else + printf("fpuip=%04x\n", fp->mode_non_64_ins.fpuip); + printf("cs_sel=%04x\n", fp->mode_non_64_ins.cs_sel); +#endif +#if defined(__x86_64__) + printf("fpudp=%04llx\n", (long long unsigned int) fp->mode_64_fpudp); +#else + printf("fpudp=%04x\n", fp->mode_non_64_data.fpudp); + printf("ds_sel=%04x\n", fp->mode_non_64_data.ds_sel); +#endif for(i = 0; i < 3; i++) { printf("ST%d: " FMT64X " %04x\n", i, @@ -2757,6 +2814,7 @@ int main(int argc, char **argv) #endif test_enter(); test_conv(); + test_fnstenv(); #ifdef TEST_SSE test_sse(); test_fxsave();