kvm: Add an option to force context sync on kvm entry/exit
authorAndreas Sandberg <andreas.sandberg@arm.com>
Wed, 30 Mar 2016 09:52:25 +0000 (10:52 +0100)
committerAndreas Sandberg <andreas.sandberg@arm.com>
Wed, 30 Mar 2016 09:52:25 +0000 (10:52 +0100)
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>
src/cpu/kvm/BaseKvmCPU.py
src/cpu/kvm/base.cc
src/cpu/kvm/base.hh

index b7c964669d9569c459eb3768896023ffee2caf0a..34ab752de170de17f24764e01eac50537b4bd023 100644 (file)
@@ -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")
index ea0f494e3c9e9ec87822d2d0bb693bfdfeeeb7fc..bf4d686030fd9cc1ea722d4249914b659a857701 100644 (file)
@@ -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) {
index dd27328be54b63b9c9783cbb6882508df99de27b..7ff0cab5c948447a8adf4076c0f55238405b94ec 100644 (file)
@@ -574,6 +574,12 @@ class BaseKvmCPU : public BaseCPU
     /** Unused dummy port for the instruction interface */
     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().