Checkpoint: Make system serialize call children

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.
This commit is contained in:
Andreas Hansson
2012-10-15 08:12:29 -04:00
parent 0c58106b6e
commit d7ad8dc608
10 changed files with 30 additions and 45 deletions

View 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);
}

View 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()
*/

View File

@@ -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()
{

View File

@@ -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

View 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);

View 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;

View 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()
{

View 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();

View 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

View 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) {}
};