Checkpoint: Make system serialize call children
authorAndreas Hansson <andreas.hansson@arm.com>
Mon, 15 Oct 2012 12:12:29 +0000 (08:12 -0400)
committerAndreas Hansson <andreas.hansson@arm.com>
Mon, 15 Oct 2012 12:12:29 +0000 (08:12 -0400)
This patch changes how the serialization of the system works. The base
class had a non-virtual serialize and unserialize, that was hidden by
a function with the same name for a number of subclasses (most likely
not intentional as the base class should have been virtual). A few of
the derived systems had no specialization at all (e.g. Power and x86
that simply called the System::serialize), but MIPS and Alpha adds
additional symbol table entries to the checkpoint.

Instead of overriding the virtual function, the additional entries are
now printed through a virtual function (un)serializeSymtab. The reason
for not calling System::serialize from the two related systems is that
a follow up patch will require the system to also serialize the
PhysicalMemory, and if this is done in the base class if ends up being
between the general parts and the specialized symbol table.

With this patch, the checkpoint is not modified, as the order of the
segments is unchanged.

src/arch/alpha/system.cc
src/arch/alpha/system.hh
src/arch/mips/system.cc
src/arch/mips/system.hh
src/arch/sparc/system.cc
src/arch/sparc/system.hh
src/arch/x86/system.cc
src/arch/x86/system.hh
src/sim/system.cc
src/sim/system.hh

index ca3c2b078a0b0be164410bf2c7183f5b4a26b89d..f8e65015a71aa728e413bca572a98d8445b09478 100644 (file)
@@ -218,17 +218,15 @@ AlphaSystem::setAlphaAccess(Addr access)
 }
 
 void
-AlphaSystem::serialize(std::ostream &os)
+AlphaSystem::serializeSymtab(std::ostream &os)
 {
-    System::serialize(os);
     consoleSymtab->serialize("console_symtab", os);
     palSymtab->serialize("pal_symtab", os);
 }
 
 void
-AlphaSystem::unserialize(Checkpoint *cp, const std::string &section)
+AlphaSystem::unserializeSymtab(Checkpoint *cp, const std::string &section)
 {
-    System::unserialize(cp,section);
     consoleSymtab->unserialize("console_symtab", cp, section);
     palSymtab->unserialize("pal_symtab", cp, section);
 }
index 024d8bb47a88b1bc21caf4e8cf128d50b16152b4..bbf281c39eb4285d12f299180cbb584f4ad2ba16 100644 (file)
@@ -59,8 +59,8 @@ class AlphaSystem : public System
     /**
      * Serialization stuff
      */
-    virtual void serialize(std::ostream &os);
-    virtual void unserialize(Checkpoint *cp, const std::string &section);
+    virtual void serializeSymtab(std::ostream &os);
+    virtual void unserializeSymtab(Checkpoint *cp, const std::string &section);
 
     /** Override startup() to provide a path to call setupFuncEvents()
      */
index f0d4c250eebd94c34070454e455f9ac782988ca2..c6a043e46078bf38b818d7c578da50d5471fbab9 100755 (executable)
@@ -67,19 +67,6 @@ MipsSystem::breakpoint()
     return 0;
 }
 
