From: Gabe Black Date: Sun, 9 Oct 2011 11:44:02 +0000 (-0700) Subject: Interrupts: Make the IO APIC go get the local APICs. X-Git-Tag: stable_2012_06_28~327 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=48b40cff650cb071b189826af2f2e1f78434f49b;p=gem5.git 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. --- diff --git a/src/arch/x86/X86LocalApic.py b/src/arch/x86/X86LocalApic.py index cfb225240..2f53c4e24 100644 --- a/src/arch/x86/X86LocalApic.py +++ b/src/arch/x86/X86LocalApic.py @@ -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.") diff --git a/src/arch/x86/interrupts.cc b/src/arch/x86/interrupts.cc index 55b5bdca9..38b966dbe 100644 --- a/src/arch/x86/interrupts.cc +++ b/src/arch/x86/interrupts.cc @@ -304,11 +304,6 @@ X86ISA::Interrupts::init() // BasicPioDevice::init(); IntDev::init(); -#if FULL_SYSTEM - Pc * pc = dynamic_cast(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)); diff --git a/src/arch/x86/interrupts.hh b/src/arch/x86/interrupts.hh index 46e5e5cad..03b4c97b3 100644 --- a/src/arch/x86/interrupts.hh +++ b/src/arch/x86/interrupts.hh @@ -176,11 +176,10 @@ class Interrupts : public BasicPioDevice, IntDev int initialApicId; -#if FULL_SYSTEM - Platform *platform; -#endif - public: + + int getInitialApicId() { return initialApicId; } + /* * Params stuff. */ diff --git a/src/dev/x86/i82094aa.cc b/src/dev/x86/i82094aa.cc index be7852e86..b864bc5c7 100644 --- a/src/dev/x86/i82094aa.cc +++ b/src/dev/x86/i82094aa.cc @@ -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::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) { diff --git a/src/dev/x86/i82094aa.hh b/src/dev/x86/i82094aa.hh index ae0322d94..00ba2800d 100644 --- a/src/dev/x86/i82094aa.hh +++ b/src/dev/x86/i82094aa.hh @@ -70,8 +70,6 @@ class I82094AA : public PioDevice, public IntDev I8259 * extIntPic; - std::map 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);