diff -r 3234b429fe04 -r 74c2b67b2684 src/cpu/kvm/BaseKvmCPU.py --- a/src/cpu/kvm/BaseKvmCPU.py Wed Mar 16 17:20:00 2016 +0000 +++ b/src/cpu/kvm/BaseKvmCPU.py Wed Mar 16 17:43:46 2016 +0000 @@ -71,6 +71,8 @@ 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 -r 3234b429fe04 -r 74c2b67b2684 src/cpu/kvm/base.hh --- a/src/cpu/kvm/base.hh Wed Mar 16 17:20:00 2016 +0000 +++ b/src/cpu/kvm/base.hh Wed Mar 16 17:43:46 2016 +0000 @@ -575,6 +575,12 @@ 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(). */ diff -r 3234b429fe04 -r 74c2b67b2684 src/cpu/kvm/base.cc --- a/src/cpu/kvm/base.cc Wed Mar 16 17:20:00 2016 +0000 +++ b/src/cpu/kvm/base.cc Wed Mar 16 17:43:46 2016 +0000 @@ -69,6 +69,7 @@ _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 @@ nextInstEvent > ctrInsts ? curEventQueue()->nextTick() - curTick() : 0); + if (alwaysSyncTC) + threadContextDirty = true; + // We might need to update the KVM state. syncKvmState(); @@ -588,6 +592,9 @@ // 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) {