summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2009-04-19 03:54:11 -0700
committerGabe Black <gblack@eecs.umich.edu>2009-04-19 03:54:11 -0700
commitbdda224d4110dd8ebb6224bfa9bc2641957a8c57 (patch)
tree50cc190f8f9de426b79d0bc4ae7c7a32ae96857f
parent3031af21c7b0d73508f3b339e8166e744857c18f (diff)
downloadgem5-bdda224d4110dd8ebb6224bfa9bc2641957a8c57.tar.xz
X86: Add a function which gets called when an interrupt message has been delivered.
-rw-r--r--src/arch/x86/interrupts.cc3
-rw-r--r--src/arch/x86/interrupts.hh1
-rw-r--r--src/dev/x86/intdev.cc5
-rw-r--r--src/dev/x86/intdev.hh13
-rw-r--r--src/mem/mport.cc5
5 files changed, 22 insertions, 5 deletions
diff --git a/src/arch/x86/interrupts.cc b/src/arch/x86/interrupts.cc
index a0ce30ad7..9ac4b20ba 100644
--- a/src/arch/x86/interrupts.cc
+++ b/src/arch/x86/interrupts.cc
@@ -327,8 +327,7 @@ X86ISA::Interrupts::recvMessage(PacketPtr pkt)
offset);
break;
}
- delete pkt->req;
- delete pkt;
+ pkt->makeAtomicResponse();
return latency;
}
diff --git a/src/arch/x86/interrupts.hh b/src/arch/x86/interrupts.hh
index c43129133..ba92c77d6 100644
--- a/src/arch/x86/interrupts.hh
+++ b/src/arch/x86/interrupts.hh
@@ -213,6 +213,7 @@ class Interrupts : public BasicPioDevice, IntDev
Tick read(PacketPtr pkt);
Tick write(PacketPtr pkt);
Tick recvMessage(PacketPtr pkt);
+ Tick recvResponse(PacketPtr pkt);
bool
triggerTimerInterrupt()
diff --git a/src/dev/x86/intdev.cc b/src/dev/x86/intdev.cc
index 3b29eb7bf..10e50c13e 100644
--- a/src/dev/x86/intdev.cc
+++ b/src/dev/x86/intdev.cc
@@ -45,10 +45,11 @@ X86ISA::IntDev::IntPort::sendMessage(TriggerIntMessage message, bool timing)
DPRINTF(IntDev,
"Sending interrupt to APIC ID %d.\n", message.destination);
PacketPtr pkt = buildIntRequest(message.destination, message);
- if (timing)
+ if (timing) {
sendMessageTiming(pkt, latency);
- else
+ } else {
sendMessageAtomic(pkt);
+ }
} else {
DPRINTF(IntDev, "Sending interrupts to APIC IDs:"
"%s%s%s%s%s%s%s%s\n",
diff --git a/src/dev/x86/intdev.hh b/src/dev/x86/intdev.hh
index e95c72058..3a99783f7 100644
--- a/src/dev/x86/intdev.hh
+++ b/src/dev/x86/intdev.hh
@@ -71,6 +71,11 @@ class IntDev
return device->recvMessage(pkt);
}
+ Tick recvResponse(PacketPtr pkt)
+ {
+ return device->recvResponse(pkt);
+ }
+
// This is x86 focused, so if this class becomes generic, this would
// need to be moved into a subclass.
void sendMessage(TriggerIntMessage message, bool timing);
@@ -125,6 +130,14 @@ class IntDev
return 0;
}
+ virtual Tick
+ recvResponse(PacketPtr pkt)
+ {
+ delete pkt->req;
+ delete pkt;
+ return 0;
+ }
+
virtual void
getIntAddrRange(AddrRangeList &range_list)
{
diff --git a/src/mem/mport.cc b/src/mem/mport.cc
index 72bcfc7fd..564c560c6 100644
--- a/src/mem/mport.cc
+++ b/src/mem/mport.cc
@@ -56,5 +56,8 @@ MessagePort::sendMessageTiming(PacketPtr pkt, Tick latency)
Tick
MessagePort::sendMessageAtomic(PacketPtr pkt)
{
- return sendAtomic(pkt);
+ Tick latency = sendAtomic(pkt);
+ assert(pkt->isResponse());
+ latency += recvResponse(pkt);
+ return latency;
}