X86: Implement the media floating point max instructions.
[gem5.git] / src / arch / x86 / interrupts.hh
index c5e3bde0d5b74e21835eceaabea94b4f11d5a858..e1bd676dbfa705f2eb56bac5aa33a2e7aa183db0 100644 (file)
@@ -129,10 +129,16 @@ class Interrupts : public BasicPioDevice, IntDev
     uint8_t extIntVector;
     bool pendingInit;
     uint8_t initVector;
+    bool pendingStartup;
+    uint8_t startupVector;
+    bool startedUp;
 
     // This is a quick check whether any of the above (except ExtInt) are set.
     bool pendingUnmaskableInt;
 
+    // A count of how many IPIs are in flight.
+    int pendingIPIs;
+
     /*
      * IRR and ISR maintenance.
      */
@@ -166,36 +172,34 @@ class Interrupts : public BasicPioDevice, IntDev
     void
     setRegArrayBit(ApicRegIndex base, uint8_t vector)
     {
-        regs[base + (vector % 32)] |= (1 << (vector >> 5));
+        regs[base + (vector / 32)] |= (1 << (vector % 32));
     }
 
     void
     clearRegArrayBit(ApicRegIndex base, uint8_t vector)
     {
-        regs[base + (vector % 32)] &= ~(1 << (vector >> 5));
+        regs[base + (vector / 32)] &= ~(1 << (vector % 32));
     }
 
     bool
     getRegArrayBit(ApicRegIndex base, uint8_t vector)
     {
-        return bits(regs[base + (vector % 32)], vector >> 5);
+        return bits(regs[base + (vector / 32)], vector % 5);
     }
 
     void requestInterrupt(uint8_t vector, uint8_t deliveryMode, bool level);
 
     BaseCPU *cpu;
 
+    int initialApicId;
+
   public:
     /*
      * Params stuff.
      */
     typedef X86LocalApicParams Params;
 
-    void
-    setCPU(BaseCPU * newCPU)
-    {
-        cpu = newCPU;
-    }
+    void setCPU(BaseCPU * newCPU);
 
     void
     setClock(Tick newClock)
@@ -209,12 +213,18 @@ class Interrupts : public BasicPioDevice, IntDev
         return dynamic_cast<const Params *>(_params);
     }
 
+    /*
+     * Initialize this object by registering it with the IO APIC.
+     */
+    void init();
+
     /*
      * Functions to interact with the interrupt port from IntDev.
      */
     Tick read(PacketPtr pkt);
     Tick write(PacketPtr pkt);
     Tick recvMessage(PacketPtr pkt);
+    Tick recvResponse(PacketPtr pkt);
 
     bool
     triggerTimerInterrupt()
@@ -225,19 +235,8 @@ class Interrupts : public BasicPioDevice, IntDev
         return entry.periodic;
     }
 
-    void addressRanges(AddrRangeList &range_list)
-    {
-        range_list.clear();
-        range_list.push_back(RangeEx(x86LocalAPICAddress(0, 0),
-                                     x86LocalAPICAddress(0, 0) + PageBytes));
-    }
-
-    void getIntAddrRange(AddrRangeList &range_list)
-    {
-        range_list.clear();
-        range_list.push_back(RangeEx(x86InterruptAddress(0, 0),
-                    x86InterruptAddress(0, 0) + PhysAddrAPICRangeSize));
-    }
+    void addressRanges(AddrRangeList &range_list);
+    void getIntAddrRange(AddrRangeList &range_list);
 
     Port *getPort(const std::string &if_name, int idx = -1)
     {
@@ -262,22 +261,7 @@ class Interrupts : public BasicPioDevice, IntDev
      * Constructor.
      */
 
-    Interrupts(Params * p)
-        : BasicPioDevice(p), IntDev(this), latency(p->pio_latency), clock(0),
-          apicTimerEvent(this),
-          pendingSmi(false), smiVector(0),
-          pendingNmi(false), nmiVector(0),
-          pendingExtInt(false), extIntVector(0),
-          pendingInit(false), initVector(0),
-          pendingUnmaskableInt(false)
-    {
-        pioSize = PageBytes;
-        memset(regs, 0, sizeof(regs));
-        //Set the local apic DFR to the flat model.
-        regs[APIC_DESTINATION_FORMAT] = (uint32_t)(-1);
-        ISRV = 0;
-        IRRV = 0;
-    }
+    Interrupts(Params * p);
 
     /*
      * Functions for retrieving interrupts for the CPU to handle.