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
This commit is contained in:
Ron Dreslinski 2006-11-10 22:41:21 -05:00
parent e89eaf8b80
commit 9a6e896d3b
2 changed files with 6 additions and 5 deletions

View file

@ -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;

View file

@ -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++;
}