Fix functional access errors related to delayed respnoses in cachePort

src/mem/cache/base_cache.cc:
    On a delayed response, be sure to call the fixPacket wrapper to toggle hasData flag.
src/mem/packet.cc:
src/mem/packet.hh:
    Create a wrapper to toggle the hasData flag on delayed responses

--HG--
extra : convert_revision : 1ced8d4e3dc12a059fb7636d59e429cd3dd46901
This commit is contained in:
Ron Dreslinski 2006-11-12 06:35:39 -05:00
parent f876bc2bf0
commit c577665040
3 changed files with 39 additions and 4 deletions

View file

@ -114,6 +114,8 @@ BaseCache::CachePort::checkFunctional(PacketPtr pkt)
// If the target contains data, and it overlaps the // If the target contains data, and it overlaps the
// probed request, need to update data // probed request, need to update data
if (target->intersect(pkt)) { if (target->intersect(pkt)) {
DPRINTF(Cache, "Functional %s access to blk_addr %x intersects a drain\n",
pkt->cmdString(), pkt->getAddr() & ~(cache->getBlockSize() - 1));
notDone = fixPacket(pkt, target); notDone = fixPacket(pkt, target);
} }
i++; i++;
@ -126,8 +128,11 @@ BaseCache::CachePort::checkFunctional(PacketPtr pkt)
PacketPtr target = j->second; PacketPtr target = j->second;
// If the target contains data, and it overlaps the // If the target contains data, and it overlaps the
// probed request, need to update data // probed request, need to update data
if (target->intersect(pkt)) if (target->intersect(pkt)) {
notDone = fixPacket(pkt, target); DPRINTF(Cache, "Functional %s access to blk_addr %x intersects a response\n",
pkt->cmdString(), pkt->getAddr() & ~(cache->getBlockSize() - 1));
notDone = fixDelayedResponsePacket(pkt, target);
}
j++; j++;
} }
return notDone; return notDone;
@ -348,7 +353,7 @@ BaseCache::CacheEvent::process()
} }
return; return;
} }
//Else it's a response Response //Else it's a response
assert(cachePort->transmitList.size()); assert(cachePort->transmitList.size());
assert(cachePort->transmitList.front().first <= curTick); assert(cachePort->transmitList.front().first <= curTick);
pkt = cachePort->transmitList.front().second; pkt = cachePort->transmitList.front().second;

View file

@ -143,6 +143,24 @@ Packet::intersect(PacketPtr p)
return !(s1 > e2 || e1 < s2); return !(s1 > e2 || e1 < s2);
} }
bool
fixDelayedResponsePacket(PacketPtr func, PacketPtr timing)
{
bool result;
if (timing->isRead() || timing->isWrite()) {
timing->toggleData();
result = fixPacket(func, timing);
timing->toggleData();
}
else {
//Don't toggle if it isn't a read/write response
result = fixPacket(func, timing);
}
return result;
}
bool bool
fixPacket(PacketPtr func, PacketPtr timing) fixPacket(PacketPtr func, PacketPtr timing)
{ {

View file

@ -344,6 +344,13 @@ class Packet
srcValid = false; srcValid = false;
} }
void toggleData() {
int icmd = (int)cmd;
icmd ^= HasData;
cmd = (Command)icmd;
}
/** /**
* Take a request packet and modify it in place to be suitable for * Take a request packet and modify it in place to be suitable for
* returning as a response to that request. * returning as a response to that request.
@ -448,7 +455,6 @@ class Packet
bool intersect(PacketPtr p); bool intersect(PacketPtr p);
}; };
/** This function given a functional packet and a timing packet either satisfies /** This function given a functional packet and a timing packet either satisfies
* the timing packet, or updates the timing packet to reflect the updated state * the timing packet, or updates the timing packet to reflect the updated state
* in the timing packet. It returns if the functional packet should continue to * in the timing packet. It returns if the functional packet should continue to
@ -456,6 +462,12 @@ class Packet
*/ */
bool fixPacket(PacketPtr func, PacketPtr timing); bool fixPacket(PacketPtr func, PacketPtr timing);
/** This function is a wrapper for the fixPacket field that toggles the hasData bit
* it is used when a response is waiting in the caches, but hasn't been marked as a
* response yet (so the fixPacket needs to get the correct value for the hasData)
*/
bool fixDelayedResponsePacket(PacketPtr func, PacketPtr timing);
std::ostream & operator<<(std::ostream &o, const Packet &p); std::ostream & operator<<(std::ostream &o, const Packet &p);
#endif //__MEM_PACKET_HH #endif //__MEM_PACKET_HH