115,118d114
< if (!(pkt->flags & SNOOP_COMMIT))
< return true;
<
<
249a246,247
> int pbs = peerBlockSize();
>
256,258d253
< pkt->flags &= ~SNOOP_COMMIT; //CLear it if it was set
<
< // Ugly! @todo When multilevel coherence works this will be removed
260,266c255,258
< pkt->result != Packet::Nacked) {
< PacketPtr funcPkt = new Packet(pkt->req, MemCmd::WriteReq,
< Packet::Broadcast);
< funcPkt->dataStatic(pkt->getPtr<uint8_t>());
< sendFunctional(funcPkt);
< pkt->cmd = MemCmd::WriteReq;
< delete funcPkt;
---
> pkt->result != Packet::Nacked && pkt->getOffset(pbs) &&
> pkt->getSize() != pbs) {
> buf->partialWriteFix(this);
> pkt = buf->pkt;
304a297
> buf->undoPartialWriteFix();
327a321,322
> int pbs = otherPort->peerBlockSize();
> Tick atomic_delay;
329,330c324,330
< // same... will be removed once our code gets this right
< if (pkt->cmd == MemCmd::WriteInvalidateReq && fixPartialWrite) {
---
> // same
> if (pkt->cmd == MemCmd::WriteInvalidateReq && fixPartialWrite &&
> pkt->getOffset(pbs) && pkt->getSize() != pbs) {
> PacketDataPtr data;
> data = new uint8_t[pbs];
> PacketPtr funcPkt = new Packet(pkt->req, MemCmd::ReadReq,
> Packet::Broadcast, pbs);
332,334c332
< PacketPtr funcPkt = new Packet(pkt->req, MemCmd::WriteReq,
< Packet::Broadcast);
< funcPkt->dataStatic(pkt->getPtr<uint8_t>());
---
> funcPkt->dataStatic(data);
335a334
> assert(funcPkt->result == Packet::Success);
337c336,344
< pkt->cmd = MemCmd::WriteReq;
---
> memcpy(data + pkt->getOffset(pbs), pkt->getPtr<uint8_t>(),
> pkt->getSize());
> PacketPtr newPkt = new Packet(pkt->req, MemCmd::WriteInvalidateReq,
> Packet::Broadcast, pbs);
> pkt->dataDynamicArray(data);
> atomic_delay = otherPort->sendAtomic(newPkt);
> delete newPkt;
> } else {
> atomic_delay = otherPort->sendAtomic(pkt);
339c346
< return delay + otherPort->sendAtomic(pkt);
---
> return atomic_delay + delay;
421d427
<