diff options
author | Andreas Sandberg <andreas.sandberg@arm.com> | 2016-03-30 10:52:25 +0100 |
---|---|---|
committer | Andreas Sandberg <andreas.sandberg@arm.com> | 2016-03-30 10:52:25 +0100 |
commit | a3efb6bd1d0d83297b5b412badc0b7db98b7be1e (patch) | |
tree | 424147084794cefe47a22b53758bfb538d1bc16e /src/cpu | |
parent | d4eb354e30171c8c1d65c7158eb05369be6c5e2e (diff) | |
download | gem5-a3efb6bd1d0d83297b5b412badc0b7db98b7be1e.tar.xz |
kvm: Add an option to force context sync on kvm entry/exit
This changeset adds an option to force the kvm-based CPUs to always
synchronize the gem5 thread context representation on entry/exit into
the kernel. This is very useful for debugging. Unfortunately, it is
also the only way to get reliable register contents when using remote
gdb functionality. The long-term solution for the latter would be to
implement a kvm-specific thread context.
Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-by: Curtis Dunham <curtis.dunham@arm.com>
Reviewed-by: Alexandru Dutu <alexandru.dutu@amd.com>
Diffstat (limited to 'src/cpu')
-rw-r--r-- | src/cpu/kvm/BaseKvmCPU.py | 2 | ||||
-rw-r--r-- | src/cpu/kvm/base.cc | 7 | ||||
-rw-r--r-- | src/cpu/kvm/base.hh | 6 |
3 files changed, 15 insertions, 0 deletions
diff --git a/src/cpu/kvm/BaseKvmCPU.py b/src/cpu/kvm/BaseKvmCPU.py index b7c964669..34ab752de 100644 --- a/src/cpu/kvm/BaseKvmCPU.py +++ b/src/cpu/kvm/BaseKvmCPU.py @@ -71,6 +71,8 @@ class BaseKvmCPU(BaseCPU): kvmVM = Param.KvmVM(Parent.any, 'KVM VM (i.e., shared memory domain)') useCoalescedMMIO = Param.Bool(False, "Use coalesced MMIO (EXPERIMENTAL)") usePerfOverflow = Param.Bool(False, "Use perf event overflow counters (EXPERIMENTAL)") + alwaysSyncTC = Param.Bool(False, + "Always sync thread contexts on entry/exit") hostFreq = Param.Clock("2GHz", "Host clock frequency") hostFactor = Param.Float(1.0, "Cycle scale factor") diff --git a/src/cpu/kvm/base.cc b/src/cpu/kvm/base.cc index ea0f494e3..bf4d68603 100644 --- a/src/cpu/kvm/base.cc +++ b/src/cpu/kvm/base.cc @@ -69,6 +69,7 @@ BaseKvmCPU::BaseKvmCPU(BaseKvmCPUParams *params) _status(Idle), dataPort(name() + ".dcache_port", this), instPort(name() + ".icache_port", this), + alwaysSyncTC(params->alwaysSyncTC), threadContextDirty(true), kvmStateDirty(false), vcpuID(vm.allocVCPUID()), vcpuFD(-1), vcpuMMapSize(0), @@ -557,6 +558,9 @@ BaseKvmCPU::tick() nextInstEvent > ctrInsts ? curEventQueue()->nextTick() - curTick() : 0); + if (alwaysSyncTC) + threadContextDirty = true; + // We might need to update the KVM state. syncKvmState(); @@ -588,6 +592,9 @@ BaseKvmCPU::tick() // dirty with respect to the cached thread context. kvmStateDirty = true; + if (alwaysSyncTC) + syncThreadContext(); + // Enter into the RunningService state unless the // simulation was stopped by a timer. if (_kvmRun->exit_reason != KVM_EXIT_INTR) { diff --git a/src/cpu/kvm/base.hh b/src/cpu/kvm/base.hh index dd27328be..7ff0cab5c 100644 --- a/src/cpu/kvm/base.hh +++ b/src/cpu/kvm/base.hh @@ -575,6 +575,12 @@ class BaseKvmCPU : public BaseCPU KVMCpuPort instPort; /** + * Be conservative and always synchronize the thread context on + * KVM entry/exit. + */ + const bool alwaysSyncTC; + + /** * Is the gem5 context dirty? Set to true to force an update of * the KVM vCPU state upon the next call to kvmRun(). */ |