diff options
author | Joel Hestness <hestness@cs.utexas.edu> | 2011-02-06 22:14:17 -0800 |
---|---|---|
committer | Joel Hestness <hestness@cs.utexas.edu> | 2011-02-06 22:14:17 -0800 |
commit | d9f0a8288e0522369928fec76a7d8b70e2b719eb (patch) | |
tree | 42da337edb675b3ae51f0af40bc621f198798e72 /src/dev/x86/intdev.cc | |
parent | 02b05bf9be2fa4cf5aae2a3a989ac27d675b0a50 (diff) | |
download | gem5-d9f0a8288e0522369928fec76a7d8b70e2b719eb.tar.xz |
MessagePort: implement the virtual recvTiming function to avoid double pkt delete
Double packet delete problem is due to an interrupt device deleting a packet that the SimpleTimingPort also deletes. Since MessagePort descends from SimpleTimingPort, simply reimplement the failing code from SimpleTimingPort: recvTiming.
Diffstat (limited to 'src/dev/x86/intdev.cc')
-rw-r--r-- | src/dev/x86/intdev.cc | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/dev/x86/intdev.cc b/src/dev/x86/intdev.cc index 5bc6065f5..0d392d5ee 100644 --- a/src/dev/x86/intdev.cc +++ b/src/dev/x86/intdev.cc @@ -37,10 +37,14 @@ X86ISA::IntDev::IntPort::sendMessage(ApicList apics, ApicList::iterator apicIt; for (apicIt = apics.begin(); apicIt != apics.end(); apicIt++) { PacketPtr pkt = buildIntRequest(*apicIt, message); - if (timing) + if (timing) { sendMessageTiming(pkt, latency); - else + // The target handles cleaning up the packet in timing mode. + } else { sendMessageAtomic(pkt); + delete pkt->req; + delete pkt; + } } } |