From: Julian Seward Date: Fri, 9 May 2008 21:38:12 +0000 (+0000) Subject: Add a regression test for fxsave. X-Git-Tag: svn/VALGRIND_3_4_0~618 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e33553414ee821e69cf2d6151b78eb6df4133f44;p=thirdparty%2Fvalgrind.git Add a regression test for fxsave. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@8019 --- diff --git a/memcheck/tests/x86/Makefile.am b/memcheck/tests/x86/Makefile.am index 3c5264b0c7..f6241c5316 100644 --- a/memcheck/tests/x86/Makefile.am +++ b/memcheck/tests/x86/Makefile.am @@ -9,6 +9,7 @@ EXTRA_DIST = $(noinst_SCRIPTS) \ bug152022.vgtest bug152022.stderr.exp bug152022.stdout.exp \ espindola2.vgtest espindola2.stderr.exp \ fpeflags.stderr.exp fpeflags.vgtest \ + fxsave.vgtest fxsave.stdout.exp fxsave.stderr.exp \ $(addsuffix .stderr.exp,$(INSN_TESTS)) \ $(addsuffix .stdout.exp,$(INSN_TESTS)) \ $(addsuffix .vgtest,$(INSN_TESTS)) \ @@ -35,6 +36,7 @@ check_PROGRAMS = \ bug133694 \ bug152022 \ espindola2 \ + fxsave \ int3-x86 \ scalar_exit_group scalar_fork scalar_supp scalar_vfork \ fpeflags pushfpopf \ diff --git a/memcheck/tests/x86/fxsave.c b/memcheck/tests/x86/fxsave.c new file mode 100644 index 0000000000..655790757d --- /dev/null +++ b/memcheck/tests/x86/fxsave.c @@ -0,0 +1,136 @@ + +#include +#include +#include +#include + +const unsigned int vec0[4] + = { 0x12345678, 0x11223344, 0x55667788, 0x87654321 }; + +const unsigned int vec1[4] + = { 0xABCDEF01, 0xAABBCCDD, 0xEEFF0011, 0x10FEDCBA }; + +const unsigned int vecZ[4] + = { 0, 0, 0, 0 }; + +void do_fxsave ( void* p ) { + asm __volatile__("fxsave (%0)" : : "r" (p) : "memory" ); +} + +void do_fxrstor ( void* p ) { + asm __volatile__("fxrstor (%0)" : : "r" (p) : "memory" ); +} + +void do_zeroise ( void ) +{ + asm __volatile__("finit"); + asm __volatile__( + "fldz\n\t" + "fldz\n\t" + "fldz\n\t" + "fldz\n\t" + "fldz\n\t" + "fldz\n\t" + "fldz\n\t" + "fldz\n\t" + "finit\n"); + asm __volatile__("movups vecZ, %xmm0"); + asm __volatile__("movups vecZ, %xmm1"); + asm __volatile__("movups vecZ, %xmm2"); + asm __volatile__("movups vecZ, %xmm3"); + asm __volatile__("movups vecZ, %xmm4"); + asm __volatile__("movups vecZ, %xmm5"); + asm __volatile__("movups vecZ, %xmm6"); + asm __volatile__("movups vecZ, %xmm7"); + asm __volatile__( + "pushl $0\n\t" + "ldmxcsr 0(%esp)\n\t" + "addl $4,%esp\n"); +} + +/* set up the FP and SSE state, and then dump it. */ +void do_setup_then_fxsave ( void* p ) +{ + asm __volatile__("finit"); + asm __volatile__("fldpi"); + asm __volatile__("fld1"); + asm __volatile__("fldln2"); + asm __volatile__("fldlg2"); + asm __volatile__("fld %st(3)"); + asm __volatile__("fld %st(3)"); + asm __volatile__("movups vec0, %xmm0"); + asm __volatile__("movups vec1, %xmm1"); + asm __volatile__("xorps %xmm2, %xmm2"); + asm __volatile__("movaps %xmm2, %xmm3"); + asm __volatile__("movaps %xmm2, %xmm4"); + asm __volatile__("movaps %xmm2, %xmm5"); + asm __volatile__("movaps %xmm2, %xmm6"); + asm __volatile__("movaps %xmm1, %xmm7"); + asm __volatile__("xorps %xmm0, %xmm7"); + do_fxsave (p); +} + +int isFPLsbs ( int i ) +{ + int q; + q = 32; if (i == q || i == q+1) return 1; + q = 48; if (i == q || i == q+1) return 1; + q = 64; if (i == q || i == q+1) return 1; + q = 80; if (i == q || i == q+1) return 1; + q = 96; if (i == q || i == q+1) return 1; + q = 112; if (i == q || i == q+1) return 1; + q = 128; if (i == q || i == q+1) return 1; + q = 144; if (i == q || i == q+1) return 1; + return 0; +} + +void show ( unsigned char* buf, int xx ) +{ + int i; + for (i = 0; i < 512; i++) { + if ((i % 16) == 0) + printf("%3d ", i); + if (xx && isFPLsbs(i)) + printf("xx "); + else + printf("%02x ", buf[i]); + if (i > 0 && ((i % 16) == 15)) + printf("\n"); + } +} + + +int main ( int argc, char** argv ) +{ + unsigned char* buf1 = memalign(16,512); + unsigned char* buf2 = memalign(16,512); + unsigned char* buf3 = memalign(16,512); + int xx = argc > 1; + printf("Re-run with any arg to suppress least-significant\n" + " 16 bits of FP numbers\n"); + memset(buf1, 0x55, 512); + memset(buf2, 0x55, 512); + memset(buf3, 0x55, 512); + + /* Load up x87/xmm state and dump it. */ + do_setup_then_fxsave(buf1); + printf("\nBEFORE\n"); + show(buf1, xx); + + /* Zeroise x87/xmm state and dump it, to show that the + regs have been cleared out. */ + do_zeroise(); + do_fxsave(buf2); + printf("\nZEROED\n"); + show(buf2, xx); + + /* Reload x87/xmm state from buf1 and dump it in buf3. */ + do_fxrstor(buf1); + do_fxsave(buf3); + printf("\nRESTORED\n"); + show(buf3, xx); + + free(buf1); free(buf2); free(buf3); + + return 0; +} diff --git a/memcheck/tests/x86/fxsave.stderr.exp b/memcheck/tests/x86/fxsave.stderr.exp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/memcheck/tests/x86/fxsave.stdout.exp b/memcheck/tests/x86/fxsave.stdout.exp new file mode 100644 index 0000000000..9b4deabcf8 --- /dev/null +++ b/memcheck/tests/x86/fxsave.stdout.exp @@ -0,0 +1,104 @@ +Re-run with any arg to suppress least-significant + 16 bits of FP numbers + +BEFORE + 0 7f 03 00 10 fc 00 00 00 00 00 00 00 00 00 00 00 + 16 00 00 00 00 00 00 00 00 80 1f 00 00 ff ff ff ff + 32 xx xx 00 00 00 00 00 80 ff 3f 00 00 00 00 00 00 + 48 xx xx 68 21 a2 da 0f c9 00 40 00 00 00 00 00 00 + 64 xx xx cf fb 84 9a 20 9a fd 3f 00 00 00 00 00 00 + 80 xx xx cf d1 f7 17 72 b1 fe 3f 00 00 00 00 00 00 + 96 xx xx 00 00 00 00 00 80 ff 3f 00 00 00 00 00 00 +112 xx xx 68 21 a2 da 0f c9 00 40 00 00 00 00 00 00 +128 xx xx 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +144 xx xx 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +160 78 56 34 12 44 33 22 11 88 77 66 55 21 43 65 87 +176 01 ef cd ab dd cc bb aa 11 00 ff ee ba dc fe 10 +192 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +208 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +224 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +240 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +256 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +272 79 b9 f9 b9 99 ff 99 bb 99 77 99 bb 9b 9f 9b 97 +288 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +304 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +320 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +336 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +352 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +368 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +384 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +400 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +416 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +432 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +448 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +464 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +480 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +496 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 + +ZEROED + 0 7f 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 16 00 00 00 00 00 00 00 00 80 1f 00 00 ff ff ff ff + 32 xx xx 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 48 xx xx 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 64 xx xx 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 80 xx xx 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 96 xx xx 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +112 xx xx 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +128 xx xx 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +144 xx xx 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +176 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +192 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +208 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +224 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +240 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +256 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +272 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +288 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +304 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +320 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +336 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +352 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +368 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +384 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +400 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +416 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +432 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +448 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +464 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +480 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +496 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 + +RESTORED + 0 7f 03 00 10 fc 00 00 00 00 00 00 00 00 00 00 00 + 16 00 00 00 00 00 00 00 00 80 1f 00 00 ff ff ff ff + 32 xx xx 00 00 00 00 00 80 ff 3f 00 00 00 00 00 00 + 48 xx xx 68 21 a2 da 0f c9 00 40 00 00 00 00 00 00 + 64 xx xx cf fb 84 9a 20 9a fd 3f 00 00 00 00 00 00 + 80 xx xx cf d1 f7 17 72 b1 fe 3f 00 00 00 00 00 00 + 96 xx xx 00 00 00 00 00 80 ff 3f 00 00 00 00 00 00 +112 xx xx 68 21 a2 da 0f c9 00 40 00 00 00 00 00 00 +128 xx xx 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +144 xx xx 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +160 78 56 34 12 44 33 22 11 88 77 66 55 21 43 65 87 +176 01 ef cd ab dd cc bb aa 11 00 ff ee ba dc fe 10 +192 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +208 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +224 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +240 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +256 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +272 79 b9 f9 b9 99 ff 99 bb 99 77 99 bb 9b 9f 9b 97 +288 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +304 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +320 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +336 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +352 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +368 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +384 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +400 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +416 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +432 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +448 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +464 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +480 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +496 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 diff --git a/memcheck/tests/x86/fxsave.vgtest b/memcheck/tests/x86/fxsave.vgtest new file mode 100644 index 0000000000..1049e63307 --- /dev/null +++ b/memcheck/tests/x86/fxsave.vgtest @@ -0,0 +1,4 @@ +prog: fxsave +prereq: ../../../tests/cputest x86-sse +vgopts: -q +args: x