diff -r 2980edcf1264 -r c0639bb5beaa src/python/m5/simulate.py --- a/src/python/m5/simulate.py Wed Oct 24 18:08:40 2012 -0400 +++ b/src/python/m5/simulate.py Wed Oct 24 18:10:48 2012 -0400 @@ -181,6 +181,14 @@ while (not all_drained): all_drained = _drain() +def memWriteback(root): + for obj in root.descendants(): + obj.memWriteback() + +def memInvalidate(root): + for obj in root.descendants(): + obj.memInvalidate() + def resume(root): for obj in root.descendants(): obj.drainResume() @@ -189,6 +197,7 @@ if not isinstance(root, objects.Root): raise TypeError, "Checkpoint must be called on a root object." drain(root) + memWriteback(root) print "Writing checkpoint" internal.core.serializeAll(dir) resume(root) diff -r 2980edcf1264 -r c0639bb5beaa src/sim/drain.hh --- a/src/sim/drain.hh Wed Oct 24 18:08:40 2012 -0400 +++ b/src/sim/drain.hh Wed Oct 24 18:10:48 2012 -0400 @@ -202,6 +202,29 @@ */ virtual void drainResume(); + /** + * Write back dirty buffers to memory using functional writes. + * + * After returning, an object implementing this method should have + * written all its dirty data back to memory. This method is + * typically used to prepare a system with caches for + * checkpointing. + */ + virtual void memWriteback() {}; + + /** + * Invalidate the contents of memory buffers. + * + * When the switching to hardware virtualized CPU models, we need + * to make sure that we don't have any cached state in the system + * that might become stale when we return. This method is used to + * flush all such state back to main memory. + * + * @warn This does not cause any dirty state to be written + * back to memory. + */ + virtual void memInvalidate() {}; + State getDrainState() const { return _drainState; } protected: