changeset 6d6bfdb036ce in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=6d6bfdb036ce
description:
        dev: prevent RTC events firing before startup

        This change includes edits to MC146818 timer to prevent RTC events
        firing before startup to comply with SimObject initialization call 
sequence.

        Committed by: Nilay Vaish <[email protected]>

diffstat:

 src/dev/alpha/tsunami_io.cc |   6 ++++++
 src/dev/alpha/tsunami_io.hh |   5 +++++
 src/dev/arm/rtc_pl031.cc    |   1 -
 src/dev/mc146818.cc         |  16 ++++++++++++----
 src/dev/mc146818.hh         |  12 ++++++++----
 src/dev/mips/malta_io.cc    |   6 ++++++
 src/dev/mips/malta_io.hh    |   5 +++++
 src/dev/x86/cmos.cc         |   6 ++++++
 src/dev/x86/cmos.hh         |   1 +
 9 files changed, 49 insertions(+), 9 deletions(-)

diffs (177 lines):

diff -r 64618b7c57b2 -r 6d6bfdb036ce src/dev/alpha/tsunami_io.cc
--- a/src/dev/alpha/tsunami_io.cc       Sat Jan 03 17:51:48 2015 -0600
+++ b/src/dev/alpha/tsunami_io.cc       Sat Jan 03 17:51:48 2015 -0600
@@ -284,6 +284,12 @@
     rtc.unserialize("rtc", cp, section);
 }
 
+void
+TsunamiIO::startup()
+{
+    rtc.startup();
+}
+
 TsunamiIO *
 TsunamiIOParams::create()
 {
diff -r 64618b7c57b2 -r 6d6bfdb036ce src/dev/alpha/tsunami_io.hh
--- a/src/dev/alpha/tsunami_io.hh       Sat Jan 03 17:51:48 2015 -0600
+++ b/src/dev/alpha/tsunami_io.hh       Sat Jan 03 17:51:48 2015 -0600
@@ -151,6 +151,11 @@
      */
     virtual void unserialize(Checkpoint *cp, const std::string &section);
 
+    /**
+     * Start running.
+     */
+    virtual void startup();
+
 };
 
 #endif // __DEV_TSUNAMI_IO_HH__
diff -r 64618b7c57b2 -r 6d6bfdb036ce src/dev/arm/rtc_pl031.cc
--- a/src/dev/arm/rtc_pl031.cc  Sat Jan 03 17:51:48 2015 -0600
+++ b/src/dev/arm/rtc_pl031.cc  Sat Jan 03 17:51:48 2015 -0600
@@ -44,7 +44,6 @@
 #include "debug/Timer.hh"
 #include "dev/arm/amba_device.hh"
 #include "dev/arm/rtc_pl031.hh"
-#include "dev/mc146818.hh"
 #include "mem/packet.hh"
 #include "mem/packet_access.hh"
 
diff -r 64618b7c57b2 -r 6d6bfdb036ce src/dev/mc146818.cc
--- a/src/dev/mc146818.cc       Sat Jan 03 17:51:48 2015 -0600
+++ b/src/dev/mc146818.cc       Sat Jan 03 17:51:48 2015 -0600
@@ -123,6 +123,15 @@
 }
 
 void
+MC146818::startup()
+{
+    assert(!event.scheduled());
+    assert(!tickEvent.scheduled());
+    schedule(event, curTick() + event.offset);
+    schedule(tickEvent, curTick() + tickEvent.offset);
+}
+
+void
 MC146818::writeData(const uint8_t addr, const uint8_t data)
 {
     bool panic_unsupported(false);
@@ -291,17 +300,16 @@
     //
     Tick rtcTimerInterruptTickOffset;
     UNSERIALIZE_SCALAR(rtcTimerInterruptTickOffset);
-    reschedule(event, curTick() + rtcTimerInterruptTickOffset);
+    event.offset = rtcTimerInterruptTickOffset;
     Tick rtcClockTickOffset;
     UNSERIALIZE_SCALAR(rtcClockTickOffset);
-    reschedule(tickEvent, curTick() + rtcClockTickOffset);
+    tickEvent.offset = rtcClockTickOffset;
 }
 
 MC146818::RTCEvent::RTCEvent(MC146818 * _parent, Tick i)
