From: Julian Seward Date: Mon, 30 Jun 2008 10:31:47 +0000 (+0000) Subject: Add Imbe_SnoopedStoreBegin and Imbe_SnoopedStoreEnd, to be used for X-Git-Tag: svn/VALGRIND_3_4_1^2~23 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c67b21e2d3a2f3e83c1990da365f9a0be1c320ca;p=thirdparty%2Fvalgrind.git Add Imbe_SnoopedStoreBegin and Imbe_SnoopedStoreEnd, to be used for bracketing snooped stores; fix up compilation pipeline to accept (ignore) them. git-svn-id: svn://svn.valgrind.org/vex/trunk@1857 --- diff --git a/VEX/priv/guest-ppc/toIR.c b/VEX/priv/guest-ppc/toIR.c index 0ea60eae4b..1721baade1 100644 --- a/VEX/priv/guest-ppc/toIR.c +++ b/VEX/priv/guest-ppc/toIR.c @@ -4895,9 +4895,13 @@ static Bool dis_memsync ( UInt theInstr ) If resaddr != lwarx_resaddr, CR0[EQ] is undefined, and whether rS is stored is dependent on that value. */ - /* Success? Do the (32bit) store */ + /* Success? Do the (32bit) store. Mark the store as + snooped, so that threading tools can handle it differently + if necessary. */ + stmt( IRStmt_MBE(Imbe_SnoopedStoreBegin) ); storeBE( mkexpr(EA), mkSzNarrow32(ty, mkexpr(rS)) ); - + stmt( IRStmt_MBE(Imbe_SnoopedStoreEnd) ); + // Set CR0[LT GT EQ S0] = 0b001 || XER[SO] putCR321(0, mkU8(1<<1)); break; diff --git a/VEX/priv/host-ppc/isel.c b/VEX/priv/host-ppc/isel.c index b0bc3bd21b..6911407b1c 100644 --- a/VEX/priv/host-ppc/isel.c +++ b/VEX/priv/host-ppc/isel.c @@ -3947,6 +3947,8 @@ static void iselStmt ( ISelEnv* env, IRStmt* stmt ) return; case Imbe_BusLock: case Imbe_BusUnlock: + case Imbe_SnoopedStoreBegin: + case Imbe_SnoopedStoreEnd: return; default: break; diff --git a/VEX/priv/ir/irdefs.c b/VEX/priv/ir/irdefs.c index 55c5aaa57b..f2528c5f43 100644 --- a/VEX/priv/ir/irdefs.c +++ b/VEX/priv/ir/irdefs.c @@ -745,10 +745,12 @@ void ppIRJumpKind ( IRJumpKind kind ) void ppIRMBusEvent ( IRMBusEvent event ) { switch (event) { - case Imbe_Fence: vex_printf("Fence"); break; - case Imbe_BusLock: vex_printf("BusLock"); break; - case Imbe_BusUnlock: vex_printf("BusUnlock"); break; - default: vpanic("ppIRMBusEvent"); + case Imbe_Fence: vex_printf("Fence"); break; + case Imbe_BusLock: vex_printf("BusLock"); break; + case Imbe_BusUnlock: vex_printf("BusUnlock"); break; + case Imbe_SnoopedStoreBegin: vex_printf("SnoopedStoreBegin"); break; + case Imbe_SnoopedStoreEnd: vex_printf("SnoopedStoreEnd"); break; + default: vpanic("ppIRMBusEvent"); } } @@ -2534,6 +2536,7 @@ void tcStmt ( IRSB* bb, IRStmt* stmt, IRType gWordTy ) case Ist_MBE: switch (stmt->Ist.MBE.event) { case Imbe_Fence: case Imbe_BusLock: case Imbe_BusUnlock: + case Imbe_SnoopedStoreBegin: case Imbe_SnoopedStoreEnd: break; default: sanityCheckFail(bb,stmt,"IRStmt.MBE.event: unknown"); break; diff --git a/VEX/pub/libvex_ir.h b/VEX/pub/libvex_ir.h index 6a8dc76322..232f189c97 100644 --- a/VEX/pub/libvex_ir.h +++ b/VEX/pub/libvex_ir.h @@ -1336,7 +1336,9 @@ typedef enum { Imbe_Fence=0x18000, Imbe_BusLock, - Imbe_BusUnlock + Imbe_BusUnlock, + Imbe_SnoopedStoreBegin, + Imbe_SnoopedStoreEnd } IRMBusEvent;