fixed MC146818 checkpointing bug and added isa serialization calls to simple_thread

This commit is contained in:
Brad Beckmann 2009-10-15 15:15:24 -07:00
parent 30a185dcd0
commit 28204b2a96
2 changed files with 28 additions and 4 deletions

View file

@ -199,6 +199,11 @@ SimpleThread::serialize(ostream &os)
SERIALIZE_SCALAR(nextPC); SERIALIZE_SCALAR(nextPC);
SERIALIZE_SCALAR(nextNPC); SERIALIZE_SCALAR(nextNPC);
// thread_num and cpu_id are deterministic from the config // thread_num and cpu_id are deterministic from the config
//
// Now must serialize all the ISA dependent state
//
isa.serialize(os);
} }
@ -214,6 +219,11 @@ SimpleThread::unserialize(Checkpoint *cp, const std::string &section)
UNSERIALIZE_SCALAR(nextPC); UNSERIALIZE_SCALAR(nextPC);
UNSERIALIZE_SCALAR(nextNPC); UNSERIALIZE_SCALAR(nextNPC);
// thread_num and cpu_id are deterministic from the config // thread_num and cpu_id are deterministic from the config
//
// Now must unserialize all the ISA dependent state
//
isa.unserialize(cp, section);
} }
#if FULL_SYSTEM #if FULL_SYSTEM

View file

@ -207,6 +207,15 @@ MC146818::serialize(const string &base, ostream &os)
arrayParamOut(os, base + ".clock_data", clock_data, sizeof(clock_data)); arrayParamOut(os, base + ".clock_data", clock_data, sizeof(clock_data));
paramOut(os, base + ".stat_regA", stat_regA); paramOut(os, base + ".stat_regA", stat_regA);
paramOut(os, base + ".stat_regB", stat_regB); paramOut(os, base + ".stat_regB", stat_regB);
//
// 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);
} }
void void
@ -218,10 +227,15 @@ MC146818::unserialize(const string &base, Checkpoint *cp,
paramIn(cp, section, base + ".stat_regA", stat_regA); paramIn(cp, section, base + ".stat_regA", stat_regA);
paramIn(cp, section, base + ".stat_regB", stat_regB); paramIn(cp, section, base + ".stat_regB", stat_regB);
// We're not unserializing the event here, but we need to //
// rescehedule the event since curTick was moved forward by the // properly schedule the timer and rtc clock events
// checkpoint //
reschedule(event, curTick + event.interval); Tick rtcTimerInterruptTickOffset;
UNSERIALIZE_SCALAR(rtcTimerInterruptTickOffset);
reschedule(event, curTick + rtcTimerInterruptTickOffset);
Tick rtcClockTickOffset;
UNSERIALIZE_SCALAR(rtcClockTickOffset);
reschedule(tickEvent, curTick + rtcClockTickOffset);
} }
MC146818::RTCEvent::RTCEvent(MC146818 * _parent, Tick i) MC146818::RTCEvent::RTCEvent(MC146818 * _parent, Tick i)