dev: fixed bugs to extend interrupt capability beyond 15 cores
authorBrad Beckmann <Brad.Beckmann@amd.com>
Mon, 7 Feb 2011 06:14:18 +0000 (22:14 -0800)
committerBrad Beckmann <Brad.Beckmann@amd.com>
Mon, 7 Feb 2011 06:14:18 +0000 (22:14 -0800)
src/arch/x86/interrupts.cc
src/dev/x86/i82094aa.cc
src/dev/x86/i82094aa.hh
src/dev/x86/intdev.cc
src/dev/x86/intdev.hh

index 9b2d42a16297688fda1c7ec5d01e38df506f1c6e..837c802ecd8b1441bd3439bbcbd08cef967fda58 100644 (file)
@@ -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);
index cb9b51d58f15dd88085b7ce3ca79fe4f356b34db..90c6a0900056e7d26d8bc9e96b9590016954b000 100644 (file)
@@ -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) {
index 442163bbf3c2af26a71db0ababdc33ee163d95ef..8be23d2c964a7cafae467e4b391a5773e1684faa 100644 (file)
@@ -98,6 +98,8 @@ class I82094AA : public PioDevice, public IntDev
 
     I82094AA(Params *p);
 
+    void init();
+
     Tick read(PacketPtr pkt);
     Tick write(PacketPtr pkt);
 
index 0d392d5ee03456a33be7b7558f728d88ed97b86c..0c0fa73cf074894c1f61683d819a5b75e1dace37 100644 (file)
@@ -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()
 {
index 61e486718a4bdaeceeace0b96fdb91bf313939f5..b26b081bffc08863d57c419b69b05c0da22cf400 100644 (file)
@@ -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)
     {