From: Julian Seward Date: Sat, 13 Jul 2002 12:27:12 +0000 (+0000) Subject: Implement fnstenv (store FPU environment, but not regs AIUI) X-Git-Tag: svn/VALGRIND_1_0_3~14 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f485f3c6dd723beed0be2412c86b6ce8e771d8e0;p=thirdparty%2Fvalgrind.git Implement fnstenv (store FPU environment, but not regs AIUI) (Jeff Epler) git-svn-id: svn://svn.valgrind.org/valgrind/trunk@492 --- diff --git a/coregrind/vg_memory.c b/coregrind/vg_memory.c index 4b4fe0cff5..eca0dc215d 100644 --- a/coregrind/vg_memory.c +++ b/coregrind/vg_memory.c @@ -1223,6 +1223,12 @@ void VGM_(fpu_write_check) ( Addr addr, Int size ) return; } + if (size == 28) { + PROF_EVENT(89); /* XXX assign correct event number */ + fpu_write_check_SLOWLY ( addr, 28 ); + return; + } + VG_(printf)("size is %d\n", size); VG_(panic)("vgm_fpu_write_check: unhandled size"); # endif diff --git a/coregrind/vg_to_ucode.c b/coregrind/vg_to_ucode.c index 9230236fab..e56b02cab2 100644 --- a/coregrind/vg_to_ucode.c +++ b/coregrind/vg_to_ucode.c @@ -2415,6 +2415,8 @@ Addr dis_fpu ( UCodeBlock* cb, UChar first_byte, Addr eip ) return dis_fpu_mem(cb, 4, wr, eip, first_byte); case 5: /* FLDCW */ return dis_fpu_mem(cb, 2, rd, eip, first_byte); + case 6: /* FNSTENV */ + return dis_fpu_mem(cb, 28, wr, eip, first_byte); case 7: /* FSTCW */ /* HACK! FSTCW actually writes 2 bytes, not 4. glibc gets lots of moaning in __floor() if we do the right diff --git a/vg_memory.c b/vg_memory.c index 4b4fe0cff5..eca0dc215d 100644 --- a/vg_memory.c +++ b/vg_memory.c @@ -1223,6 +1223,12 @@ void VGM_(fpu_write_check) ( Addr addr, Int size ) return; } + if (size == 28) { + PROF_EVENT(89); /* XXX assign correct event number */ + fpu_write_check_SLOWLY ( addr, 28 ); + return; + } + VG_(printf)("size is %d\n", size); VG_(panic)("vgm_fpu_write_check: unhandled size"); # endif diff --git a/vg_to_ucode.c b/vg_to_ucode.c index 9230236fab..e56b02cab2 100644 --- a/vg_to_ucode.c +++ b/vg_to_ucode.c @@ -2415,6 +2415,8 @@ Addr dis_fpu ( UCodeBlock* cb, UChar first_byte, Addr eip ) return dis_fpu_mem(cb, 4, wr, eip, first_byte); case 5: /* FLDCW */ return dis_fpu_mem(cb, 2, rd, eip, first_byte); + case 6: /* FNSTENV */ + return dis_fpu_mem(cb, 28, wr, eip, first_byte); case 7: /* FSTCW */ /* HACK! FSTCW actually writes 2 bytes, not 4. glibc gets lots of moaning in __floor() if we do the right