summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBrad Beckmann <Brad.Beckmann@amd.com>2009-10-15 15:15:24 -0700
committerBrad Beckmann <Brad.Beckmann@amd.com>2009-10-15 15:15:24 -0700
commit28204b2a964983738726428269e61833f4e1dce9 (patch)
tree5ee8b08fb193d39e02c71b2e73fd7b56db04124b /src
parent30a185dcd04cc7797609398219482d03a68509f9 (diff)
downloadgem5-28204b2a964983738726428269e61833f4e1dce9.tar.xz
fixed MC146818 checkpointing bug and added isa serialization calls to simple_thread
Diffstat (limited to 'src')
-rw-r--r--src/cpu/simple_thread.cc10
-rw-r--r--src/dev/mc146818.cc22
2 files changed, 28 insertions, 4 deletions
diff --git a/src/cpu/simple_thread.cc b/src/cpu/simple_thread.cc
index 92c6ad69b..f18634198 100644
--- a/src/cpu/simple_thread.cc
+++ b/src/cpu/simple_thread.cc
@@ -199,6 +199,11 @@ SimpleThread::serialize(ostream &os)
SERIALIZE_SCALAR(nextPC);
SERIALIZE_SCALAR(nextNPC);
// 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(nextNPC);
// 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
diff --git a/src/dev/mc146818.cc b/src/dev/mc146818.cc
index b25b015d2..0bb6558c8 100644
--- a/src/dev/mc146818.cc
+++ b/src/dev/mc146818.cc
@@ -207,6 +207,15 @@ MC146818::serialize(const string &base, ostream &os)
arrayParamOut(os, base + ".clock_data", clock_data, sizeof(clock_data));
paramOut(os, base + ".stat_regA", stat_regA);
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
@@ -218,10 +227,15 @@ MC146818::unserialize(const string &base, Checkpoint *cp,
paramIn(cp, section, base + ".stat_regA", stat_regA);
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
- // checkpoint
- reschedule(event, curTick + event.interval);
+ //
+ // properly schedule the timer and rtc clock events
+ //
+ 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)