diff -r 0a84553ddc4b -r 216b8ba04029 src/dev/mc146818.hh --- a/src/dev/mc146818.hh Tue Dec 02 11:50:55 2014 -0700 +++ b/src/dev/mc146818.hh Wed Dec 03 10:27:30 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); # HG changeset patch # User cdirik # Date 1417627650 25200 # Wed Dec 03 10:27:30 2014 -0700 # Node ID 216b8ba04029e0043f6c42385c4971395f90d46c # Parent 0a84553ddc4bf841e8ed8a15f374d5c887b46745 Applying r2545 - Prevent MC146818 timer RTC events firing before startup diff -r 0a84553ddc4b -r 216b8ba04029 src/dev/mc146818.cc --- a/src/dev/mc146818.cc Tue Dec 02 11:50:55 2014 -0700 +++ b/src/dev/mc146818.cc Wed Dec 03 10:27:30 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 0a84553ddc4b -r 216b8ba04029 src/dev/x86/cmos.hh --- a/src/dev/x86/cmos.hh Tue Dec 02 11:50:55 2014 -0700 +++ b/src/dev/x86/cmos.hh Wed Dec 03 10:27:30 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 0a84553ddc4b -r 216b8ba04029 src/dev/x86/cmos.cc --- a/src/dev/x86/cmos.cc Tue Dec 02 11:50:55 2014 -0700 +++ b/src/dev/x86/cmos.cc Wed Dec 03 10:27:30 2014 -0700 @@ -113,6 +113,12 @@ } void +X86ISA::Cmos::startup() +{ + rtc.startup(); +} + +void X86ISA::Cmos::serialize(std::ostream &os) { SERIALIZE_SCALAR(address);