From: Carl Love Date: Tue, 31 Oct 2017 18:45:28 +0000 (-0500) Subject: Fix access to time base register to return 64-bits. X-Git-Tag: VALGRIND_3_14_0~213 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6a55b1e82ccda3f0d663d2cc89eb543ae2d096bf;p=thirdparty%2Fvalgrind.git Fix access to time base register to return 64-bits. --- diff --git a/NEWS b/NEWS index 3fca968d65..c9961b4485 100644 --- a/NEWS +++ b/NEWS @@ -68,6 +68,7 @@ where XXXXXX is the bug number as listed below. 385334 PPC64, fix vpermr, xxperm, xxpermr mask value. 385868 glibc ld.so _dl_runtime_resolve_avx_slow conditional jump warning. 385912 none/tests/rlimit_nofile fails on newer glibc/kernel. +386397 PPC64, valgrind truncates powerpc timebase to 32-bits. n-i-bz Fix missing workq_ops operations (macOS) n-i-bz fix bug in strspn replacement diff --git a/VEX/priv/guest_ppc_toIR.c b/VEX/priv/guest_ppc_toIR.c index f63146e7e2..4ec37f5f99 100644 --- a/VEX/priv/guest_ppc_toIR.c +++ b/VEX/priv/guest_ppc_toIR.c @@ -9419,26 +9419,60 @@ static Bool dis_proc_ctl ( const VexAbiInfo* vbi, UInt theInstr ) putIReg( rD_addr, getGST( PPC_GST_SPRG3_RO ) ); 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) ); + case 268 /* 0x10C TB - 64 bit time base register */: + { + IRTemp val = newTemp(Ity_I64); + IRExpr** args = mkIRExprVec_0(); IRDirty* d = unsafeIRDirty_1_N( - val, - 0/*regparms*/, - "ppc32g_dirtyhelper_MFSPR_268_269", - fnptr_to_fnentry - (vbi, &ppc32g_dirtyhelper_MFSPR_268_269), - args - ); + val, + 0/*regparms*/, + "ppcg_dirtyhelper_MFTB", + fnptr_to_fnentry(vbi, + &ppcg_dirtyhelper_MFTB), + args ); + /* execute the dirty call, dumping the result in val. */ + stmt( IRStmt_Dirty(d) ); + putIReg( rD_addr, (mode64) ? mkexpr(val) : + unop(Iop_64to32, mkexpr(val)) ); + + break; + } + case 269 /* 0x10D TBU - upper 32-bits of time base register */: + { + DIP("mfspr r%u,%u", rD_addr, SPR); + IRTemp val = newTemp(Ity_I64); + IRExpr** args = mkIRExprVec_0(); + IRDirty* d = unsafeIRDirty_1_N( + val, + 0/*regparms*/, + "ppcg_dirtyhelper_MFTB", + fnptr_to_fnentry(vbi, + &ppcg_dirtyhelper_MFTB), + args ); /* execute the dirty call, dumping the result in val. */ stmt( IRStmt_Dirty(d) ); putIReg( rD_addr, - mkWidenFrom32(ty, mkexpr(val), False/*unsigned*/) ); + mkWidenFrom32(ty, unop(Iop_64HIto32, mkexpr(val)), + /* Signed */False) ); + break; + } + case 284 /* 0x1 TBL - lower 32-bits of time base register */: + { DIP("mfspr r%u,%u", rD_addr, SPR); + IRTemp val = newTemp(Ity_I64); + IRExpr** args = mkIRExprVec_0(); + IRDirty* d = unsafeIRDirty_1_N( + val, + 0/*regparms*/, + "ppcg_dirtyhelper_MFTB", + fnptr_to_fnentry(vbi, + &ppcg_dirtyhelper_MFTB), + args ); + /* execute the dirty call, dumping the result in val. */ + stmt( IRStmt_Dirty(d) ); + putIReg( rD_addr, + mkWidenFrom32(ty, unop(Iop_64to32, mkexpr(val)), + /* Signed */False) ); break; } @@ -9493,6 +9527,12 @@ static Bool dis_proc_ctl ( const VexAbiInfo* vbi, UInt theInstr ) putIReg( rD_addr, (mode64) ? mkexpr(val) : unop(Iop_64to32, mkexpr(val)) ); break; + case 284: + DIP("mftbl r%u", rD_addr); + putIReg( rD_addr, + mkWidenFrom32(ty, unop(Iop_64to32, mkexpr(val)), + /* Signed */False) ); + break; default: return False; /* illegal instruction */ }