From: Ian Jiang Date: Tue, 28 Jul 2020 06:41:33 +0000 (+0800) Subject: sim: Add checkpoint parameters for VMA list X-Git-Tag: v20.1.0.0~334 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d60f649819f1a793396f13a11b079b8c28e80c5d;p=gem5.git sim: Add checkpoint parameters for VMA list Add checkpoint parameters (together with corresponding serialization and unserialization) for VMA list of class MemState into a separate section named 'vmalist'. Without these VMA list parameters, a page table fault will occur when running with --restore-simpoint-checkpoint, because of an empty VMA list. For example: $ ./build/RISCV/gem5.debug --debug-flags=Exec configs/example/se.py \ -c tests/test-progs/hello/bin/riscv/linux/hello \ --cpu-type=NonCachingSimpleCPU --restore-simpoint-checkpoint \ --checkpoint-dir m5out/ -r 2 ... 2404000: system.switch_cpus: T0 : @_int_malloc+3392 : sd a5, 8(a0) \ : MemWrite : D=0x000000000001ed21 A=0x862e8 panic: Page table fault when accessing virtual address 0x862e8 ... Example checkpoint output: [system.cpu.workload.vmalist] size=3 [system.cpu.workload.vmalist.Vma0] name=stack addrRangeStart=... addrRangeEnd=... [system.cpu.workload.vmalist.Vma1] name=heap addrRangeStart=... addrRangeEnd=... [system.cpu.workload.vmalist.Vma2] ... Change-Id: Ib2fa7ad2c34fe667ce95bc4b10a1affcf60d9c1f Signed-off-by: Ian Jiang Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/31875 Reviewed-by: Daniel Carvalho Reviewed-by: Bobby R. Bruce Reviewed-by: Alexandru Duțu Maintainer: Jason Lowe-Power Tested-by: kokoro --- diff --git a/src/sim/mem_state.hh b/src/sim/mem_state.hh index 1ca80dab1..c052389c3 100644 --- a/src/sim/mem_state.hh +++ b/src/sim/mem_state.hh @@ -190,7 +190,18 @@ class MemState : public Serializable paramOut(cp, "stackMin", _stackMin); paramOut(cp, "nextThreadStackBase", _nextThreadStackBase); paramOut(cp, "mmapEnd", _mmapEnd); + + ScopedCheckpointSection sec(cp, "vmalist"); + paramOut(cp, "size", _vmaList.size()); + int count = 0; + for (auto vma : _vmaList) { + ScopedCheckpointSection sec(cp, csprintf("Vma%d", count++)); + paramOut(cp, "name", vma.getName()); + paramOut(cp, "addrRangeStart", vma.start()); + paramOut(cp, "addrRangeEnd", vma.end()); + } } + void unserialize(CheckpointIn &cp) override { @@ -201,6 +212,20 @@ class MemState : public Serializable paramIn(cp, "stackMin", _stackMin); paramIn(cp, "nextThreadStackBase", _nextThreadStackBase); paramIn(cp, "mmapEnd", _mmapEnd); + + int count; + ScopedCheckpointSection sec(cp, "vmalist"); + paramIn(cp, "size", count); + for (int i = 0; i < count; ++i) { + ScopedCheckpointSection sec(cp, csprintf("Vma%d", i)); + std::string name; + Addr start; + Addr end; + paramIn(cp, "name", name); + paramIn(cp, "addrRangeStart", start); + paramIn(cp, "addrRangeEnd", end); + _vmaList.emplace_back(AddrRange(start, end), _pageBytes, name); + } } /**