base: add the FmtStackTrace debug option
[gem5.git] / src / dev / x86 / i8259.hh
index dfb56646a9b41283ff1e1624fc4e127bc348f48a..f9f0afff82d632d6cca7a5cc049059a38a41f47f 100644 (file)
 #ifndef __DEV_X86_I8259_HH__
 #define __DEV_X86_I8259_HH__
 
+#include "dev/intpin.hh"
 #include "dev/io_device.hh"
-#include "dev/x86/intdev.hh"
-#include "params/I8259.hh"
 #include "enums/X86I8259CascadeMode.hh"
+#include "params/I8259.hh"
 
 namespace X86ISA
 {
 
-class I82094AA;
-
-class I8259 : public BasicPioDevice, public IntDev
+class I8259 : public BasicPioDevice
 {
   protected:
     static const int NumLines = 8;
     bool pinStates[NumLines];
 
+    void init() override;
+
     Tick latency;
-    IntSourcePin *output;
+    std::vector<IntSourcePin<I8259> *> output;
+    std::vector<IntSinkPin<I8259> *> inputs;
     Enums::X86I8259CascadeMode mode;
     I8259 * slave;
 
@@ -91,15 +92,41 @@ class I8259 : public BasicPioDevice, public IntDev
 
     I8259(Params * p);
 
-    Tick read(PacketPtr pkt);
-    Tick write(PacketPtr pkt);
+    Port &
+    getPort(const std::string &if_name, PortID idx=InvalidPortID) override
+    {
+        if (if_name == "inputs")
+            return *inputs.at(idx);
+        else if (if_name == "output")
+            return *output.at(idx);
+        else
+            return BasicPioDevice::getPort(if_name, idx);
+    }
+
+    Tick read(PacketPtr pkt) override;
+    Tick write(PacketPtr pkt) override;
+
+    void
+    maskAll()
+    {
+        IMR = 0xFF;
+    }
+
+    void
+    unmaskAll()
+    {
+        IMR = 0x00;
+    }
 
     void signalInterrupt(int line);
     void raiseInterruptPin(int number);
     void lowerInterruptPin(int number);
     int getVector();
+
+    void serialize(CheckpointOut &cp) const override;
+    void unserialize(CheckpointIn &cp) override;
 };
 
-}; // namespace X86ISA
+} // namespace X86ISA
 
 #endif //__DEV_X86_I8259_HH__