LSQ: Moved a couple of lines to enable O3 + Ruby
authorNilay Vaish <nilay@cs.wisc.edu>
Mon, 26 Sep 2011 17:18:32 +0000 (12:18 -0500)
committerNilay Vaish <nilay@cs.wisc.edu>
Mon, 26 Sep 2011 17:18:32 +0000 (12:18 -0500)
This patch makes O3 CPU work along with the Ruby memory model. Ruby
overwrites the senderState pointer with another pointer. The pointer
is restored only when Ruby gets done with the packet. LSQ makes use of
senderState just after sendTiming() returns. But the dynamic_cast returns
a NULL pointer since Ruby's senderState pointer is from a different class.
Storing the senderState pointer before calling sendTiming() does away with
the problem.

src/cpu/o3/lsq_unit_impl.hh

index 2a37d8b5c3a4a950b453f3acdff7965fd7fddcdc..77ce705bc6decd43ae744e11de0e217d39b1c8b2 100644 (file)
@@ -1191,10 +1191,10 @@ LSQUnit<Impl>::recvRetry()
         DPRINTF(LSQUnit, "Receiving retry: store blocked\n");
         assert(retryPkt != NULL);
 
-        if (dcachePort->sendTiming(retryPkt)) {
-            LSQSenderState *state =
-                dynamic_cast<LSQSenderState *>(retryPkt->senderState);
+        LSQSenderState *state =
+            dynamic_cast<LSQSenderState *>(retryPkt->senderState);
 
+        if (dcachePort->sendTiming(retryPkt)) {
             // Don't finish the store unless this is the last packet.
             if (!TheISA::HasUnalignedMemAcc || !state->pktToSend ||
                     state->pendingPacket == retryPkt) {