diff options
author | Steve Reinhardt <steve.reinhardt@amd.com> | 2010-08-17 05:17:06 -0700 |
---|---|---|
committer | Steve Reinhardt <steve.reinhardt@amd.com> | 2010-08-17 05:17:06 -0700 |
commit | f064aa306061ecc468efd8cf148ed08398ca824d (patch) | |
tree | d78548dc953bb621d9154249d07022dabf2f6e2c /src/sim | |
parent | 2519d116c9171ed4bf220d5049f244b333aa0842 (diff) | |
download | gem5-f064aa306061ecc468efd8cf148ed08398ca824d.tar.xz |
sim: revamp unserialization procedure
Replace direct call to unserialize() on each SimObject with a pair of
calls for better control over initialization in both ckpt and non-ckpt
cases.
If restoring from a checkpoint, loadState(ckpt) is called on each
SimObject. The default implementation simply calls unserialize() if
there is a corresponding checkpoint section, so we get backward
compatibility for existing objects. However, objects can override
loadState() to get other behaviors, e.g., doing other programmed
initializations after unserialize(), or complaining if no checkpoint
section is found. (Note that the default warning for a missing
checkpoint section is now gone.)
If not restoring from a checkpoint, we call the new initState() method
on each SimObject instead. This provides a hook for state
initializations that are only required when *not* restoring from a
checkpoint.
Given this new framework, do some cleanup of LiveProcess subclasses
and X86System, which were (in some cases) emulating initState()
behavior in startup via a local flag or (in other cases) erroneously
doing initializations in startup() that clobbered state loaded earlier
by unserialize().
Diffstat (limited to 'src/sim')
-rw-r--r-- | src/sim/process.cc | 9 | ||||
-rw-r--r-- | src/sim/process.hh | 5 | ||||
-rw-r--r-- | src/sim/serialize.cc | 15 | ||||
-rw-r--r-- | src/sim/serialize.hh | 1 | ||||
-rw-r--r-- | src/sim/sim_object.cc | 12 | ||||
-rw-r--r-- | src/sim/sim_object.hh | 39 |
6 files changed, 53 insertions, 28 deletions
diff --git a/src/sim/process.cc b/src/sim/process.cc index f11fdcac8..d4b1fba90 100644 --- a/src/sim/process.cc +++ b/src/sim/process.cc @@ -100,8 +100,8 @@ template class AuxVector<uint32_t>; template class AuxVector<uint64_t>; Process::Process(ProcessParams * params) - : SimObject(params), system(params->system), checkpointRestored(false), - max_stack_size(params->max_stack_size) + : SimObject(params), system(params->system), + max_stack_size(params->max_stack_size) { string in = params->input; string out = params->output; @@ -233,7 +233,7 @@ Process::findFreeContext() } void -Process::startup() +Process::initState() { if (contextIds.empty()) fatal("Process %s is not associated with any HW contexts!\n", name()); @@ -537,9 +537,6 @@ Process::unserialize(Checkpoint *cp, const std::string §ion) // find the param in the checkpoint if you wanted to, like set a default // but in this case we'll just stick with the instantianted value if not // found. - - checkpointRestored = true; - } diff --git a/src/sim/process.hh b/src/sim/process.hh index e73f93fa5..3b78cb001 100644 --- a/src/sim/process.hh +++ b/src/sim/process.hh @@ -79,8 +79,6 @@ class Process : public SimObject /// running on. System *system; - bool checkpointRestored; - // thread contexts associated with this process std::vector<int> contextIds; @@ -130,8 +128,7 @@ class Process : public SimObject // constructor Process(ProcessParams * params); - // post initialization startup - virtual void startup(); + virtual void initState(); protected: /// Memory object for initialization (image loading) diff --git a/src/sim/serialize.cc b/src/sim/serialize.cc index d95092629..d6d5ac094 100644 --- a/src/sim/serialize.cc +++ b/src/sim/serialize.cc @@ -452,17 +452,6 @@ Serializable::serializeAll(const string &cpt_dir) } void -Serializable::unserializeAll(const string &cpt_dir) -{ - string dir = Checkpoint::setDir(cpt_dir); - - DPRINTFR(Config, "Loading checkpoint dir '%s'\n", dir); - Checkpoint *cp = new Checkpoint(dir); - unserializeGlobals(cp); - SimObject::unserializeAll(cp); -} - -void Serializable::unserializeGlobals(Checkpoint *cp) { globals.unserialize(cp); @@ -561,9 +550,9 @@ Checkpoint::dir() Checkpoint::Checkpoint(const string &cpt_dir) - : db(new IniFile), cptDir(cpt_dir) + : db(new IniFile), cptDir(setDir(cpt_dir)) { - string filename = cpt_dir + "/" + Checkpoint::baseFilename; + string filename = cptDir + "/" + Checkpoint::baseFilename; if (!db->load(filename)) { fatal("Can't load checkpoint file '%s'\n", filename); } diff --git a/src/sim/serialize.hh b/src/sim/serialize.hh index 677a3fd92..d785605f3 100644 --- a/src/sim/serialize.hh +++ b/src/sim/serialize.hh @@ -141,7 +141,6 @@ class Serializable static int ckptMaxCount; static int ckptPrevCount; static void serializeAll(const std::string &cpt_dir); - static void unserializeAll(const std::string &cpt_dir); static void unserializeGlobals(Checkpoint *cp); }; diff --git a/src/sim/sim_object.cc b/src/sim/sim_object.cc index 157bf1395..503ac5650 100644 --- a/src/sim/sim_object.cc +++ b/src/sim/sim_object.cc @@ -74,6 +74,18 @@ SimObject::init() } void +SimObject::loadState(Checkpoint *cp) +{ + if (cp->sectionExists(name())) + unserialize(cp, name()); +} + +void +SimObject::initState() +{ +} + +void SimObject::startup() { } diff --git a/src/sim/sim_object.hh b/src/sim/sim_object.hh index 1b22c5825..876501be2 100644 --- a/src/sim/sim_object.hh +++ b/src/sim/sim_object.hh @@ -91,17 +91,48 @@ class SimObject : public EventManager, public Serializable virtual const std::string name() const { return params()->name; } - // initialization pass of all objects. - // Gets invoked after construction, before unserialize. + // The following SimObject initialization methods are called from + // the instantiate() method in src/python/m5/simulate.py. See + // that function for details on how/when these methods are + // invoked. + + /** + * init() is called after all C++ SimObjects have been created and + * all ports are connected. Initializations that are independent + * of unserialization but rely on a fully instantiated and + * connected SimObject graph should be done here. + */ virtual void init(); + /** + * loadState() is called on each SimObject when restoring from a + * checkpoint. The default implementation simply calls + * unserialize() if there is a corresponding section in the + * checkpoint. However, objects can override loadState() to get + * other behaviors, e.g., doing other programmed initializations + * after unserialize(), or complaining if no checkpoint section is + * found. + */ + virtual void loadState(Checkpoint *cp); + + /** + * initState() is called on each SimObject when *not* restoring + * from a checkpoint. This provides a hook for state + * initializations that are only required for a "cold start". + */ + virtual void initState(); + // register statistics for this object virtual void regStats(); virtual void regFormulas(); virtual void resetStats(); - // final initialization before simulation - // all state is unserialized so + /** + * startup() is the final initialization call before simulation. + * All state is initialized (including unserialized state, if any, + * such as the curTick value), so this is the appropriate place to + * schedule initial event(s) for objects that need them. + */ virtual void startup(); // static: call nameOut() & serialize() on all SimObjects |