summaryrefslogtreecommitdiff
path: root/src/dev/mc146818.cc
diff options
context:
space:
mode:
authorCagdas Dirik <cdirik@micron.com>2015-01-03 17:51:48 -0600
committerCagdas Dirik <cdirik@micron.com>2015-01-03 17:51:48 -0600
commit02c376ac44584484268bd714a45fa0f0265a896a (patch)
tree8bcd4be1ea858883cf68cc40e1142aaca1b8e6e3 /src/dev/mc146818.cc
parent1ee70e9d84b769b736348e1f7709bc8ede344ec2 (diff)
downloadgem5-02c376ac44584484268bd714a45fa0f0265a896a.tar.xz
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 <nilay@cs.wisc.edu>
Diffstat (limited to 'src/dev/mc146818.cc')
-rw-r--r--src/dev/mc146818.cc16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/dev/mc146818.cc b/src/dev/mc146818.cc
index 81366b774..fa8350760 100644
--- a/src/dev/mc146818.cc
+++ b/src/dev/mc146818.cc
@@ -123,6 +123,15 @@ MC146818::rega_dv_disabled(const RtcRegA &reg)
}
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 @@ MC146818::unserialize(const string &base, Checkpoint *cp,
//
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