X86: Implement the media floating point max instructions.
[gem5.git] / src / arch / x86 / interrupts.hh
index c4312913376742979275036f08857671bb27a2ab..e1bd676dbfa705f2eb56bac5aa33a2e7aa183db0 100644 (file)
@@ -131,10 +131,14 @@ class Interrupts : public BasicPioDevice, IntDev
     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.
      */
@@ -168,25 +172,27 @@ 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.
@@ -207,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()