summaryrefslogtreecommitdiff
path: root/src/cpu/kvm/base.cc
diff options
context:
space:
mode:
authorAndreas Sandberg <andreas.sandberg@arm.com>2016-03-30 10:52:25 +0100
committerAndreas Sandberg <andreas.sandberg@arm.com>2016-03-30 10:52:25 +0100
commita3efb6bd1d0d83297b5b412badc0b7db98b7be1e (patch)
tree424147084794cefe47a22b53758bfb538d1bc16e /src/cpu/kvm/base.cc
parentd4eb354e30171c8c1d65c7158eb05369be6c5e2e (diff)
downloadgem5-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/kvm/base.cc')
-rw-r--r--src/cpu/kvm/base.cc7
1 files changed, 7 insertions, 0 deletions
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) {