fixed MC146818 checkpointing bug and added isa serialization calls to simple_thread
This commit is contained in:
parent
30a185dcd0
commit
28204b2a96
2 changed files with 28 additions and 4 deletions
|
@ -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 §ion)
|
||||||
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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue