blob: 0fd33f733e6013da2c53c8085ac4c61676231888 [file] [log] [blame] [edit]
# 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 upgrader(cpt):
isa = cpt.get("root", "isa", fallback="")
if isa == "":
return
isa_fields = {
"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 = f"{re_cpu_match.group(1)}.isa"
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)
legacy_version = 4