]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Fix access to time base register to return 64-bits.
authorCarl Love <carll@us.ibm.com>
Tue, 31 Oct 2017 18:45:28 +0000 (13:45 -0500)
committerCarl Love <carll@us.ibm.com>
Tue, 31 Oct 2017 18:45:28 +0000 (13:45 -0500)
NEWS
VEX/priv/guest_ppc_toIR.c

diff --git a/NEWS b/NEWS
index 3fca968d65928946ba41ff41dfe10a7a89b744ba..c9961b448549c50331b206fb96ac655bf5e4214f 100644 (file)
--- 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
index f63146e7e25618e75ed8c5773175e29ed230e28b..4ec37f5f994f68bec952d10b41b46a2e98dea981 100644 (file)
@@ -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 */
       }