diff -r 99ac58eee195 -r 5371d84c7ef2 src/dev/mc146818.hh --- a/src/dev/mc146818.hh Thu Dec 04 11:08:23 2014 -0700 +++ b/src/dev/mc146818.hh Thu Dec 04 11:08:23 2014 -0700 @@ -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 99ac58eee195 -r 5371d84c7ef2 src/dev/mc146818.cc --- a/src/dev/mc146818.cc Thu Dec 04 11:08:23 2014 -0700 +++ b/src/dev/mc146818.cc Thu Dec 04 11:08:23 2014 -0700 @@ -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 99ac58eee195 -r 5371d84c7ef2 src/dev/x86/cmos.hh --- a/src/dev/x86/cmos.hh Thu Dec 04 11:08:23 2014 -0700 +++ b/src/dev/x86/cmos.hh Thu Dec 04 11:08:23 2014 -0700 @@ -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 §ion); diff -r 99ac58eee195 -r 5371d84c7ef2 src/dev/x86/cmos.cc --- a/src/dev/x86/cmos.cc Thu Dec 04 11:08:23 2014 -0700 +++ b/src/dev/x86/cmos.cc Thu Dec 04 11:08:23 2014 -0700 @@ -113,6 +113,12 @@ } void +X86ISA::Cmos::startup() +{ + rtc.startup(); +} + +void X86ISA::Cmos::serialize(std::ostream &os) { SERIALIZE_SCALAR(address);