summaryrefslogtreecommitdiff
path: root/src/dev
diff options
context:
space:
mode:
Diffstat (limited to 'src/dev')
-rw-r--r--src/dev/x86/i82094aa.cc8
-rw-r--r--src/dev/x86/intdev.hh20
2 files changed, 15 insertions, 13 deletions
diff --git a/src/dev/x86/i82094aa.cc b/src/dev/x86/i82094aa.cc
index 17ac65f96..d6742a780 100644
--- a/src/dev/x86/i82094aa.cc
+++ b/src/dev/x86/i82094aa.cc
@@ -89,14 +89,6 @@ X86ISA::I82094AA::getPort(const std::string &if_name, PortID idx)
return BasicPioDevice::getPort(if_name, idx);
}
-bool
-X86ISA::I82094AA::recvResponse(PacketPtr pkt)
-{
- // Packet instantiated calling sendMessage() in signalInterrupt()
- delete pkt;
- return true;
-}
-
Tick
X86ISA::I82094AA::read(PacketPtr pkt)
{
diff --git a/src/dev/x86/intdev.hh b/src/dev/x86/intdev.hh
index 48d32d771..7ba3e68e9 100644
--- a/src/dev/x86/intdev.hh
+++ b/src/dev/x86/intdev.hh
@@ -44,6 +44,7 @@
#define __DEV_X86_INTDEV_HH__
#include <cassert>
+#include <functional>
#include <string>
#include "mem/tport.hh"
@@ -96,12 +97,18 @@ buildIntPacket(Addr addr, T payload)
template <class Device>
class IntMasterPort : public QueuedMasterPort
{
+ private:
ReqPacketQueue reqQueue;
SnoopRespPacketQueue snoopRespQueue;
Device* device;
Tick latency;
+ typedef std::function<void(PacketPtr)> OnCompletionFunc;
+ OnCompletionFunc onCompletion = nullptr;
+ // If nothing extra needs to happen, just clean up the packet.
+ static void defaultOnCompletion(PacketPtr pkt) { delete pkt; }
+
public:
IntMasterPort(const std::string& _name, SimObject* _parent,
Device* dev, Tick _latency) :
@@ -114,21 +121,24 @@ class IntMasterPort : public QueuedMasterPort
bool
recvTimingResp(PacketPtr pkt) override
{
- return device->recvResponse(pkt);
+ assert(pkt->isResponse());
+ onCompletion(pkt);
+ onCompletion = nullptr;
+ return true;
}
void
- sendMessage(PacketPtr pkt, bool timing)
+ sendMessage(PacketPtr pkt, bool timing,
+ OnCompletionFunc func=defaultOnCompletion)
{
if (timing) {
+ onCompletion = func;
schedTimingReq(pkt, curTick() + latency);
// The target handles cleaning up the packet in timing mode.
} else {
// ignore the latency involved in the atomic transaction
sendAtomic(pkt);
- assert(pkt->isResponse());
- // also ignore the latency in handling the response
- device->recvResponse(pkt);
+ func(pkt);
}
}
};