Interrupts: Make the IO APIC go get the local APICs.
This is so they don't have to declare themselves to the IO APIC and don't have to have a pointer to the platform object.
This commit is contained in:
@@ -38,6 +38,3 @@ class X86LocalApic(BasicPioDevice):
|
||||
int_port = Port("Port for sending and receiving interrupt messages")
|
||||
int_latency = Param.Latency('1ns', \
|
||||
"Latency for an interrupt to propagate through this device.")
|
||||
if buildEnv['FULL_SYSTEM']: # No platform in SE mode.
|
||||
platform = Param.Platform(Parent.any,
|
||||
"Platform this device is part of.")
|
||||
|
||||
@@ -304,11 +304,6 @@ X86ISA::Interrupts::init()
|
||||
//
|
||||
BasicPioDevice::init();
|
||||
IntDev::init();
|
||||
#if FULL_SYSTEM
|
||||
Pc * pc = dynamic_cast<Pc *>(platform);
|
||||
assert(pc);
|
||||
pc->southBridge->ioApic->registerLocalApic(initialApicId, this);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -616,9 +611,6 @@ X86ISA::Interrupts::Interrupts(Params * p) :
|
||||
pendingStartup(false), startupVector(0),
|
||||
startedUp(false), pendingUnmaskableInt(false),
|
||||
pendingIPIs(0), cpu(NULL)
|
||||
#if FULL_SYSTEM
|
||||
, platform(p->platform)
|
||||
#endif
|
||||
{
|
||||
pioSize = PageBytes;
|
||||
memset(regs, 0, sizeof(regs));
|
||||
|
||||
@@ -176,11 +176,10 @@ class Interrupts : public BasicPioDevice, IntDev
|
||||
|
||||
int initialApicId;
|
||||
|
||||
#if FULL_SYSTEM
|
||||
Platform *platform;
|
||||
#endif
|
||||
|
||||
public:
|
||||
|
||||
int getInitialApicId() { return initialApicId; }
|
||||
|
||||
/*
|
||||
* Params stuff.
|
||||
*/
|
||||
|
||||
@@ -30,11 +30,9 @@
|
||||
|
||||
#include "config/full_system.hh"
|
||||
|
||||
#if FULL_SYSTEM
|
||||
#include "arch/x86/interrupts.hh"
|
||||
#endif
|
||||
|
||||
#include "arch/x86/intmessage.hh"
|
||||
#include "cpu/base.hh"
|
||||
#include "debug/I82094AA.hh"
|
||||
#include "dev/x86/i82094aa.hh"
|
||||
#include "dev/x86/i8259.hh"
|
||||
@@ -172,7 +170,6 @@ X86ISA::I82094AA::signalInterrupt(int line)
|
||||
DPRINTF(I82094AA, "Entry was masked.\n");
|
||||
return;
|
||||
} else {
|
||||
#if FULL_SYSTEM //XXX No interrupt controller in SE mode.
|
||||
TriggerIntMessage message = 0;
|
||||
message.destination = entry.dest;
|
||||
if (entry.deliveryMode == DeliveryMode::ExtInt) {
|
||||
@@ -202,13 +199,11 @@ X86ISA::I82094AA::signalInterrupt(int line)
|
||||
}
|
||||
} else {
|
||||
for (int i = 0; i < numContexts; i++) {
|
||||
std::map<int, Interrupts *>::iterator localApicIt =
|
||||
localApics.find(i);
|
||||
assert(localApicIt != localApics.end());
|
||||
Interrupts *localApic = localApicIt->second;
|
||||
Interrupts *localApic = sys->getThreadContext(i)->
|
||||
getCpuPtr()->getInterruptController();
|
||||
if ((localApic->readReg(APIC_LOGICAL_DESTINATION) >> 24) &
|
||||
message.destination) {
|
||||
apics.push_back(localApicIt->first);
|
||||
apics.push_back(localApic->getInitialApicId());
|
||||
}
|
||||
}
|
||||
if (message.deliveryMode == DeliveryMode::LowestPriority &&
|
||||
@@ -231,7 +226,6 @@ X86ISA::I82094AA::signalInterrupt(int line)
|
||||
}
|
||||
intPort->sendMessage(apics, message,
|
||||
sys->getMemoryMode() == Enums::timing);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -251,13 +245,6 @@ X86ISA::I82094AA::lowerInterruptPin(int number)
|
||||
pinStates[number] = false;
|
||||
}
|
||||
|
||||
void
|
||||
X86ISA::I82094AA::registerLocalApic(int initialId, Interrupts *localApic)
|
||||
{
|
||||
assert(localApic);
|
||||
localApics[initialId] = localApic;
|
||||
}
|
||||
|
||||
void
|
||||
X86ISA::I82094AA::serialize(std::ostream &os)
|
||||
{
|
||||
|
||||
@@ -70,8 +70,6 @@ class I82094AA : public PioDevice, public IntDev
|
||||
|
||||
I8259 * extIntPic;
|
||||
|
||||
std::map<int, Interrupts *> localApics;
|
||||
|
||||
uint8_t regSel;
|
||||
uint8_t initialApicId;
|
||||
uint8_t id;
|
||||
@@ -131,7 +129,6 @@ class I82094AA : public PioDevice, public IntDev
|
||||
void signalInterrupt(int line);
|
||||
void raiseInterruptPin(int number);
|
||||
void lowerInterruptPin(int number);
|
||||
void registerLocalApic(int id, Interrupts *localApic);
|
||||
|
||||
virtual void serialize(std::ostream &os);
|
||||
virtual void unserialize(Checkpoint *cp, const std::string §ion);
|
||||
|
||||
Reference in New Issue
Block a user