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:
parent
e89eaf8b80
commit
9a6e896d3b
2 changed files with 6 additions and 5 deletions
|
@ -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;
|
||||
|
|
|
@ -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++;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue