sim: Add drain methods to request additional cleanup operations
authorAndreas Sandberg <Andreas.Sandberg@arm.com>
Fri, 2 Nov 2012 16:32:02 +0000 (11:32 -0500)
committerAndreas Sandberg <Andreas.Sandberg@arm.com>
Fri, 2 Nov 2012 16:32:02 +0000 (11:32 -0500)
This patch adds the following two methods to the Drainable base class:

memWriteback() - Write back all dirty cache lines to memory using
functional accesses.

memInvalidate() - Invalidate memory system buffers. Dirty data
won't be written back.

Specifying calling memWriteback() after draining will allow us to
checkpoint systems with caches. memInvalidate() can be used to drop
memory system buffers in preparation for switching to an accelerated
CPU model that bypasses the gem5 memory system (e.g., hardware
virtualized CPUs).

Note: This patch only adds the methods to Drainable, the code for
flushing the TLB and the cache is committed separately.

src/python/m5/simulate.py
src/sim/drain.hh

index ca2cc4a9c7956ffca6bd25e24159e61a3ae707a5..8ad273225164e5fad791bae7b581066c28b99efa 100644 (file)
@@ -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)
index 252022bc7d155c34da36ce808d54c831e6267f51..2f5d2d965abe8e4ac3cb43aa031ea2fec42a7201 100644 (file)
@@ -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: