diff options
author | Steve Reinhardt <stever@eecs.umich.edu> | 2007-07-27 12:46:45 -0700 |
---|---|---|
committer | Steve Reinhardt <stever@eecs.umich.edu> | 2007-07-27 12:46:45 -0700 |
commit | 0cbcb715e0f6f2f7b1338d37e641ef931247748f (patch) | |
tree | 6f393be8f1ea0e94f051063a1800161ba61de445 /src/mem/cache/miss | |
parent | 01c9d34a0b4bcef3d8cca12eaeb7753e376378a8 (diff) | |
download | gem5-0cbcb715e0f6f2f7b1338d37e641ef931247748f.tar.xz |
cache/memtest: fixes for functional accesses.
--HG--
extra : convert_revision : 688ba4d882cad2c96cf44c9e46999f74266e02ee
Diffstat (limited to 'src/mem/cache/miss')
-rw-r--r-- | src/mem/cache/miss/mshr.cc | 14 | ||||
-rw-r--r-- | src/mem/cache/miss/mshr.hh | 6 | ||||
-rw-r--r-- | src/mem/cache/miss/mshr_queue.cc | 15 | ||||
-rw-r--r-- | src/mem/cache/miss/mshr_queue.hh | 2 |
4 files changed, 37 insertions, 0 deletions
diff --git a/src/mem/cache/miss/mshr.cc b/src/mem/cache/miss/mshr.cc index 5ba3d1ec5..7796773a3 100644 --- a/src/mem/cache/miss/mshr.cc +++ b/src/mem/cache/miss/mshr.cc @@ -118,6 +118,20 @@ MSHR::TargetList::clearDownstreamPending() } +bool +MSHR::TargetList::checkFunctional(PacketPtr pkt) +{ + Iterator end_i = end(); + for (Iterator i = begin(); i != end_i; ++i) { + if (pkt->checkFunctional(i->pkt)) { + return true; + } + } + + return false; +} + + void MSHR::allocate(Addr _addr, int _size, PacketPtr target, Tick whenReady, Counter _order) diff --git a/src/mem/cache/miss/mshr.hh b/src/mem/cache/miss/mshr.hh index e850a8633..c865ca3ac 100644 --- a/src/mem/cache/miss/mshr.hh +++ b/src/mem/cache/miss/mshr.hh @@ -82,6 +82,7 @@ class MSHR : public Packet::SenderState void add(PacketPtr pkt, Tick readyTime, Counter order, bool cpuSide); void replaceUpgrades(); void clearDownstreamPending(); + bool checkFunctional(PacketPtr pkt); }; /** A list of MSHRs. */ @@ -230,6 +231,11 @@ public: void handleFill(Packet *pkt, CacheBlk *blk); + bool checkFunctional(PacketPtr pkt) { + return (targets->checkFunctional(pkt) || + deferredTargets->checkFunctional(pkt)); + } + /** * Prints the contents of this MSHR to stderr. */ diff --git a/src/mem/cache/miss/mshr_queue.cc b/src/mem/cache/miss/mshr_queue.cc index 50a28fb3c..911329e0c 100644 --- a/src/mem/cache/miss/mshr_queue.cc +++ b/src/mem/cache/miss/mshr_queue.cc @@ -84,9 +84,24 @@ MSHRQueue::findMatches(Addr addr, vector<MSHR*>& matches) const } } return retval; +} + +bool +MSHRQueue::checkFunctional(PacketPtr pkt, Addr blk_addr) +{ + MSHR::ConstIterator i = allocatedList.begin(); + MSHR::ConstIterator end = allocatedList.end(); + for (; i != end; ++i) { + MSHR *mshr = *i; + if (mshr->addr == blk_addr && mshr->checkFunctional(pkt)) { + return true; + } + } + return false; } + MSHR * MSHRQueue::findPending(Addr addr, int size) const { diff --git a/src/mem/cache/miss/mshr_queue.hh b/src/mem/cache/miss/mshr_queue.hh index 1f1d59e98..447ebfc5a 100644 --- a/src/mem/cache/miss/mshr_queue.hh +++ b/src/mem/cache/miss/mshr_queue.hh @@ -115,6 +115,8 @@ class MSHRQueue */ MSHR *findPending(Addr addr, int size) const; + bool checkFunctional(PacketPtr pkt, Addr blk_addr); + /** * Allocates a new MSHR for the request and size. This places the request * as the first target in the MSHR. |