summaryrefslogtreecommitdiff
path: root/src/cpu/base.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/cpu/base.cc')
-rw-r--r--src/cpu/base.cc33
1 files changed, 24 insertions, 9 deletions
diff --git a/src/cpu/base.cc b/src/cpu/base.cc
index 14b5586c8..3e7a6d4b6 100644
--- a/src/cpu/base.cc
+++ b/src/cpu/base.cc
@@ -524,21 +524,36 @@ BaseCPU::serialize(std::ostream &os)
{
SERIALIZE_SCALAR(instCnt);
- /* Unlike _pid, _taskId is not serialized, as they are dynamically
- * assigned unique ids that are only meaningful for the duration of
- * a specific run. We will need to serialize the entire taskMap in
- * system. */
- SERIALIZE_SCALAR(_pid);
-
- interrupts->serialize(os);
+ if (!_switchedOut) {
+ /* Unlike _pid, _taskId is not serialized, as they are dynamically
+ * assigned unique ids that are only meaningful for the duration of
+ * a specific run. We will need to serialize the entire taskMap in
+ * system. */
+ SERIALIZE_SCALAR(_pid);
+
+ interrupts->serialize(os);
+
+ // Serialize the threads, this is done by the CPU implementation.
+ for (ThreadID i = 0; i < numThreads; ++i) {
+ nameOut(os, csprintf("%s.xc.%i", name(), i));
+ serializeThread(os, i);
+ }
+ }
}
void
BaseCPU::unserialize(Checkpoint *cp, const std::string &section)
{
UNSERIALIZE_SCALAR(instCnt);
- UNSERIALIZE_SCALAR(_pid);
- interrupts->unserialize(cp, section);
+
+ if (!_switchedOut) {
+ UNSERIALIZE_SCALAR(_pid);
+ interrupts->unserialize(cp, section);
+
+ // Unserialize the threads, this is done by the CPU implementation.
+ for (ThreadID i = 0; i < numThreads; ++i)
+ unserializeThread(cp, csprintf("%s.xc.%i", section, i), i);
+ }
}
void