summaryrefslogtreecommitdiff
path: root/src/arch/x86
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/x86')
-rw-r--r--src/arch/x86/interrupts.cc16
-rw-r--r--src/arch/x86/interrupts.hh7
2 files changed, 12 insertions, 11 deletions
diff --git a/src/arch/x86/interrupts.cc b/src/arch/x86/interrupts.cc
index 392135def..d4ee9f6a6 100644
--- a/src/arch/x86/interrupts.cc
+++ b/src/arch/x86/interrupts.cc
@@ -290,16 +290,15 @@ void
X86ISA::Interrupts::init()
{
//
- // The local apic must register its address ranges on both its pio
- // port via the basicpiodevice(piodevice) init() function and its
- // int port that it inherited from IntDevice. Note IntDevice is
- // not a SimObject itself.
- //
+ // The local apic must register its address ranges on its pio
+ // port via the basicpiodevice(piodevice) init() function.
PioDevice::init();
- IntDevice::init();
- // the slave port has a range so inform the connected master
+ // The slave port has a range, so inform the connected master.
intSlavePort.sendRangeChange();
+ // If the master port isn't connected, we can't send interrupts anywhere.
+ panic_if(!intMasterPort.isConnected(),
+ "Int port not connected to anything!");
}
@@ -597,7 +596,7 @@ X86ISA::Interrupts::setReg(ApicRegIndex reg, uint32_t val)
X86ISA::Interrupts::Interrupts(Params * p)
- : PioDevice(p), IntDevice(this, p->int_latency),
+ : PioDevice(p),
apicTimerEvent([this]{ processApicTimerEvent(); }, name()),
pendingSmi(false), smiVector(0),
pendingNmi(false), nmiVector(0),
@@ -607,6 +606,7 @@ X86ISA::Interrupts::Interrupts(Params * p)
startedUp(false), pendingUnmaskableInt(false),
pendingIPIs(0), cpu(NULL),
intSlavePort(name() + ".int_slave", this, this),
+ intMasterPort(name() + ".int_master", this, this, p->int_latency),
pioDelay(p->pio_latency)
{
memset(regs, 0, sizeof(regs));
diff --git a/src/arch/x86/interrupts.hh b/src/arch/x86/interrupts.hh
index e48fd4bb3..a6364c8b1 100644
--- a/src/arch/x86/interrupts.hh
+++ b/src/arch/x86/interrupts.hh
@@ -72,7 +72,7 @@ namespace X86ISA {
ApicRegIndex decodeAddr(Addr paddr);
-class Interrupts : public PioDevice, IntDevice
+class Interrupts : public PioDevice
{
protected:
// Storage for the APIC registers
@@ -171,8 +171,9 @@ class Interrupts : public PioDevice, IntDevice
int initialApicId;
- // Port for receiving interrupts
+ // Ports for interrupts.
IntSlavePort<Interrupts> intSlavePort;
+ IntMasterPort<Interrupts> intMasterPort;
Tick pioDelay;
Addr pioAddr = MaxAddr;
@@ -205,7 +206,7 @@ class Interrupts : public PioDevice, IntDevice
Tick read(PacketPtr pkt) override;
Tick write(PacketPtr pkt) override;
Tick recvMessage(PacketPtr pkt);
- bool recvResponse(PacketPtr pkt) override;
+ bool recvResponse(PacketPtr pkt);
bool
triggerTimerInterrupt()