summaryrefslogtreecommitdiff
path: root/src/cpu
diff options
context:
space:
mode:
authorRon Dreslinski <rdreslin@umich.edu>2006-08-16 15:59:26 -0400
committerRon Dreslinski <rdreslin@umich.edu>2006-08-16 15:59:26 -0400
commit27d60c27fa4cdbe471463fbf8224950d36456592 (patch)
tree06ad37f0b10d2a29b27e0bea264a0a05e2be9cd5 /src/cpu
parentbb6af8eb8ad870138030c617f27a1f4193341e8e (diff)
parentec0a18ffb956bbcf54b8d4d94dac7255f8868a9e (diff)
downloadgem5-27d60c27fa4cdbe471463fbf8224950d36456592.tar.xz
Merge zizzer:/z/m5/Bitkeeper/newmem
into zizzer.eecs.umich.edu:/.automount/zazzer/z/rdreslin/m5bk/newmem --HG-- extra : convert_revision : 659f84c883b9992ae48f26c837983b9f8fcf18ab
Diffstat (limited to 'src/cpu')
-rw-r--r--src/cpu/o3/fetch_impl.hh2
-rw-r--r--src/cpu/o3/lsq_impl.hh5
-rw-r--r--src/cpu/o3/lsq_unit.hh2
-rw-r--r--src/cpu/o3/lsq_unit_impl.hh2
4 files changed, 10 insertions, 1 deletions
diff --git a/src/cpu/o3/fetch_impl.hh b/src/cpu/o3/fetch_impl.hh
index 990db88ac..25be9d455 100644
--- a/src/cpu/o3/fetch_impl.hh
+++ b/src/cpu/o3/fetch_impl.hh
@@ -672,9 +672,9 @@ DefaultFetch<Impl>::doSquash(const Addr &new_PC, unsigned tid)
assert(cacheBlocked);
cacheBlocked = false;
retryTid = -1;
- retryPkt = NULL;
delete retryPkt->req;
delete retryPkt;
+ retryPkt = NULL;
}
fetchStatus[tid] = Squashing;
diff --git a/src/cpu/o3/lsq_impl.hh b/src/cpu/o3/lsq_impl.hh
index db2c253e1..2bbab71f0 100644
--- a/src/cpu/o3/lsq_impl.hh
+++ b/src/cpu/o3/lsq_impl.hh
@@ -71,6 +71,11 @@ template <class Impl>
void
LSQ<Impl>::DcachePort::recvRetry()
{
+ if (lsq->retryTid == -1)
+ {
+ //Squashed, so drop it
+ return;
+ }
lsq->thread[lsq->retryTid].recvRetry();
// Speculatively clear the retry Tid. This will get set again if
// the LSQUnit was unable to complete its access.
diff --git a/src/cpu/o3/lsq_unit.hh b/src/cpu/o3/lsq_unit.hh
index 512b5a63c..1358a3699 100644
--- a/src/cpu/o3/lsq_unit.hh
+++ b/src/cpu/o3/lsq_unit.hh
@@ -646,6 +646,8 @@ LSQUnit<Impl>::read(Request *req, T &data, int load_idx)
// handle it.
if (lsq->cacheBlocked()) {
++lsqCacheBlocked;
+
+ iewStage->decrWb(load_inst->seqNum);
// There's an older load that's already going to squash.
if (isLoadBlocked && blockedLoadSeqNum < load_inst->seqNum)
return NoFault;
diff --git a/src/cpu/o3/lsq_unit_impl.hh b/src/cpu/o3/lsq_unit_impl.hh
index 4f5dbbf1c..fa716c712 100644
--- a/src/cpu/o3/lsq_unit_impl.hh
+++ b/src/cpu/o3/lsq_unit_impl.hh
@@ -626,6 +626,7 @@ LSQUnit<Impl>::writebackStores()
++lsqCacheBlocked;
assert(retryPkt == NULL);
retryPkt = data_pkt;
+ lsq->setRetryTid(lsqID);
} else {
storePostSend(data_pkt);
}
@@ -869,6 +870,7 @@ LSQUnit<Impl>::recvRetry()
storePostSend(retryPkt);
retryPkt = NULL;
isStoreBlocked = false;
+ lsq->setRetryTid(-1);
} else {
// Still blocked!
++lsqCacheBlocked;