base: add the FmtStackTrace debug option
[gem5.git] / src / dev / x86 / i8254.hh
index 9528013c81bc1732bf3eceafd930fab4b5c290cf..084da8ed7523a3b383cf58c26ed7a44d6860c0dd 100644 (file)
 #define __DEV_X86_I8254_HH__
 
 #include "dev/intel_8254_timer.hh"
+#include "dev/intpin.hh"
 #include "dev/io_device.hh"
 #include "params/I8254.hh"
 
 namespace X86ISA
 {
 
-class IntPin;
-
 class I8254 : public BasicPioDevice
 {
   protected:
     Tick latency;
-    Intel8254Timer pit;
+    class X86Intel8254Timer : public Intel8254Timer
+    {
+      protected:
+        I8254 * parent;
+
+        void
+        counterInterrupt(unsigned int num)
+        {
+            parent->counterInterrupt(num);
+        }
+
+      public:
+        X86Intel8254Timer(const std::string &name, I8254 * _parent) :
+            Intel8254Timer(_parent, name), parent(_parent)
+        {}
+    };
+
+
+    X86Intel8254Timer pit;
+
+    std::vector<IntSourcePin<I8254> *> intPin;
 
-    IntPin *intPin;
+    void counterInterrupt(unsigned int num);
 
   public:
     typedef I8254Params Params;
 
+    Port &
+    getPort(const std::string &if_name, PortID idx=InvalidPortID) override
+    {
+        if (if_name == "int_pin")
+            return *intPin.at(idx);
+        else
+            return BasicPioDevice::getPort(if_name, idx);
+    }
+
     const Params *
     params() const
     {
         return dynamic_cast<const Params *>(_params);
     }
 
-    I8254(Params *p) : BasicPioDevice(p), latency(p->pio_latency),
-            pit(this, p->name), intPin(p->int_pin)
+    I8254(Params *p) : BasicPioDevice(p, 4), latency(p->pio_latency),
+            pit(p->name, this)
     {
-        pioSize = 4;
+        for (int i = 0; i < p->port_int_pin_connection_count; i++) {
+            intPin.push_back(new IntSourcePin<I8254>(csprintf(
+                            "%s.int_pin[%d]", name(), i), i, this));
+        }
     }
-    Tick read(PacketPtr pkt);
+    Tick read(PacketPtr pkt) override;
 
-    Tick write(PacketPtr pkt);
+    Tick write(PacketPtr pkt) override;
 
     bool
     outputHigh(unsigned int num)
@@ -89,8 +120,14 @@ class I8254 : public BasicPioDevice
     {
         pit.writeControl(val);
     }
+
+    void serialize(CheckpointOut &cp) const override;
+    void unserialize(CheckpointIn &cp) override;
+
+    void startup() override;
+
 };
 
-}; // namespace X86ISA
+} // namespace X86ISA
 
 #endif //__DEV_X86_SOUTH_BRIDGE_I8254_HH__