diff options
author | Steve Reinhardt <steve.reinhardt@amd.com> | 2010-08-17 05:17:06 -0700 |
---|---|---|
committer | Steve Reinhardt <steve.reinhardt@amd.com> | 2010-08-17 05:17:06 -0700 |
commit | f064aa306061ecc468efd8cf148ed08398ca824d (patch) | |
tree | d78548dc953bb621d9154249d07022dabf2f6e2c /src/arch/x86 | |
parent | 2519d116c9171ed4bf220d5049f244b333aa0842 (diff) | |
download | gem5-f064aa306061ecc468efd8cf148ed08398ca824d.tar.xz |
sim: revamp unserialization procedure
Replace direct call to unserialize() on each SimObject with a pair of
calls for better control over initialization in both ckpt and non-ckpt
cases.
If restoring from a checkpoint, loadState(ckpt) is called on each
SimObject. The default implementation simply calls unserialize() if
there is a corresponding checkpoint section, so we get backward
compatibility for existing objects. However, objects can override
loadState() to get other behaviors, e.g., doing other programmed
initializations after unserialize(), or complaining if no checkpoint
section is found. (Note that the default warning for a missing
checkpoint section is now gone.)
If not restoring from a checkpoint, we call the new initState() method
on each SimObject instead. This provides a hook for state
initializations that are only required when *not* restoring from a
checkpoint.
Given this new framework, do some cleanup of LiveProcess subclasses
and X86System, which were (in some cases) emulating initState()
behavior in startup via a local flag or (in other cases) erroneously
doing initializations in startup() that clobbered state loaded earlier
by unserialize().
Diffstat (limited to 'src/arch/x86')
-rw-r--r-- | src/arch/x86/linux/system.cc | 4 | ||||
-rw-r--r-- | src/arch/x86/linux/system.hh | 2 | ||||
-rw-r--r-- | src/arch/x86/process.cc | 14 | ||||
-rw-r--r-- | src/arch/x86/process.hh | 4 | ||||
-rw-r--r-- | src/arch/x86/system.cc | 5 | ||||
-rw-r--r-- | src/arch/x86/system.hh | 2 |
6 files changed, 13 insertions, 18 deletions
diff --git a/src/arch/x86/linux/system.cc b/src/arch/x86/linux/system.cc index 4ae6d0ca4..1a113d365 100644 --- a/src/arch/x86/linux/system.cc +++ b/src/arch/x86/linux/system.cc @@ -59,9 +59,9 @@ LinuxX86System::~LinuxX86System() } void -LinuxX86System::startup() +LinuxX86System::initState() { - X86System::startup(); + X86System::initState(); // The location of the real mode data structure. const Addr realModeData = 0x90200; diff --git a/src/arch/x86/linux/system.hh b/src/arch/x86/linux/system.hh index e3c52ae50..ae7e93f3d 100644 --- a/src/arch/x86/linux/system.hh +++ b/src/arch/x86/linux/system.hh @@ -58,7 +58,7 @@ class LinuxX86System : public X86System LinuxX86System(Params *p); ~LinuxX86System(); - void startup(); + void initState(); }; #endif diff --git a/src/arch/x86/process.cc b/src/arch/x86/process.cc index 2a2d43d3b..02cd45478 100644 --- a/src/arch/x86/process.cc +++ b/src/arch/x86/process.cc @@ -157,12 +157,9 @@ X86LiveProcess::getDesc(int callnum) } void -X86_64LiveProcess::startup() +X86_64LiveProcess::initState() { - LiveProcess::startup(); - - if (checkpointRestored) - return; + X86LiveProcess::initState(); argsInit(sizeof(uint64_t), VMPageSize); @@ -255,12 +252,9 @@ X86_64LiveProcess::startup() } void -I386LiveProcess::startup() +I386LiveProcess::initState() { - LiveProcess::startup(); - - if (checkpointRestored) - return; + X86LiveProcess::initState(); argsInit(sizeof(uint32_t), VMPageSize); diff --git a/src/arch/x86/process.hh b/src/arch/x86/process.hh index 8063898d7..34275b2d3 100644 --- a/src/arch/x86/process.hh +++ b/src/arch/x86/process.hh @@ -99,7 +99,7 @@ namespace X86ISA public: void argsInit(int intSize, int pageSize); - void startup(); + void initState(); X86ISA::IntReg getSyscallArg(ThreadContext *tc, int &i); void setSyscallArg(ThreadContext *tc, int i, X86ISA::IntReg val); @@ -123,7 +123,7 @@ namespace X86ISA public: void argsInit(int intSize, int pageSize); - void startup(); + void initState(); void syscall(int64_t callnum, ThreadContext *tc); X86ISA::IntReg getSyscallArg(ThreadContext *tc, int &i); diff --git a/src/arch/x86/system.cc b/src/arch/x86/system.cc index 01416e544..46d17cdb3 100644 --- a/src/arch/x86/system.cc +++ b/src/arch/x86/system.cc @@ -109,9 +109,10 @@ installSegDesc(ThreadContext *tc, SegmentRegIndex seg, } void -X86System::startup() +X86System::initState() { - System::startup(); + System::initState(); + ThreadContext *tc = threadContexts[0]; // This is the boot strap processor (BSP). Initialize it to look like // the boot loader has just turned control over to the 64 bit OS. We diff --git a/src/arch/x86/system.hh b/src/arch/x86/system.hh index 4a61193e6..0b5da3145 100644 --- a/src/arch/x86/system.hh +++ b/src/arch/x86/system.hh @@ -77,7 +77,7 @@ class X86System : public System void serialize(std::ostream &os); void unserialize(Checkpoint *cp, const std::string §ion); - void startup(); + void initState(); protected: |