-void
-MipsSystem::serialize(std::ostream &os)
-{
-    System::serialize(os);
-}
-
-
-void
-MipsSystem::unserialize(Checkpoint *cp, const std::string &section)
-{
-    System::unserialize(cp,section);
-}
-
 MipsSystem *
 MipsSystemParams::create()
 {
index fcaceadcd5c4fe0b4cb9de74c264063cd89c9eda..6b74ac1e54b313a310f49c62fcf6f6f1e9b3d982 100755 (executable)
@@ -55,11 +55,6 @@ class MipsSystem : public System
     virtual bool breakpoint();
 
   public:
-    /**
-     * Serialization stuff
-     */
-    virtual void serialize(std::ostream &os);
-    virtual void unserialize(Checkpoint *cp, const std::string &section);
 
     /**
      * Set the m5MipsAccess pointer in the console
index 9ce0a90de3e66f85498a387e4f7272a03aea6fb7..0b36df9cabe8366f329081c1208e0176b8240dfc 100644 (file)
@@ -177,9 +177,8 @@ SparcSystem::~SparcSystem()
 }
 
 void
-SparcSystem::serialize(std::ostream &os)
+SparcSystem::serializeSymtab(std::ostream &os)
 {
-    System::serialize(os);
     resetSymtab->serialize("reset_symtab", os);
     hypervisorSymtab->serialize("hypervisor_symtab", os);
     openbootSymtab->serialize("openboot_symtab", os);
@@ -190,9 +189,8 @@ SparcSystem::serialize(std::ostream &os)
 
 
 void
-SparcSystem::unserialize(Checkpoint *cp, const std::string &section)
+SparcSystem::unserializeSymtab(Checkpoint *cp, const std::string &section)
 {
-    System::unserialize(cp,section);
     resetSymtab->unserialize("reset_symtab", cp, section);
     hypervisorSymtab->unserialize("hypervisor_symtab", cp, section);
     openbootSymtab->unserialize("openboot_symtab", cp, section);
index 4b3da6287b1a98fccfecc7ac9046f909110aef7d..a4bd64aa56c81f3e3250a48f74a7a734f8989cd6 100644 (file)
@@ -54,8 +54,8 @@ class SparcSystem : public System
  * Serialization stuff
  */
   public:
-    virtual void serialize(std::ostream &os);
-    virtual void unserialize(Checkpoint *cp, const std::string &section);
+    virtual void serializeSymtab(std::ostream &os);
+    virtual void unserializeSymtab(Checkpoint *cp, const std::string &section);
 
     /** reset binary symbol table */
     SymbolTable *resetSymtab;
index 87fb61edc1aa5f247ff7824c9896c5cd9a927a60..f99ad43c7fea169c012295229402ee6351696d1b 100644 (file)
@@ -388,19 +388,6 @@ X86System::~X86System()
     delete smbiosTable;
 }
 
-void
-X86System::serialize(std::ostream &os)
-{
-    System::serialize(os);
-}
-
-
-void
-X86System::unserialize(Checkpoint *cp, const std::string &section)
-{
-    System::unserialize(cp,section);
-}
-
 X86System *
 X86SystemParams::create()
 {
index 0b5da3145f4319298b1beb6f57469c6e32da9dd9..998a69cd74041891c19df5164d59cd96e0c39741 100644 (file)
@@ -74,8 +74,6 @@ class X86System : public System
  * Serialization stuff
  */
   public:
-    void serialize(std::ostream &os);
-    void unserialize(Checkpoint *cp, const std::string &section);
 
     void initState();
 
index 4871ac824916059325c63945b72d95c2cb71c2de..65eb0e3eb2c574a60bc807f1d0ebea5d62fa0687 100644 (file)
@@ -341,6 +341,7 @@ System::serialize(ostream &os)
         kernelSymtab->serialize("kernel_symtab", os);
     SERIALIZE_SCALAR(pagePtr);
     SERIALIZE_SCALAR(nextPID);
+    serializeSymtab(os);
 }
 
 
@@ -351,6 +352,7 @@ System::unserialize(Checkpoint *cp, const string &section)
         kernelSymtab->unserialize("kernel_symtab", cp, section);
     UNSERIALIZE_SCALAR(pagePtr);
     UNSERIALIZE_SCALAR(nextPID);
+    unserializeSymtab(cp, section);
 }
 
 void
index 4348ecaca4a699f98703632bf6f6ab77fdf5cba5..2393c83f2719b536470ff5cdd1ba384e0ae12d82 100644 (file)
@@ -403,6 +403,26 @@ class System : public MemObject
     // For futex system call
     std::map<uint64_t, std::list<ThreadContext *> * > futexMap;
 
+  protected:
+
+    /**
+     * If needed, serialize additional symbol table entries for a
+     * specific subclass of this sytem. Currently this is used by
+     * Alpha and MIPS.
+     *
+     * @param os stream to serialize to
+     */
+    virtual void serializeSymtab(std::ostream &os) {}
+
+    /**
+     * If needed, unserialize additional symbol table entries for a
+     * specific subclass of this system.
+     *
+     * @param cp checkpoint to unserialize from
+     * @param section relevant section in the checkpoint
+     */
+    virtual void unserializeSymtab(Checkpoint *cp,
+                                   const std::string &section) {}
 
 };