diff options
Diffstat (limited to 'src/sim')
-rw-r--r-- | src/sim/SConscript | 1 | ||||
-rw-r--r-- | src/sim/root.cc | 24 | ||||
-rw-r--r-- | src/sim/serialize.cc | 57 | ||||
-rw-r--r-- | src/sim/serialize.hh | 9 |
4 files changed, 59 insertions, 32 deletions
diff --git a/src/sim/SConscript b/src/sim/SConscript index 0b3a35915..204bfca3b 100644 --- a/src/sim/SConscript +++ b/src/sim/SConscript @@ -42,6 +42,7 @@ SimObject('SubSystem.py') Source('arguments.cc') Source('async.cc') Source('core.cc') +Source('tags.cc') Source('cxx_config.cc') Source('cxx_manager.cc') Source('cxx_config_ini.cc') diff --git a/src/sim/root.cc b/src/sim/root.cc index 1d58c3bbe..7647ca5b7 100644 --- a/src/sim/root.cc +++ b/src/sim/root.cc @@ -132,8 +132,6 @@ Root::loadState(CheckpointIn &cp) void Root::serialize(CheckpointOut &cp) const { - uint64_t cpt_ver = gem5CheckpointVersion; - SERIALIZE_SCALAR(cpt_ver); SERIALIZE_SCALAR(FullSystem); std::string isa = THE_ISA_STR; SERIALIZE_SCALAR(isa); @@ -141,27 +139,7 @@ Root::serialize(CheckpointOut &cp) const void Root::unserialize(CheckpointIn &cp) -{ - uint64_t cpt_ver = 0; - UNSERIALIZE_OPT_SCALAR(cpt_ver); - if (cpt_ver < gem5CheckpointVersion) { - warn("**********************************************************\n"); - warn("!!!! Checkpoint ver %#x is older than current ver %#x !!!!\n", - cpt_ver, gem5CheckpointVersion); - warn("You might experience some issues when restoring and should run " - "the checkpoint upgrader (util/cpt_upgrader.py) on your " - "checkpoint\n"); - warn("**********************************************************\n"); - } else if (cpt_ver > gem5CheckpointVersion) { - warn("**********************************************************\n"); - warn("!!!! Checkpoint ver %#x is newer than current ver %#x !!!!\n", - cpt_ver, gem5CheckpointVersion); - warn("Running a new checkpoint with an older version of gem5 is not " - "supported. While it might work, you may experience incorrect " - "behavior or crashes.\n"); - warn("**********************************************************\n"); - } -} +{} bool FullSystem; diff --git a/src/sim/serialize.cc b/src/sim/serialize.cc index 0904b1375..f9a945b95 100644 --- a/src/sim/serialize.cc +++ b/src/sim/serialize.cc @@ -496,16 +496,73 @@ class Globals : public Serializable /// The one and only instance of the Globals class. Globals globals; +/// The version tags for this build of the simulator, to be stored in the +/// Globals section during serialization and compared upon unserialization. +extern std::set<std::string> version_tags; + void Globals::serialize(CheckpointOut &cp) const { paramOut(cp, "curTick", curTick()); + SERIALIZE_CONTAINER(version_tags); } void Globals::unserialize(CheckpointIn &cp) { paramIn(cp, "curTick", unserializedCurTick); + + const std::string §ion(Serializable::currentSection()); + std::string str; + if (!cp.find(section, "version_tags", str)) { + warn("**********************************************************\n"); + warn("!!!! Checkpoint uses an old versioning scheme. !!!!\n"); + warn("Run the checkpoint upgrader (util/cpt_upgrader.py) on your " + "checkpoint\n"); + warn("**********************************************************\n"); + return; + } + + std::set<std::string> cpt_tags; + arrayParamIn(cp, "version_tags", cpt_tags); // UNSERIALIZE_CONTAINER + + bool err = false; + for (const auto& t : version_tags) { + if (cpt_tags.find(t) == cpt_tags.end()) { + // checkpoint is missing tag that this binary has + if (!err) { + warn("*****************************************************\n"); + warn("!!!! Checkpoint is missing the following version tags:\n"); + err = true; + } + warn(" %s\n", t); + } + } + if (err) { + warn("You might experience some issues when restoring and should run " + "the checkpoint upgrader (util/cpt_upgrader.py) on your " + "checkpoint\n"); + warn("**********************************************************\n"); + } + + err = false; + for (const auto& t : cpt_tags) { + if (version_tags.find(t) == version_tags.end()) { + // gem5 binary is missing tag that this checkpoint has + if (!err) { + warn("*****************************************************\n"); + warn("!!!! gem5 is missing the following version tags:\n"); + err = true; + } + warn(" %s\n", t); + } + } + if (err) { + warn("Running a checkpoint with incompatible version tags is not " + "supported. While it might work, you may experience incorrect " + "behavior or crashes.\n"); + warn("**********************************************************\n"); + } } Serializable::Serializable() diff --git a/src/sim/serialize.hh b/src/sim/serialize.hh index 4a2cc04e9..9a1170a9e 100644 --- a/src/sim/serialize.hh +++ b/src/sim/serialize.hh @@ -71,15 +71,6 @@ class EventQueue; typedef std::ostream CheckpointOut; -/** The current version of the checkpoint format. - * This should be incremented by 1 and only 1 for every new version, where a new - * version is defined as a checkpoint created before this version won't work on - * the current version until the checkpoint format is updated. Adding a new - * SimObject shouldn't cause the version number to increase, only changes to - * existing objects such as serializing/unserializing more state, changing sizes - * of serialized arrays, etc. */ -static const uint64_t gem5CheckpointVersion = 0x000000000000000f; - template <class T> void paramOut(CheckpointOut &cp, const std::string &name, const T ¶m); |