]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
mips: improve support for RDHWR instruction
authorPetar Jovanovic <mips32r2@gmail.com>
Mon, 8 May 2017 15:32:25 +0000 (15:32 +0000)
committerPetar Jovanovic <mips32r2@gmail.com>
Mon, 8 May 2017 15:32:25 +0000 (15:32 +0000)
Add support for reading CPUNum, CC and CCRes registers using RDHWR.
This is a fix for KDE #379473.

Patch by Aleksandar Rikalo.

git-svn-id: svn://svn.valgrind.org/vex/trunk@3362

VEX/priv/guest_mips_defs.h
VEX/priv/guest_mips_helpers.c
VEX/priv/guest_mips_toIR.c

index 6776a802b4e061a8d03a1647678ef2137f14044a..a748657b83f5a6a8c6c10aa6806e39ab69b33f63 100644 (file)
@@ -101,8 +101,7 @@ typedef enum {
 #endif
 
 #if defined(__mips__) && ((defined(__mips_isa_rev) && __mips_isa_rev >= 2))
-extern UInt mips32_dirtyhelper_rdhwr ( UInt rt, UInt rd );
-extern ULong mips64_dirtyhelper_rdhwr ( ULong rt, ULong rd );
+extern HWord mips_dirtyhelper_rdhwr ( UInt rt, UInt rd );
 #endif
 
 /* Calculate FCSR in fp32 mode. */
index 6a62dc7dfd0ea674e493e8fbd3d895d45a482d08..fdc00bd57d066caa3e44bf03683425ff12987d5c 100644 (file)
@@ -425,31 +425,24 @@ VexGuestLayout mips64Guest_layout = {
 };
 
 #if defined(__mips__) && ((defined(__mips_isa_rev) && __mips_isa_rev >= 2))
-UInt mips32_dirtyhelper_rdhwr ( UInt rt, UInt rd )
+HWord mips_dirtyhelper_rdhwr ( UInt rt, UInt rd )
 {
-   UInt x = 0;
+   HWord x = 0;
    switch (rd) {
-      case 1:  /* x = SYNCI_StepSize() */
-         __asm__ __volatile__("rdhwr %0, $1\n\t" : "=r" (x) );
+      case 0:  /* x = CPUNum() */
+         __asm__ __volatile__("rdhwr %0, $0\n\t" : "=r" (x) );
          break;
 
-      case 31:  /* x = CVMX_get_cycles() */
-         __asm__ __volatile__("rdhwr %0, $31\n\t" : "=r" (x) );
+      case 1:  /* x = SYNCI_Step() */
+         __asm__ __volatile__("rdhwr %0, $1\n\t" : "=r" (x) );
          break;
 
-      default:
-         vassert(0);
+      case 2:  /* x = CC() */
+         __asm__ __volatile__("rdhwr %0, $2\n\t" : "=r" (x) );
          break;
-   }
-   return x;
-}
 
-ULong mips64_dirtyhelper_rdhwr ( ULong rt, ULong rd )
-{
-   ULong x = 0;
-   switch (rd) {
-      case 1:  /* x = SYNCI_StepSize() */
-         __asm__ __volatile__("rdhwr %0, $1\n\t" : "=r" (x) );
+      case 3:  /* x = CCRes() */
+         __asm__ __volatile__("rdhwr %0, $3\n\t" : "=r" (x) );
          break;
 
       case 31:  /* x = CVMX_get_cycles() */
index 160efbad568bd28d183ab101f239d24baf8a385b..46e3824321cb2d71f9f92fecd6db9cefd3f11072 100644 (file)
@@ -15096,31 +15096,19 @@ static DisResult disInstr_MIPS_WRK ( Bool(*resteerOkFn) (/*opaque */void *,
             if (rd == 29) {
                putIReg(rt, getULR());
 #if defined(__mips__) && ((defined(__mips_isa_rev) && __mips_isa_rev >= 2))
-            } else if (rd == 1
+            } else if (rd <= 3
                        || (rd == 31
                            && VEX_MIPS_COMP_ID(archinfo->hwcaps)
                                                     == VEX_PRID_COMP_CAVIUM)) {
-               if (mode64) {
-                  IRTemp   val  = newTemp(Ity_I64);
-                  IRExpr** args = mkIRExprVec_2 (mkU64(rt), mkU64(rd));
-                  IRDirty *d = unsafeIRDirty_1_N(val,
-                                                 0,
-                                                 "mips64_dirtyhelper_rdhwr",
-                                                 &mips64_dirtyhelper_rdhwr,
-                                                 args);
-                  stmt(IRStmt_Dirty(d));
-                  putIReg(rt, mkexpr(val));
-               } else {
-                  IRTemp   val  = newTemp(Ity_I32);
-                  IRExpr** args = mkIRExprVec_2 (mkU32(rt), mkU32(rd));
-                  IRDirty *d = unsafeIRDirty_1_N(val,
-                                                 0,
-                                                 "mips32_dirtyhelper_rdhwr",
-                                                 &mips32_dirtyhelper_rdhwr,
-                                                 args);
-                  stmt(IRStmt_Dirty(d));
-                  putIReg(rt, mkexpr(val));
-               }
+               IRExpr** args = mkIRExprVec_2 (mkU32(rt), mkU32(rd));
+               IRTemp   val  = newTemp(ty);
+               IRDirty *d = unsafeIRDirty_1_N(val,
+                                              0,
+                                              "mips_dirtyhelper_rdhwr",
+                                              &mips_dirtyhelper_rdhwr,
+                                              args);
+               stmt(IRStmt_Dirty(d));
+               putIReg(rt, mkexpr(val));
 #endif
             } else
                goto decode_failure;