-    : parent(_parent), interval(i)
+    : parent(_parent), interval(i), offset(i)
 {
     DPRINTF(MC146818, "RTC Event Initilizing\n");
-    parent->schedule(this, curTick() + interval);
 }
 
 void
diff -r 64618b7c57b2 -r 6d6bfdb036ce src/dev/mc146818.hh
--- a/src/dev/mc146818.hh       Sat Jan 03 17:51:48 2015 -0600
+++ b/src/dev/mc146818.hh       Sat Jan 03 17:51:48 2015 -0600
@@ -51,6 +51,7 @@
     {
         MC146818 * parent;
         Tick interval;
+        Tick offset;
 
         RTCEvent(MC146818 * _parent, Tick i);
 
@@ -68,11 +69,11 @@
     struct RTCTickEvent : public Event
     {
         MC146818 * parent;
+        Tick offset;
 
-        RTCTickEvent(MC146818 * _parent) : parent(_parent)
-        {
-            parent->schedule(this, curTick() + SimClock::Int::s);
-        }
+        RTCTickEvent(MC146818 * _parent) :
+            parent(_parent), offset(SimClock::Int::s)
+        {}
 
         /** Event process to occur at interrupt*/
         void process();
@@ -153,6 +154,9 @@
             bool bcd, Tick frequency);
     virtual ~MC146818();
 
+    /** Start ticking */
+    virtual void startup();
+
     /** RTC write data */
     void writeData(const uint8_t addr, const uint8_t data);
 
diff -r 64618b7c57b2 -r 6d6bfdb036ce src/dev/mips/malta_io.cc
--- a/src/dev/mips/malta_io.cc  Sat Jan 03 17:51:48 2015 -0600
+++ b/src/dev/mips/malta_io.cc  Sat Jan 03 17:51:48 2015 -0600
@@ -142,6 +142,12 @@
     rtc.unserialize("rtc", cp, section);
 }
 
+void
+MaltaIO::startup()
+{
+    rtc.startup();
+}
+
 MaltaIO *
 MaltaIOParams::create()
 {
diff -r 64618b7c57b2 -r 6d6bfdb036ce src/dev/mips/malta_io.hh
--- a/src/dev/mips/malta_io.hh  Sat Jan 03 17:51:48 2015 -0600
+++ b/src/dev/mips/malta_io.hh  Sat Jan 03 17:51:48 2015 -0600
@@ -143,6 +143,11 @@
      */
     virtual void unserialize(Checkpoint *cp, const std::string &section);
 
+    /**
+     * Start running.
+     */
+    virtual void startup();
+
 };
 
 #endif // __DEV_MALTA_IO_HH__
diff -r 64618b7c57b2 -r 6d6bfdb036ce src/dev/x86/cmos.cc
--- a/src/dev/x86/cmos.cc       Sat Jan 03 17:51:48 2015 -0600
+++ b/src/dev/x86/cmos.cc       Sat Jan 03 17:51:48 2015 -0600
@@ -113,6 +113,12 @@
 }
 
 void
+X86ISA::Cmos::startup()
+{
+    rtc.startup();
+}
+
+void
 X86ISA::Cmos::serialize(std::ostream &os)
 {
     SERIALIZE_SCALAR(address);
diff -r 64618b7c57b2 -r 6d6bfdb036ce src/dev/x86/cmos.hh
--- a/src/dev/x86/cmos.hh       Sat Jan 03 17:51:48 2015 -0600
+++ b/src/dev/x86/cmos.hh       Sat Jan 03 17:51:48 2015 -0600
@@ -82,6 +82,7 @@
 
     Tick write(PacketPtr pkt);
 
+    virtual void startup();
     virtual void serialize(std::ostream &os);
     virtual void unserialize(Checkpoint *cp, const std::string &section);
 
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to