From: Julian Seward Date: Wed, 27 Dec 2006 19:04:45 +0000 (+0000) Subject: Merge r1705 (Implement mfspr 268 and 269. Fixes #139050.) X-Git-Tag: svn/VALGRIND_3_2_3^2~22 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7594f23ad559d212555dbb11405bfd4403a5ad82;p=thirdparty%2Fvalgrind.git Merge r1705 (Implement mfspr 268 and 269. Fixes #139050.) git-svn-id: svn://svn.valgrind.org/vex/branches/VEX_3_2_BRANCH@1706 --- diff --git a/VEX/priv/guest-ppc/gdefs.h b/VEX/priv/guest-ppc/gdefs.h index 3f9295d231..e0624afdcb 100644 --- a/VEX/priv/guest-ppc/gdefs.h +++ b/VEX/priv/guest-ppc/gdefs.h @@ -147,6 +147,8 @@ enum { extern ULong ppcg_dirtyhelper_MFTB ( void ); +extern UInt ppc32g_dirtyhelper_MFSPR_268_269 ( UInt ); + extern void ppc32g_dirtyhelper_LVS ( VexGuestPPC32State* gst, UInt vD_idx, UInt sh, UInt shift_right ); diff --git a/VEX/priv/guest-ppc/ghelpers.c b/VEX/priv/guest-ppc/ghelpers.c index 300f13ce0c..37c69950a0 100644 --- a/VEX/priv/guest-ppc/ghelpers.c +++ b/VEX/priv/guest-ppc/ghelpers.c @@ -99,6 +99,24 @@ ULong ppcg_dirtyhelper_MFTB ( void ) } +/* CALLED FROM GENERATED CODE */ +/* DIRTY HELPER (non-referentially transparent) */ +UInt ppc32g_dirtyhelper_MFSPR_268_269 ( UInt r269 ) +{ +# if defined(__powerpc__) || defined(_AIX) + UInt spr; + if (r269) { + __asm__ __volatile__("mfspr %0,269" : "=b"(spr)); + } else { + __asm__ __volatile__("mfspr %0,268" : "=b"(spr)); + } + return spr; +# else + return 0; +# endif +} + + /* CALLED FROM GENERATED CODE */ /* DIRTY HELPER (reads guest state, writes guest mem) */ void ppc32g_dirtyhelper_LVS ( VexGuestPPC32State* gst, diff --git a/VEX/priv/guest-ppc/toIR.c b/VEX/priv/guest-ppc/toIR.c index f57aa153e5..c896983608 100644 --- a/VEX/priv/guest-ppc/toIR.c +++ b/VEX/priv/guest-ppc/toIR.c @@ -5307,6 +5307,28 @@ static Bool dis_proc_ctl ( UInt theInstr ) /* Signed */False) ); break; + /* Even a lowly PPC7400 can run the associated helper, so no + obvious need for feature testing at this point. */ + case 268 /* 0x10C */: + case 269 /* 0x10D */: { + UInt arg = SPR==268 ? 0 : 1; + IRTemp val = newTemp(Ity_I32); + IRExpr** args = mkIRExprVec_1( mkU32(arg) ); + IRDirty* d = unsafeIRDirty_1_N( + val, + 0/*regparms*/, + "ppc32g_dirtyhelper_MFSPR_268_269", + fnptr_to_fnentry + (&ppc32g_dirtyhelper_MFSPR_268_269), + args + ); + /* execute the dirty call, dumping the result in val. */ + stmt( IRStmt_Dirty(d) ); + putIReg( rD_addr, mkexpr(val) ); + DIP("mfspr r%u,%u", rD_addr, (UInt)SPR); + break; + } + default: vex_printf("dis_proc_ctl(ppc)(mfspr,SPR)(0x%x)\n", SPR); return False;