diff -r 286b7d078c65 -r 94a455f9fddd src/arch/x86/interrupts.cc --- a/src/arch/x86/interrupts.cc Thu Jan 06 15:24:35 2011 -0800 +++ b/src/arch/x86/interrupts.cc Thu Jan 06 15:25:01 2011 -0800 @@ -340,8 +340,6 @@ low.deliveryStatus = 0; regs[APIC_INTERRUPT_COMMAND_LOW] = low; } - delete pkt->req; - delete pkt; DPRINTF(LocalApic, "ICR is now idle.\n"); return 0; } diff -r 286b7d078c65 -r 94a455f9fddd src/dev/x86/intdev.hh --- a/src/dev/x86/intdev.hh Thu Jan 06 15:24:35 2011 -0800 +++ b/src/dev/x86/intdev.hh Thu Jan 06 15:25:01 2011 -0800 @@ -138,8 +138,6 @@ virtual Tick recvResponse(PacketPtr pkt) { - delete pkt->req; - delete pkt; return 0; } diff -r 286b7d078c65 -r 94a455f9fddd src/mem/mport.hh --- a/src/mem/mport.hh Thu Jan 06 15:24:35 2011 -0800 +++ b/src/mem/mport.hh Thu Jan 06 15:25:01 2011 -0800 @@ -58,6 +58,7 @@ } Tick recvAtomic(PacketPtr pkt); + bool recvTiming(PacketPtr pkt); virtual Tick recvMessage(PacketPtr pkt) = 0; diff -r 286b7d078c65 -r 94a455f9fddd src/mem/mport.cc --- a/src/mem/mport.cc Thu Jan 06 15:24:35 2011 -0800 +++ b/src/mem/mport.cc Thu Jan 06 15:25:01 2011 -0800 @@ -37,7 +37,12 @@ // We received a message. return recvMessage(pkt); } else if (pkt->cmd == MemCmd::MessageResp) { - return recvResponse(pkt); + // The port should be responsible for deleting the + // packet after it is received by the device + Tick latency = recvResponse(pkt); + delete pkt->req; + delete pkt; + return latency; } else if (pkt->wasNacked()) { return recvNack(pkt); } else if (pkt->isError()) { @@ -47,6 +52,29 @@ } } +bool +MessagePort::recvTiming(PacketPtr pkt) +{ + if (pkt->memInhibitAsserted()) { + // snooper will supply based on copy of packet + // still target's responsibility to delete packet + delete pkt; + return true; + } + + bool needsResponse = pkt->needsResponse(); + Tick latency = recvAtomic(pkt); + // turn packet around to go back to requester if response expected + if (needsResponse) { + // recvAtomic() should already have turned packet into + // atomic response + assert(pkt->isResponse()); + schedSendTiming(pkt, curTick + latency); + } + + return true; +} + void MessagePort::sendMessageTiming(PacketPtr pkt, Tick latency) { diff -r 286b7d078c65 -r 94a455f9fddd src/mem/tport.hh --- a/src/mem/tport.hh Thu Jan 06 15:24:35 2011 -0800 +++ b/src/mem/tport.hh Thu Jan 06 15:25:01 2011 -0800 @@ -142,7 +142,7 @@ void recvFunctional(PacketPtr pkt); /** Implemented using recvAtomic(). */ - bool recvTiming(PacketPtr pkt); + virtual bool recvTiming(PacketPtr pkt); /** * Simple ports generally don't care about any status