summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/python/m5/simulate.py9
-rw-r--r--src/sim/drain.hh23
2 files changed, 32 insertions, 0 deletions
diff --git a/src/python/m5/simulate.py b/src/python/m5/simulate.py
index ca2cc4a9c..8ad273225 100644
--- a/src/python/m5/simulate.py
+++ b/src/python/m5/simulate.py
@@ -181,6 +181,14 @@ def drain(root):
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 @@ def checkpoint(dir):
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 --git a/src/sim/drain.hh b/src/sim/drain.hh
index 252022bc7..2f5d2d965 100644
--- a/src/sim/drain.hh
+++ b/src/sim/drain.hh
@@ -202,6 +202,29 @@ class Drainable
*/
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 <i>not</i> cause any dirty state to be written
+ * back to memory.
+ */
+ virtual void memInvalidate() {};
+
State getDrainState() const { return _drainState; }
protected: