Mark Wielaard 5f750d
commit cbc52cfe6658f89f6857febf2b1e5c9edab7f397
Mark Wielaard 5f750d
Author: carll <carll@8f6e269a-dfd6-0310-a8e1-e2731360e62c>
Mark Wielaard 5f750d
Date:   Wed Sep 16 23:01:04 2015 +0000
Mark Wielaard 5f750d
Mark Wielaard 5f750d
    Add support for the Power PC mbar instruction.
Mark Wielaard 5f750d
    
Mark Wielaard 5f750d
    This patch fixes bugzilla 352768.
Mark Wielaard 5f750d
    
Mark Wielaard 5f750d
    
Mark Wielaard 5f750d
    git-svn-id: svn://svn.valgrind.org/vex/trunk@3190 8f6e269a-dfd6-0310-a8e1-e2731360e62c
Mark Wielaard 5f750d
Mark Wielaard 5f750d
diff --git a/VEX/priv/guest_ppc_toIR.c b/VEX/priv/guest_ppc_toIR.c
Mark Wielaard 5f750d
index a0ee34a..6a0b6d8 100644
Mark Wielaard 5f750d
--- a/VEX/priv/guest_ppc_toIR.c
Mark Wielaard 5f750d
+++ b/VEX/priv/guest_ppc_toIR.c
Mark Wielaard 5f750d
@@ -6369,6 +6369,7 @@ static Bool dis_memsync ( UInt theInstr )
Mark Wielaard 5f750d
    UInt  b11to25 = IFIELD(theInstr, 11, 15);
Mark Wielaard 5f750d
    UChar flag_L  = ifieldRegDS(theInstr);
Mark Wielaard 5f750d
    UInt  b11to20 = IFIELD(theInstr, 11, 10);
Mark Wielaard 5f750d
+   UInt  M0      = IFIELD(theInstr, 11, 5);
Mark Wielaard 5f750d
    UChar rD_addr = ifieldRegDS(theInstr);
Mark Wielaard 5f750d
    UChar rS_addr = rD_addr;
Mark Wielaard 5f750d
    UChar rA_addr = ifieldRegA(theInstr);
Mark Wielaard 5f750d
@@ -6399,12 +6400,20 @@ static Bool dis_memsync ( UInt theInstr )
Mark Wielaard 5f750d
    /* X-Form */
Mark Wielaard 5f750d
    case 0x1F:
Mark Wielaard 5f750d
       switch (opc2) {
Mark Wielaard 5f750d
-      case 0x356: // eieio (Enforce In-Order Exec of I/O, PPC32 p394)
Mark Wielaard 5f750d
-         if (b11to25 != 0 || b0 != 0) {
Mark Wielaard 5f750d
-            vex_printf("dis_memsync(ppc)(eiei0,b11to25|b0)\n");
Mark Wielaard 5f750d
-            return False;
Mark Wielaard 5f750d
+      case 0x356: // eieio or mbar (Enforce In-Order Exec of I/O, PPC32 p394)
Mark Wielaard 5f750d
+         if (M0 == 0) {
Mark Wielaard 5f750d
+            if (b11to20 != 0 || b0 != 0) {
Mark Wielaard 5f750d
+               vex_printf("dis_memsync(ppc)(eieio,b11to20|b0)\n");
Mark Wielaard 5f750d
+               return False;
Mark Wielaard 5f750d
+            }
Mark Wielaard 5f750d
+            DIP("eieio\n");
Mark Wielaard 5f750d
+         } else {
Mark Wielaard 5f750d
+            if (b11to20 != 0 || b0 != 0) {
Mark Wielaard 5f750d
+               vex_printf("dis_memsync(ppc)(mbar,b11to20|b0)\n");
Mark Wielaard 5f750d
+               return False;
Mark Wielaard 5f750d
+            }
Mark Wielaard 5f750d
+            DIP("mbar %d\n", M0);
Mark Wielaard 5f750d
          }
Mark Wielaard 5f750d
-         DIP("eieio\n");
Mark Wielaard 5f750d
          /* Insert a memory fence, just to be on the safe side. */
Mark Wielaard 5f750d
          stmt( IRStmt_MBE(Imbe_Fence) );
Mark Wielaard 5f750d
          break;