]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Added support for atomic modifications (VEX' Imbe_BusLock/Imbe_BusUnlock).
authorBart Van Assche <bvanassche@acm.org>
Fri, 7 Mar 2008 17:22:26 +0000 (17:22 +0000)
committerBart Van Assche <bvanassche@acm.org>
Fri, 7 Mar 2008 17:22:26 +0000 (17:22 +0000)
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@7581

exp-drd/drd_main.c
exp-drd/tests/tc11_XCHG.stderr.exp

index 0262962edbcd243d81a636469caf9e87fb1b673d..1c71d8a62b8bc1b618603dccb6398e7f333c4003 100644 (file)
 
 // Function declarations.
 
-static void instrument_memory_bus_event(IRSB* const bb,
-                                        const IRMBusEvent event);
 static void drd_start_client_code(const ThreadId tid, const ULong bbs_done);
 static void drd_set_running_tid(const ThreadId tid);
-static void evh__bus_lock(void);
-static void evh__bus_unlock(void);
-
 
 
 // Local variables.
@@ -583,6 +578,7 @@ IRSB* drd_instrument(VgCallbackClosure* const closure,
    IRExpr*  addr_expr;
    IRExpr*  size_expr;
    Bool     instrument = True;
+   Bool     bus_locked = False;
 
    /* Set up BB */
    bb           = emptyIRSB();
@@ -605,12 +601,26 @@ IRSB* drd_instrument(VgCallbackClosure* const closure,
          break;
 
       case Ist_MBE:
-         instrument_memory_bus_event(bb, st->Ist.MBE.event);
+         switch (st->Ist.MBE.event)
+         {
+         case Imbe_Fence:
+            break; /* not interesting */
+         case Imbe_BusLock:
+            tl_assert(! bus_locked);
+            bus_locked = True;
+            break;
+         case Imbe_BusUnlock:
+            tl_assert(bus_locked);
+            bus_locked = False;
+            break;
+         default:
+            tl_assert(0);
+         }
          addStmtToIRSB(bb, st);
          break;
 
       case Ist_Store:
-         if (instrument)
+         if (instrument && ! bus_locked)
          {
             addr_expr = st->Ist.Store.addr;
             size_expr = mkIRExpr_HWord( 
@@ -666,7 +676,9 @@ IRSB* drd_instrument(VgCallbackClosure* const closure,
                                          argv);
                   addStmtToIRSB(bb, IRStmt_Dirty(di));
                }
-               if (mFx == Ifx_Write || mFx == Ifx_Modify) {
+               if ((mFx == Ifx_Write || mFx == Ifx_Modify)
+                   && ! bus_locked)
+               {
                   di = unsafeIRDirty_0_N(
                                          /*regparms*/2,
                                          "drd_trace_store",
@@ -688,48 +700,9 @@ IRSB* drd_instrument(VgCallbackClosure* const closure,
       }
    }
 
-   return bb;
-}
+   tl_assert(! bus_locked);
 
-/* Based on the function with the same name in Helgrind's hg_main.c */
-static void instrument_memory_bus_event(IRSB* const bb,
-                                        const IRMBusEvent event)
-{
-   switch (event)
-   {
-   case Imbe_Fence:
-      break; /* not interesting */
-   case Imbe_BusLock:
-      addStmtToIRSB(bb,
-         IRStmt_Dirty(unsafeIRDirty_0_N(0/*regparms*/, "evh__bus_lock",
-                  VG_(fnptr_to_fnentry)(&evh__bus_lock), mkIRExprVec_0())
-                      ));
-      break;
-   case Imbe_BusUnlock:
-      addStmtToIRSB(bb,
-         IRStmt_Dirty(unsafeIRDirty_0_N(0/*regparms*/, "evh__bus_unlock",
-                  VG_(fnptr_to_fnentry)(&evh__bus_unlock), mkIRExprVec_0())
-                      ));
-      break;
-   default:
-      tl_assert(0);
-   }
-}
-
-/** Locking the memory bus is a way to serialize store operations.
- *  What the lwarx / stwcx instructions do on PowerPC is to detect whether
- *  any other CPU has invalidated the cache line in which the location
- *  specified by lwarx resides has been invalidated at the time the stwcx
- *  instruction is executed.
- */
-static void evh__bus_lock(void)
-{
-   /* To do: implement this function. */
-}
-
-static void evh__bus_unlock(void)
-{
-   /* To do: implement this function. */
+   return bb;
 }
 
 static void drd_set_running_tid(const ThreadId vg_tid)
index f715e4b002f19ae9125cfb621c896def283e65bd..d18786f80668a209115b4a13cf5e8afa8d9cd471 100644 (file)
@@ -1,18 +1,3 @@
 
-Conflicting load by thread 1 at 0x........ size 4
-   at 0x........: main (tc11_XCHG.c:78)
-Allocation context: unknown
-Other segment start (thread 2)
-   (thread finished, call stack no longer available)
-Other segment end (thread 2)
-   (thread finished, call stack no longer available)
 
-Conflicting store by thread 1 at 0x........ size 4
-   at 0x........: main (tc11_XCHG.c:78)
-Allocation context: unknown
-Other segment start (thread 2)
-   (thread finished, call stack no longer available)
-Other segment end (thread 2)
-   (thread finished, call stack no longer available)
-
-ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
+ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)