|
From: <ml...@so...> - 2009-06-18 20:37:12
|
Hi, I think I have found a solution for this problem. It seems that VEX have no implementation for this instruction, so I have added this instruction now. And it seem to do the job. I am not 100% sure that I have made the implementation correct, but at least it works for me, and I can continue to use Valgrind. It has already reported a bunch of memory leaks! I can't make 3.4.1 or the latest SVN version work, due to some other problem. (Writes a lot of strange errors and finally quits due to too many errors). So I use version 3.3.1, which works fine for me. The diff below is from VEX revision 1900 (svn://svn.valgrind.org/vex/trunk). I hope that someone can review the changes and commit them to the repository if they are OK. Kind regards Mogens mln@dhcppc6:~/TargetTools/valgrind/valgrind/VEX> svn diff Index: priv/guest-ppc/ghelpers.c =================================================================== --- priv/guest-ppc/ghelpers.c (revision 1900) +++ priv/guest-ppc/ghelpers.c (working copy) @@ -101,14 +101,23 @@ /* CALLED FROM GENERATED CODE */ /* DIRTY HELPER (non-referentially transparent) */ -UInt ppc32g_dirtyhelper_MFSPR_268_269 ( UInt r269 ) +UInt ppc32g_dirtyhelper_MFSPR ( UInt reg ) { # if defined(__powerpc__) || defined(_AIX) - UInt spr; - if (r269) { - __asm__ __volatile__("mfspr %0,269" : "=b"(spr)); - } else { - __asm__ __volatile__("mfspr %0,268" : "=b"(spr)); + UInt spr = 0; + switch(reg) + { + case 268: + __asm__ __volatile__("mfspr %0,268" : "=b"(spr)); + break; + case 269: + __asm__ __volatile__("mfspr %0,269" : "=b"(spr)); + break; + case 287: + __asm__ __volatile__("mfspr %0,287" : "=b"(spr)); + break; + default: + break; } return spr; # else Index: priv/guest-ppc/gdefs.h =================================================================== --- priv/guest-ppc/gdefs.h (revision 1900) +++ priv/guest-ppc/gdefs.h (working copy) @@ -148,7 +148,7 @@ extern ULong ppcg_dirtyhelper_MFTB ( void ); -extern UInt ppc32g_dirtyhelper_MFSPR_268_269 ( UInt ); +extern UInt ppc32g_dirtyhelper_MFSPR ( UInt ); extern void ppc32g_dirtyhelper_LVS ( VexGuestPPC32State* gst, UInt vD_idx, UInt sh, Index: priv/guest-ppc/toIR.c =================================================================== --- priv/guest-ppc/toIR.c (revision 1900) +++ priv/guest-ppc/toIR.c (working copy) @@ -5447,16 +5447,17 @@ /* 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; + case 269 /* 0x10D */: + case 287 /* 0x11F: mfpvr rt / mfspr rt,287 */: { + UInt arg = SPR; IRTemp val = newTemp(Ity_I32); IRExpr** args = mkIRExprVec_1( mkU32(arg) ); IRDirty* d = unsafeIRDirty_1_N( val, 0/*regparms*/, - "ppc32g_dirtyhelper_MFSPR_268_269", + "ppc32g_dirtyhelper_MFSPR", fnptr_to_fnentry - (vbi, &ppc32g_dirtyhelper_MFSPR_268_269), + (vbi, &ppc32g_dirtyhelper_MFSPR), args ); /* execute the dirty call, dumping the result in val. */ mln@dhcppc6:~/TargetTools/valgrind/valgrind/VEX> <P><p><font face="Arial, Helvetica, sans-serif" size="2" style="font-size:13.5px">_______________________________________________________________<BR>http://www.sol.dk/ - Debat mail biler job rejser og meget mere</font> |