]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Merge r1705 (Implement mfspr 268 and 269. Fixes #139050.)
authorJulian Seward <jseward@acm.org>
Wed, 27 Dec 2006 19:04:45 +0000 (19:04 +0000)
committerJulian Seward <jseward@acm.org>
Wed, 27 Dec 2006 19:04:45 +0000 (19:04 +0000)
git-svn-id: svn://svn.valgrind.org/vex/branches/VEX_3_2_BRANCH@1706

VEX/priv/guest-ppc/gdefs.h
VEX/priv/guest-ppc/ghelpers.c
VEX/priv/guest-ppc/toIR.c

index 3f9295d231fa46bac496f98914eb269f33dec21d..e0624afdcb47ea04906dfabe65769e34bb216e74 100644 (file)
@@ -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 );
index 300f13ce0cdd40e4b5250c30e88544b895339d4c..37c69950a087af65f39a071a69733585b0db8b2d 100644 (file)
@@ -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,
index f57aa153e5340d096bea44891da37490e25e6d39..c89698360831ce2b2253e5cda83d243e4de5ecaf 100644 (file)
@@ -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;