diff options
Diffstat (limited to 'src/cpu/base.cc')
-rw-r--r-- | src/cpu/base.cc | 33 |
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 §ion) { 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 |