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 | 118 | ||||
-rw-r--r-- | src/sim/serialize.hh | 26 |
4 files changed, 131 insertions, 38 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 3127d9a04..f9a945b95 100644 --- a/src/sim/serialize.cc +++ b/src/sim/serialize.cc @@ -212,6 +212,24 @@ arrayParamOut(CheckpointOut &os, const string &name, const list<T> ¶m) template <class T> void +arrayParamOut(CheckpointOut &os, const string &name, const set<T> ¶m) +{ + typename set<T>::const_iterator it = param.begin(); + + os << name << "="; + if (param.size() > 0) + showParam(os, *it); + it++; + while (it != param.end()) { + os << " "; + showParam(os, *it); + it++; + } + os << "\n"; +} + +template <class T> +void paramIn(CheckpointIn &cp, const string &name, T ¶m) { const string §ion(Serializable::currentSection()); @@ -223,12 +241,13 @@ paramIn(CheckpointIn &cp, const string &name, T ¶m) template <class T> bool -optParamIn(CheckpointIn &cp, const string &name, T ¶m) +optParamIn(CheckpointIn &cp, const string &name, T ¶m, bool warn) { const string §ion(Serializable::currentSection()); string str; if (!cp.find(section, name, str) || !parseParam(str, param)) { - warn("optional parameter %s:%s not present\n", section, name); + if (warn) + warn("optional parameter %s:%s not present\n", section, name); return false; } else { return true; @@ -367,6 +386,36 @@ arrayParamIn(CheckpointIn &cp, const string &name, list<T> ¶m) } } +template <class T> +void +arrayParamIn(CheckpointIn &cp, const string &name, set<T> ¶m) +{ + const string §ion(Serializable::currentSection()); + string str; + if (!cp.find(section, name, str)) { + fatal("Can't unserialize '%s:%s'\n", section, name); + } + param.clear(); + + vector<string> tokens; + tokenize(tokens, str, ' '); + + for (vector<string>::size_type i = 0; i < tokens.size(); i++) { + T scalar_value; + if (!parseParam(tokens[i], scalar_value)) { + string err("could not parse \""); + + err += str; + err += "\""; + + fatal(err); + } + + // assign parsed value to vector + param.insert(scalar_value); + } +} + void objParamIn(CheckpointIn &cp, const string &name, SimObject * ¶m) @@ -384,7 +433,8 @@ objParamIn(CheckpointIn &cp, const string &name, SimObject * ¶m) template void \ paramIn(CheckpointIn &cp, const string &name, type & param); \ template bool \ - optParamIn(CheckpointIn &cp, const string &name, type & param); \ + optParamIn(CheckpointIn &cp, const string &name, type & param, \ + bool warn); \ template void \ arrayParamOut(CheckpointOut &os, const string &name, \ type const *param, unsigned size); \ @@ -421,6 +471,11 @@ INSTANTIATE_PARAM_TEMPLATES(double) INSTANTIATE_PARAM_TEMPLATES(string) INSTANTIATE_PARAM_TEMPLATES(Pixel) +// set is only used with strings and furthermore doesn't agree with Pixel +template void +arrayParamOut(CheckpointOut &, const string &, const set<string> &); +template void +arrayParamIn(CheckpointIn &, const string &, set<string> &); ///////////////////////////// @@ -441,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 561cd5508..9a1170a9e 100644 --- a/src/sim/serialize.hh +++ b/src/sim/serialize.hh @@ -55,6 +55,7 @@ #include <list> #include <map> #include <stack> +#include <set> #include <vector> #include "base/bitunion.hh" @@ -70,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); @@ -100,13 +92,15 @@ void paramIn(CheckpointIn &cp, const std::string &name, } template <class T> -bool optParamIn(CheckpointIn &cp, const std::string &name, T ¶m); +bool optParamIn(CheckpointIn &cp, const std::string &name, T ¶m, + bool warn = true); template <typename DataType, typename BitUnion> bool optParamIn(CheckpointIn &cp, const std::string &name, - BitfieldBackend::BitUnionOperators<DataType, BitUnion> &p) + BitfieldBackend::BitUnionOperators<DataType, BitUnion> &p, + bool warn = true) { - return optParamIn(cp, name, p.__data); + return optParamIn(cp, name, p.__data, warn); } template <class T> @@ -122,6 +116,10 @@ void arrayParamOut(CheckpointOut &cp, const std::string &name, const std::list<T> ¶m); template <class T> +void arrayParamOut(CheckpointOut &cp, const std::string &name, + const std::set<T> ¶m); + +template <class T> void arrayParamIn(CheckpointIn &cp, const std::string &name, T *param, unsigned size); @@ -133,6 +131,10 @@ template <class T> void arrayParamIn(CheckpointIn &cp, const std::string &name, std::list<T> ¶m); +template <class T> +void arrayParamIn(CheckpointIn &cp, const std::string &name, + std::set<T> ¶m); + void objParamIn(CheckpointIn &cp, const std::string &name, SimObject * ¶m); |