if (probe) {
cachePort.sendFunctional(pkt);
- pkt->makeAtomicResponse();
completeRequest(pkt);
} else {
sendPkt(pkt);
if (probe) {
cachePort.sendFunctional(pkt);
- pkt->makeAtomicResponse();
completeRequest(pkt);
} else {
sendPkt(pkt);
return;
}
- // Need to check for outstanding misses and writes
-
- // There can only be one matching outstanding miss.
- MSHR *mshr = mshrQueue.findMatch(blk_addr);
- if (mshr) {
- MSHR::TargetList *targets = mshr->getTargetList();
- MSHR::TargetList::iterator i = targets->begin();
- MSHR::TargetList::iterator end = targets->end();
- for (; i != end; ++i) {
- PacketPtr targetPkt = i->pkt;
- if (pkt->checkFunctional(targetPkt))
- return;
- }
+ // Need to check for outstanding misses and writes; if neither one
+ // satisfies, then forward to other side of cache.
+ if (!(mshrQueue.checkFunctional(pkt, blk_addr) ||
+ writeBuffer.checkFunctional(pkt, blk_addr))) {
+ otherSidePort->checkAndSendFunctional(pkt);
}
-
- // There can be many matching outstanding writes.
- std::vector<MSHR*> writes;
- assert(!writeBuffer.findMatches(blk_addr, writes));
-/* Need to change this to iterate through targets in mshr??
- for (int i = 0; i < writes.size(); ++i) {
- MSHR *mshr = writes[i];
- if (pkt->checkFunctional(mshr->addr, mshr->size, mshr->writeData))
- return;
- }
-*/
-
- otherSidePort->checkAndSendFunctional(pkt);
}
}
+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)
void add(PacketPtr pkt, Tick readyTime, Counter order, bool cpuSide);
void replaceUpgrades();
void clearDownstreamPending();
+ bool checkFunctional(PacketPtr pkt);
};
/** A list of MSHRs. */
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.
*/
}
}
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
{
*/
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.