diff -r b5187256db43 -r 64a4d03bc18f src/dev/alpha/tsunami_io.hh --- a/src/dev/alpha/tsunami_io.hh Wed Aug 11 14:35:52 2010 -0700 +++ b/src/dev/alpha/tsunami_io.hh Wed Aug 11 14:35:52 2010 -0700 @@ -141,6 +141,12 @@ void clearPIC(uint8_t bitvector); /** + * Drain the io state including all associated events. + * @param drainEvent + */ + unsigned int drain(Event *de); + + /** * Serialize this object to the given output stream. * @param os The stream to serialize to. */ diff -r b5187256db43 -r 64a4d03bc18f src/dev/alpha/tsunami_io.cc --- a/src/dev/alpha/tsunami_io.cc Wed Aug 11 14:35:52 2010 -0700 +++ b/src/dev/alpha/tsunami_io.cc Wed Aug 11 14:35:52 2010 -0700 @@ -249,6 +249,17 @@ } } +unsigned int +TsunamiIO::drain(Event *de) +{ + unsigned int count = 0; + count += pitimer.drain(de); + count += rtc.drain(de); + assert(count == 0); + changeState(SimObject::Drained); + return count; +} + void TsunamiIO::serialize(ostream &os) { diff -r b5187256db43 -r 64a4d03bc18f src/dev/intel_8254_timer.hh --- a/src/dev/intel_8254_timer.hh Wed Aug 11 14:35:52 2010 -0700 +++ b/src/dev/intel_8254_timer.hh Wed Aug 11 14:35:52 2010 -0700 @@ -137,6 +137,10 @@ /** Pointer to container */ Intel8254Timer *parent; + /** if non-zero, the scheduled tick of an event used for drain + serialization coordination */ + Tick event_tick; + public: Counter(Intel8254Timer *p, const std::string &name, unsigned int num); @@ -165,6 +169,12 @@ bool outputHigh(); /** + * Drain all associated events. + * @param drainEvent + */ + unsigned int drain(Event *de); + + /** * Serialize this object to the given output stream. * @param base The base name of the counter object. * @param os The stream to serialize to. @@ -229,6 +239,8 @@ return counter[num]->outputHigh(); } + unsigned int drain(Event *de); + /** * Serialize this object to the given output stream. * @param base The base name of the counter object. diff -r b5187256db43 -r 64a4d03bc18f src/dev/intel_8254_timer.cc --- a/src/dev/intel_8254_timer.cc Wed Aug 11 14:35:52 2010 -0700 +++ b/src/dev/intel_8254_timer.cc Wed Aug 11 14:35:52 2010 -0700 @@ -32,6 +32,7 @@ #include "base/misc.hh" #include "dev/intel_8254_timer.hh" +#include "sim/sim_object.hh" using namespace std; @@ -69,6 +70,17 @@ } } +unsigned int +Intel8254Timer::drain(Event *de) +{ + unsigned int count = 0; + count += counter[0]->drain(de); + count += counter[1]->drain(de); + count += counter[2]->drain(de); + assert(count == 0); + return count; +} + void Intel8254Timer::serialize(const string &base, ostream &os) { @@ -216,6 +228,18 @@ return output_high; } +unsigned int +Intel8254Timer::Counter::drain(Event *de) +{ + if (event.scheduled()) { + event_tick = event.when(); + parent->deschedule(event); + } else { + event_tick = 0; + } + return 0; +} + void Intel8254Timer::Counter::serialize(const string &base, ostream &os) { @@ -227,10 +251,6 @@ paramOut(os, base + ".latch_on", latch_on); paramOut(os, base + ".read_byte", read_byte); paramOut(os, base + ".write_byte", write_byte); - - Tick event_tick = 0; - if (event.scheduled()) - event_tick = event.when(); paramOut(os, base + ".event_tick", event_tick); } @@ -247,7 +267,6 @@ paramIn(cp, section, base + ".read_byte", read_byte); paramIn(cp, section, base + ".write_byte", write_byte); - Tick event_tick; paramIn(cp, section, base + ".event_tick", event_tick); if (event_tick) parent->schedule(event, event_tick); diff -r b5187256db43 -r 64a4d03bc18f src/dev/mc146818.hh --- a/src/dev/mc146818.hh Wed Aug 11 14:35:52 2010 -0700 +++ b/src/dev/mc146818.hh Wed Aug 11 14:35:52 2010 -0700 @@ -119,6 +119,10 @@ /** RTC status register B */ uint8_t stat_regB; + /** RTC event times for drain and serialization coordination */ + Tick rtcTimerInterruptTickOffset; + Tick rtcClockTickOffset; + public: MC146818(EventManager *em, const std::string &name, const struct tm time, bool bcd, Tick frequency); @@ -132,6 +136,8 @@ void tickClock(); + unsigned int drain(Event *de); + /** * Serialize this object to the given output stream. * @param base The base name of the counter object. diff -r b5187256db43 -r 64a4d03bc18f src/dev/mc146818.cc --- a/src/dev/mc146818.cc Wed Aug 11 14:35:52 2010 -0700 +++ b/src/dev/mc146818.cc Wed Aug 11 14:35:52 2010 -0700 @@ -40,6 +40,7 @@ #include "base/trace.hh" #include "dev/mc146818.hh" #include "dev/rtcreg.h" +#include "sim/sim_object.hh" using namespace std; @@ -105,8 +106,12 @@ MC146818::~MC146818() { - deschedule(tickEvent); - deschedule(event); + if (tickEvent.scheduled()) { + deschedule(tickEvent); + } + if (event.scheduled()) { + deschedule(event); + } } void @@ -203,6 +208,20 @@ setTime(*gmtime(&calTime)); } +unsigned int +MC146818::drain(Event *de) +{ + if (event.scheduled()) { + rtcTimerInterruptTickOffset = event.when() - curTick; + rtcClockTickOffset = event.when() - curTick; + deschedule(event); + } + if (tickEvent.scheduled()) { + deschedule(tickEvent); + } + return 0; +} + void MC146818::serialize(const string &base, ostream &os) { @@ -214,9 +233,7 @@ // save the timer tick and rtc clock tick values to correctly reschedule // them during unserialize // - Tick rtcTimerInterruptTickOffset = event.when() - curTick; SERIALIZE_SCALAR(rtcTimerInterruptTickOffset); - Tick rtcClockTickOffset = event.when() - curTick; SERIALIZE_SCALAR(rtcClockTickOffset); }