diff options
author | Ron Dreslinski <rdreslin@umich.edu> | 2006-11-10 22:41:21 -0500 |
---|---|---|
committer | Ron Dreslinski <rdreslin@umich.edu> | 2006-11-10 22:41:21 -0500 |
commit | 9a6e896d3bc904745f090aad1a6d40f04f5ac2ef (patch) | |
tree | 81602b0c631c9a5f2aae5ff1323f8e7f74694d0f /src/mem | |
parent | e89eaf8b801b39713b28f2df7e89ea8a518974ec (diff) | |
download | gem5-9a6e896d3bc904745f090aad1a6d40f04f5ac2ef.tar.xz |
Big fix for functional access, where we forgot to copy the last byte on write intersections.
src/mem/packet.cc:
Make sure to copy the whole data (we were one byte short)
src/mem/tport.cc:
Fix for the proper semantics of fixPacket
--HG--
extra : convert_revision : 215e05db9099d427afd4994f5b29079354c847d8
Diffstat (limited to 'src/mem')
-rw-r--r-- | src/mem/packet.cc | 5 | ||||
-rw-r--r-- | src/mem/tport.cc | 6 |
2 files changed, 6 insertions, 5 deletions
diff --git a/src/mem/packet.cc b/src/mem/packet.cc index a342af634..938116ab5 100644 --- a/src/mem/packet.cc +++ b/src/mem/packet.cc @@ -168,6 +168,7 @@ fixPacket(PacketPtr func, PacketPtr timing) memcpy(func->getPtr<uint8_t>(), timing->getPtr<uint8_t>() + funcStart - timingStart, func->getSize()); func->result = Packet::Success; + func->flags |= SATISFIED; return false; } else { // In this case the timing packet only partially satisfies the @@ -182,11 +183,11 @@ fixPacket(PacketPtr func, PacketPtr timing) if (funcStart >= timingStart) { memcpy(timing->getPtr<uint8_t>() + (funcStart - timingStart), func->getPtr<uint8_t>(), - std::min(funcEnd, timingEnd) - funcStart); + (std::min(funcEnd, timingEnd) - funcStart) + 1); } else { // timingStart > funcStart memcpy(timing->getPtr<uint8_t>(), func->getPtr<uint8_t>() + (timingStart - funcStart), - std::min(funcEnd, timingEnd) - timingStart); + (std::min(funcEnd, timingEnd) - timingStart) + 1); } // we always want to keep going with a write return true; diff --git a/src/mem/tport.cc b/src/mem/tport.cc index 086d91279..a85ae2b14 100644 --- a/src/mem/tport.cc +++ b/src/mem/tport.cc @@ -35,14 +35,14 @@ SimpleTimingPort::recvFunctional(PacketPtr pkt) { std::list<std::pair<Tick,PacketPtr> >::iterator i = transmitList.begin(); std::list<std::pair<Tick,PacketPtr> >::iterator end = transmitList.end(); - bool done = false; + bool notDone = true; - while (i != end && !done) { + while (i != end && notDone) { PacketPtr target = i->second; // If the target contains data, and it overlaps the // probed request, need to update data if (target->intersect(pkt)) - done = fixPacket(pkt, target); + notDone = fixPacket(pkt, target); i++; } |