diff options
author | Brad Beckmann <Brad.Beckmann@amd.com> | 2011-02-06 22:14:18 -0800 |
---|---|---|
committer | Brad Beckmann <Brad.Beckmann@amd.com> | 2011-02-06 22:14:18 -0800 |
commit | c41fc138e78420c72d8dada805a16c96f74f631b (patch) | |
tree | d66a767288ca51f19f143c891ce2b722101bca40 | |
parent | 3a2d2223e1debf932a0cec3244e4ce63e5d748af (diff) | |
download | gem5-c41fc138e78420c72d8dada805a16c96f74f631b.tar.xz |
dev: fixed bugs to extend interrupt capability beyond 15 cores
-rw-r--r-- | src/arch/x86/interrupts.cc | 7 | ||||
-rw-r--r-- | src/dev/x86/i82094aa.cc | 22 | ||||
-rw-r--r-- | src/dev/x86/i82094aa.hh | 2 | ||||
-rw-r--r-- | src/dev/x86/intdev.cc | 9 | ||||
-rw-r--r-- | src/dev/x86/intdev.hh | 10 |
5 files changed, 38 insertions, 12 deletions
diff --git a/src/arch/x86/interrupts.cc b/src/arch/x86/interrupts.cc index 9b2d42a16..837c802ec 100644 --- a/src/arch/x86/interrupts.cc +++ b/src/arch/x86/interrupts.cc @@ -294,7 +294,14 @@ X86ISA::Interrupts::setCPU(BaseCPU * newCPU) 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 IntDev. Note IntDev is not a SimObject itself. + // BasicPioDevice::init(); + IntDev::init(); + Pc * pc = dynamic_cast<Pc *>(platform); assert(pc); pc->southBridge->ioApic->registerLocalApic(initialApicId, this); diff --git a/src/dev/x86/i82094aa.cc b/src/dev/x86/i82094aa.cc index cb9b51d58..90c6a0900 100644 --- a/src/dev/x86/i82094aa.cc +++ b/src/dev/x86/i82094aa.cc @@ -41,9 +41,12 @@ X86ISA::I82094AA::I82094AA(Params *p) : PioDevice(p), latency(p->pio_latency), pioAddr(p->pio_addr), extIntPic(p->external_int_pic), lowestPriorityOffset(0) { - // This assumes there's only one I/O APIC in the system + // This assumes there's only one I/O APIC in the system and since the apic + // id is stored in a 8-bit field with 0xff meaning broadcast, the id must + // be less than 0xff + + assert(p->apic_id < 0xff); initialApicId = id = p->apic_id; - assert(id <= 0xf); arbId = id; regSel = 0; RedirTableEntry entry = 0; @@ -54,6 +57,17 @@ X86ISA::I82094AA::I82094AA(Params *p) : PioDevice(p), } } +void +X86ISA::I82094AA::init() +{ + // The io apic must register its address ranges on both its pio port + // via the piodevice init() function and its int port that it inherited + // from IntDev. Note IntDev is not a SimObject itself. + + PioDevice::init(); + IntDev::init(); +} + Tick X86ISA::I82094AA::read(PacketPtr pkt) { @@ -96,11 +110,11 @@ void X86ISA::I82094AA::writeReg(uint8_t offset, uint32_t value) { if (offset == 0x0) { - id = bits(value, 27, 24); + id = bits(value, 31, 24); } else if (offset == 0x1) { // The IOAPICVER register is read only. } else if (offset == 0x2) { - arbId = bits(value, 27, 24); + arbId = bits(value, 31, 24); } else if (offset >= 0x10 && offset <= (0x10 + TableSize * 2)) { int index = (offset - 0x10) / 2; if (offset % 2) { diff --git a/src/dev/x86/i82094aa.hh b/src/dev/x86/i82094aa.hh index 442163bbf..8be23d2c9 100644 --- a/src/dev/x86/i82094aa.hh +++ b/src/dev/x86/i82094aa.hh @@ -98,6 +98,8 @@ class I82094AA : public PioDevice, public IntDev I82094AA(Params *p); + void init(); + Tick read(PacketPtr pkt); Tick write(PacketPtr pkt); diff --git a/src/dev/x86/intdev.cc b/src/dev/x86/intdev.cc index 0d392d5ee..0c0fa73cf 100644 --- a/src/dev/x86/intdev.cc +++ b/src/dev/x86/intdev.cc @@ -48,6 +48,15 @@ X86ISA::IntDev::IntPort::sendMessage(ApicList apics, } } +void +X86ISA::IntDev::init() +{ + if (!intPort) { + panic("Int port not connected to anything!"); + } + intPort->sendStatusChange(Port::RangeChange); +} + X86ISA::IntSourcePin * X86IntSourcePinParams::create() { diff --git a/src/dev/x86/intdev.hh b/src/dev/x86/intdev.hh index 61e486718..b26b081bf 100644 --- a/src/dev/x86/intdev.hh +++ b/src/dev/x86/intdev.hh @@ -84,14 +84,6 @@ class IntDev // need to be moved into a subclass. void sendMessage(ApicList apics, TriggerIntMessage message, bool timing); - - void recvStatusChange(Status status) - { - if (status == RangeChange) { - sendStatusChange(Port::RangeChange); - } - } - }; IntPort * intPort; @@ -110,6 +102,8 @@ class IntDev virtual ~IntDev() {} + virtual void init(); + virtual void signalInterrupt(int line) { |