From: Julian Seward Date: Sat, 5 Nov 2005 02:55:06 +0000 (+0000) Subject: Implement FINIT. X-Git-Tag: svn/VALGRIND_3_1_1^2~51 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b3262f5d2cb989dce4bd10f3811c635b71531cfd;p=thirdparty%2Fvalgrind.git Implement FINIT. git-svn-id: svn://svn.valgrind.org/vex/trunk@1440 --- diff --git a/VEX/priv/guest-amd64/gdefs.h b/VEX/priv/guest-amd64/gdefs.h index 6c4fabc47f..7d2e9f6d9f 100644 --- a/VEX/priv/guest-amd64/gdefs.h +++ b/VEX/priv/guest-amd64/gdefs.h @@ -145,6 +145,8 @@ extern void amd64g_dirtyhelper_storeF80le ( ULong/*addr*/, ULong/*data*/ ); extern void amd64g_dirtyhelper_CPUID ( VexGuestAMD64State* st ); +extern void amd64g_dirtyhelper_FINIT ( VexGuestAMD64State* ); + extern ULong amd64g_dirtyhelper_RDTSC ( void ); //extern void amd64g_dirtyhelper_CPUID_sse0 ( VexGuestAMD64State* ); @@ -153,8 +155,6 @@ extern ULong amd64g_dirtyhelper_RDTSC ( void ); //extern void amd64g_dirtyhelper_FSAVE ( VexGuestAMD64State*, HWord ); -//extern void amd64g_dirtyhelper_FINIT ( VexGuestAMD64State* ); - //extern VexEmWarn // amd64g_dirtyhelper_FRSTOR ( VexGuestAMD64State*, HWord ); diff --git a/VEX/priv/guest-amd64/ghelpers.c b/VEX/priv/guest-amd64/ghelpers.c index d4532be74f..a1cfb5a26c 100644 --- a/VEX/priv/guest-amd64/ghelpers.c +++ b/VEX/priv/guest-amd64/ghelpers.c @@ -1321,10 +1321,8 @@ ULong amd64g_calculate_FXAM ( ULong tag, ULong dbl ) } -// MAYBE NOT TRUE: /* CALLED FROM GENERATED CODE */ -// MAYBE NOT TRUE: /* DIRTY HELPER (writes guest state) */ +/* DIRTY HELPER (writes guest state) */ /* Initialise the x87 FPU state as per 'finit'. */ -static void amd64g_dirtyhelper_FINIT ( VexGuestAMD64State* gst ) { Int i; diff --git a/VEX/priv/guest-amd64/toIR.c b/VEX/priv/guest-amd64/toIR.c index f335a766b4..051ecc2c32 100644 --- a/VEX/priv/guest-amd64/toIR.c +++ b/VEX/priv/guest-amd64/toIR.c @@ -5112,45 +5112,45 @@ ULong dis_FPU ( /*OUT*/Bool* decode_ok, DIP("fnclex\n"); break; -//.. case 0xE3: { -//.. /* Uses dirty helper: -//.. void x86g_do_FINIT ( VexGuestX86State* ) */ -//.. IRDirty* d = unsafeIRDirty_0_N ( -//.. 0/*regparms*/, -//.. "x86g_dirtyhelper_FINIT", -//.. &x86g_dirtyhelper_FINIT, -//.. mkIRExprVec_0() -//.. ); -//.. d->needsBBP = True; -//.. -//.. /* declare we're writing guest state */ -//.. d->nFxState = 5; -//.. -//.. d->fxState[0].fx = Ifx_Write; -//.. d->fxState[0].offset = OFFB_FTOP; -//.. d->fxState[0].size = sizeof(UInt); -//.. -//.. d->fxState[1].fx = Ifx_Write; -//.. d->fxState[1].offset = OFFB_FPREGS; -//.. d->fxState[1].size = 8 * sizeof(ULong); -//.. -//.. d->fxState[2].fx = Ifx_Write; -//.. d->fxState[2].offset = OFFB_FPTAGS; -//.. d->fxState[2].size = 8 * sizeof(UChar); -//.. -//.. d->fxState[3].fx = Ifx_Write; -//.. d->fxState[3].offset = OFFB_FPROUND; -//.. d->fxState[3].size = sizeof(UInt); -//.. -//.. d->fxState[4].fx = Ifx_Write; -//.. d->fxState[4].offset = OFFB_FC3210; -//.. d->fxState[4].size = sizeof(UInt); -//.. -//.. stmt( IRStmt_Dirty(d) ); -//.. -//.. DIP("fninit\n"); -//.. break; -//.. } + case 0xE3: { + /* Uses dirty helper: + void amd64g_do_FINIT ( VexGuestAMD64State* ) */ + IRDirty* d = unsafeIRDirty_0_N ( + 0/*regparms*/, + "amd64g_dirtyhelper_FINIT", + &amd64g_dirtyhelper_FINIT, + mkIRExprVec_0() + ); + d->needsBBP = True; + + /* declare we're writing guest state */ + d->nFxState = 5; + + d->fxState[0].fx = Ifx_Write; + d->fxState[0].offset = OFFB_FTOP; + d->fxState[0].size = sizeof(UInt); + + d->fxState[1].fx = Ifx_Write; + d->fxState[1].offset = OFFB_FPREGS; + d->fxState[1].size = 8 * sizeof(ULong); + + d->fxState[2].fx = Ifx_Write; + d->fxState[2].offset = OFFB_FPTAGS; + d->fxState[2].size = 8 * sizeof(UChar); + + d->fxState[3].fx = Ifx_Write; + d->fxState[3].offset = OFFB_FPROUND; + d->fxState[3].size = sizeof(ULong); + + d->fxState[4].fx = Ifx_Write; + d->fxState[4].offset = OFFB_FC3210; + d->fxState[4].size = sizeof(ULong); + + stmt( IRStmt_Dirty(d) ); + + DIP("fninit\n"); + break; + } case 0xE8 ... 0xEF: /* FUCOMI %st(0),%st(?) */ fp_do_ucomi_ST0_STi( (UInt)modrm - 0xE8, False );