arch: Move the ISA object to a separate section
After making the ISA an independent SimObject, it is serialized automatically by the Python world. Previously, this just resulted in an empty ISA section. This patch moves the contents of the ISA to that section and removes the explicit ISA serialization from the thread contexts, which makes it behave like a normal SimObject during serialization. Note: This patch breaks checkpoint backwards compatibility! Use the cpt_upgrader.py utility to upgrade old checkpoints to the new format.
This commit is contained in:
parent
7eb0fb8b6e
commit
17b47d35e1
12 changed files with 84 additions and 49 deletions
|
@ -53,7 +53,7 @@ ISA::params() const
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ISA::serialize(EventManager *em, std::ostream &os)
|
ISA::serialize(std::ostream &os)
|
||||||
{
|
{
|
||||||
SERIALIZE_SCALAR(fpcr);
|
SERIALIZE_SCALAR(fpcr);
|
||||||
SERIALIZE_SCALAR(uniq);
|
SERIALIZE_SCALAR(uniq);
|
||||||
|
@ -63,7 +63,7 @@ ISA::serialize(EventManager *em, std::ostream &os)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ISA::unserialize(EventManager *em, Checkpoint *cp, const std::string §ion)
|
ISA::unserialize(Checkpoint *cp, const std::string §ion)
|
||||||
{
|
{
|
||||||
UNSERIALIZE_SCALAR(fpcr);
|
UNSERIALIZE_SCALAR(fpcr);
|
||||||
UNSERIALIZE_SCALAR(uniq);
|
UNSERIALIZE_SCALAR(uniq);
|
||||||
|
|
|
@ -88,9 +88,8 @@ namespace AlphaISA
|
||||||
memset(ipr, 0, sizeof(ipr));
|
memset(ipr, 0, sizeof(ipr));
|
||||||
}
|
}
|
||||||
|
|
||||||
void serialize(EventManager *em, std::ostream &os);
|
void serialize(std::ostream &os);
|
||||||
void unserialize(EventManager *em, Checkpoint *cp,
|
void unserialize(Checkpoint *cp, const std::string §ion);
|
||||||
const std::string §ion);
|
|
||||||
|
|
||||||
int
|
int
|
||||||
flattenIntIndex(int reg)
|
flattenIntIndex(int reg)
|
||||||
|
|
|
@ -180,13 +180,12 @@ namespace ArmISA
|
||||||
return reg;
|
return reg;
|
||||||
}
|
}
|
||||||
|
|
||||||
void serialize(EventManager *em, std::ostream &os)
|
void serialize(std::ostream &os)
|
||||||
{
|
{
|
||||||
DPRINTF(Checkpoint, "Serializing Arm Misc Registers\n");
|
DPRINTF(Checkpoint, "Serializing Arm Misc Registers\n");
|
||||||
SERIALIZE_ARRAY(miscRegs, NumMiscRegs);
|
SERIALIZE_ARRAY(miscRegs, NumMiscRegs);
|
||||||
}
|
}
|
||||||
void unserialize(EventManager *em, Checkpoint *cp,
|
void unserialize(Checkpoint *cp, const std::string §ion)
|
||||||
const std::string §ion)
|
|
||||||
{
|
{
|
||||||
DPRINTF(Checkpoint, "Unserializing Arm Misc Registers\n");
|
DPRINTF(Checkpoint, "Unserializing Arm Misc Registers\n");
|
||||||
UNSERIALIZE_ARRAY(miscRegs, NumMiscRegs);
|
UNSERIALIZE_ARRAY(miscRegs, NumMiscRegs);
|
||||||
|
|
|
@ -172,12 +172,6 @@ namespace MipsISA
|
||||||
{
|
{
|
||||||
return reg;
|
return reg;
|
||||||
}
|
}
|
||||||
|
|
||||||
void serialize(EventManager *em, std::ostream &os)
|
|
||||||
{}
|
|
||||||
void unserialize(EventManager *em, Checkpoint *cp,
|
|
||||||
const std::string §ion)
|
|
||||||
{}
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -98,16 +98,6 @@ class ISA : public SimObject
|
||||||
return reg;
|
return reg;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
serialize(EventManager *em, std::ostream &os)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
unserialize(EventManager *em, Checkpoint *cp, const std::string §ion)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
const Params *params() const;
|
const Params *params() const;
|
||||||
|
|
||||||
ISA(Params *p);
|
ISA(Params *p);
|
||||||
|
|
|
@ -638,7 +638,7 @@ ISA::setMiscReg(int miscReg, MiscReg val, ThreadContext * tc)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ISA::serialize(EventManager *em, std::ostream &os)
|
ISA::serialize(std::ostream &os)
|
||||||
{
|
{
|
||||||
SERIALIZE_SCALAR(asi);
|
SERIALIZE_SCALAR(asi);
|
||||||
SERIALIZE_SCALAR(tick);
|
SERIALIZE_SCALAR(tick);
|
||||||
|
@ -714,7 +714,7 @@ ISA::serialize(EventManager *em, std::ostream &os)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ISA::unserialize(EventManager *em, Checkpoint *cp, const std::string §ion)
|
ISA::unserialize(Checkpoint *cp, const std::string §ion)
|
||||||
{
|
{
|
||||||
UNSERIALIZE_SCALAR(asi);
|
UNSERIALIZE_SCALAR(asi);
|
||||||
UNSERIALIZE_SCALAR(tick);
|
UNSERIALIZE_SCALAR(tick);
|
||||||
|
@ -781,15 +781,15 @@ ISA::unserialize(EventManager *em, Checkpoint *cp, const std::string §ion)
|
||||||
|
|
||||||
if (tick_cmp) {
|
if (tick_cmp) {
|
||||||
tickCompare = new TickCompareEvent(this, tc);
|
tickCompare = new TickCompareEvent(this, tc);
|
||||||
em->schedule(tickCompare, tick_cmp);
|
schedule(tickCompare, tick_cmp);
|
||||||
}
|
}
|
||||||
if (stick_cmp) {
|
if (stick_cmp) {
|
||||||
sTickCompare = new STickCompareEvent(this, tc);
|
sTickCompare = new STickCompareEvent(this, tc);
|
||||||
em->schedule(sTickCompare, stick_cmp);
|
schedule(sTickCompare, stick_cmp);
|
||||||
}
|
}
|
||||||
if (hstick_cmp) {
|
if (hstick_cmp) {
|
||||||
hSTickCompare = new HSTickCompareEvent(this, tc);
|
hSTickCompare = new HSTickCompareEvent(this, tc);
|
||||||
em->schedule(hSTickCompare, hstick_cmp);
|
schedule(hSTickCompare, hstick_cmp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -167,10 +167,9 @@ class ISA : public SimObject
|
||||||
|
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
void serialize(EventManager *em, std::ostream & os);
|
void serialize(std::ostream & os);
|
||||||
|
|
||||||
void unserialize(EventManager *em, Checkpoint *cp,
|
void unserialize(Checkpoint *cp, const std::string & section);
|
||||||
const std::string & section);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
|
|
@ -370,14 +370,13 @@ ISA::setMiscReg(int miscReg, MiscReg val, ThreadContext * tc)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ISA::serialize(EventManager *em, std::ostream & os)
|
ISA::serialize(std::ostream & os)
|
||||||
{
|
{
|
||||||
SERIALIZE_ARRAY(regVal, NumMiscRegs);
|
SERIALIZE_ARRAY(regVal, NumMiscRegs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ISA::unserialize(EventManager *em, Checkpoint * cp,
|
ISA::unserialize(Checkpoint * cp, const std::string & section)
|
||||||
const std::string & section)
|
|
||||||
{
|
{
|
||||||
UNSERIALIZE_ARRAY(regVal, NumMiscRegs);
|
UNSERIALIZE_ARRAY(regVal, NumMiscRegs);
|
||||||
updateHandyM5Reg(regVal[MISCREG_EFER],
|
updateHandyM5Reg(regVal[MISCREG_EFER],
|
||||||
|
|
|
@ -85,9 +85,8 @@ namespace X86ISA
|
||||||
return reg;
|
return reg;
|
||||||
}
|
}
|
||||||
|
|
||||||
void serialize(EventManager *em, std::ostream &os);
|
void serialize(std::ostream &os);
|
||||||
void unserialize(EventManager *em, Checkpoint *cp,
|
void unserialize(Checkpoint *cp, const std::string §ion);
|
||||||
const std::string §ion);
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -179,11 +179,6 @@ SimpleThread::serialize(ostream &os)
|
||||||
SERIALIZE_ARRAY(intRegs, TheISA::NumIntRegs);
|
SERIALIZE_ARRAY(intRegs, TheISA::NumIntRegs);
|
||||||
_pcState.serialize(os);
|
_pcState.serialize(os);
|
||||||
// thread_num and cpu_id are deterministic from the config
|
// thread_num and cpu_id are deterministic from the config
|
||||||
|
|
||||||
//
|
|
||||||
// Now must serialize all the ISA dependent state
|
|
||||||
//
|
|
||||||
isa->serialize(baseCpu, os);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -195,11 +190,6 @@ SimpleThread::unserialize(Checkpoint *cp, const std::string §ion)
|
||||||
UNSERIALIZE_ARRAY(intRegs, TheISA::NumIntRegs);
|
UNSERIALIZE_ARRAY(intRegs, TheISA::NumIntRegs);
|
||||||
_pcState.unserialize(cp, section);
|
_pcState.unserialize(cp, section);
|
||||||
// thread_num and cpu_id are deterministic from the config
|
// thread_num and cpu_id are deterministic from the config
|
||||||
|
|
||||||
//
|
|
||||||
// Now must unserialize all the ISA dependent state
|
|
||||||
//
|
|
||||||
isa->unserialize(baseCpu, cp, section);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -57,7 +57,7 @@ class SimObject;
|
||||||
* SimObject shouldn't cause the version number to increase, only changes to
|
* SimObject shouldn't cause the version number to increase, only changes to
|
||||||
* existing objects such as serializing/unserializing more state, changing sizes
|
* existing objects such as serializing/unserializing more state, changing sizes
|
||||||
* of serialized arrays, etc. */
|
* of serialized arrays, etc. */
|
||||||
static const uint64_t gem5CheckpointVersion = 0x0000000000000003;
|
static const uint64_t gem5CheckpointVersion = 0x0000000000000004;
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void paramOut(std::ostream &os, const std::string &name, const T ¶m);
|
void paramOut(std::ostream &os, const std::string &name, const T ¶m);
|
||||||
|
|
|
@ -116,11 +116,77 @@ def from_2(cpt):
|
||||||
except ConfigParser.NoOptionError:
|
except ConfigParser.NoOptionError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
# The ISA is now a separate SimObject, which means that we serialize
|
||||||
|
# it in a separate section instead of as a part of the ThreadContext.
|
||||||
|
def from_3(cpt):
|
||||||
|
isa = cpt.get('root','isa')
|
||||||
|
isa_fields = {
|
||||||
|
"alpha" : ( "fpcr", "uniq", "lock_flag", "lock_addr", "ipr" ),
|
||||||
|
"arm" : ( "miscRegs" ),
|
||||||
|
"sparc" : ( "asi", "tick", "fprs", "gsr", "softint", "tick_cmpr",
|
||||||
|
"stick", "stick_cmpr", "tpc", "tnpc", "tstate", "tt",
|
||||||
|
"tba", "pstate", "tl", "pil", "cwp", "gl", "hpstate",
|
||||||
|
"htstate", "hintp", "htba", "hstick_cmpr",
|
||||||
|
"strandStatusReg", "fsr", "priContext", "secContext",
|
||||||
|
"partId", "lsuCtrlReg", "scratchPad",
|
||||||
|
"cpu_mondo_head", "cpu_mondo_tail",
|
||||||
|
"dev_mondo_head", "dev_mondo_tail",
|
||||||
|
"res_error_head", "res_error_tail",
|
||||||
|
"nres_error_head", "nres_error_tail",
|
||||||
|
"tick_intr_sched",
|
||||||
|
"cpu", "tc_num", "tick_cmp", "stick_cmp", "hstick_cmp"),
|
||||||
|
"x86" : ( "regVal" ),
|
||||||
|
}
|
||||||
|
|
||||||
|
isa_fields = isa_fields.get(isa, [])
|
||||||
|
isa_sections = []
|
||||||
|
for sec in cpt.sections():
|
||||||
|
import re
|
||||||
|
|
||||||
|
re_cpu_match = re.match('^(.*sys.*\.cpu[^.]*)\.xc\.(.+)$', sec)
|
||||||
|
# Search for all the execution contexts
|
||||||
|
if not re_cpu_match:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if re_cpu_match.group(2) != "0":
|
||||||
|
# This shouldn't happen as we didn't support checkpointing
|
||||||
|
# of in-order and O3 CPUs.
|
||||||
|
raise ValueError("Don't know how to migrate multi-threaded CPUs "
|
||||||
|
"from version 1")
|
||||||
|
|
||||||
|
isa_section = []
|
||||||
|
for fspec in isa_fields:
|
||||||
|
for (key, value) in cpt.items(sec, raw=True):
|
||||||
|
if key in isa_fields:
|
||||||
|
isa_section.append((key, value))
|
||||||
|
|
||||||
|
name = "%s.isa" % re_cpu_match.group(1)
|
||||||
|
isa_sections.append((name, isa_section))
|
||||||
|
|
||||||
|
for (key, value) in isa_section:
|
||||||
|
cpt.remove_option(sec, key)
|
||||||
|
|
||||||
|
for (sec, options) in isa_sections:
|
||||||
|
# Some intermediate versions of gem5 have empty ISA sections
|
||||||
|
# (after we made the ISA a SimObject, but before we started to
|
||||||
|
# serialize into a separate ISA section).
|
||||||
|
if not cpt.has_section(sec):
|
||||||
|
cpt.add_section(sec)
|
||||||
|
else:
|
||||||
|
if cpt.items(sec):
|
||||||
|
raise ValueError("Unexpected populated ISA section in old "
|
||||||
|
"checkpoint")
|
||||||
|
|
||||||
|
for (key, value) in options:
|
||||||
|
cpt.set(sec, key, value)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
migrations = []
|
migrations = []
|
||||||
migrations.append(from_0)
|
migrations.append(from_0)
|
||||||
migrations.append(from_1)
|
migrations.append(from_1)
|
||||||
migrations.append(from_2)
|
migrations.append(from_2)
|
||||||
|
migrations.append(from_3)
|
||||||
|
|
||||||
verbose_print = False
|
verbose_print = False
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue