summaryrefslogtreecommitdiff
path: root/src/cpu/kvm/base.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/cpu/kvm/base.cc')
-rw-r--r--src/cpu/kvm/base.cc18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/cpu/kvm/base.cc b/src/cpu/kvm/base.cc
index abb3451f6..827cd5581 100644
--- a/src/cpu/kvm/base.cc
+++ b/src/cpu/kvm/base.cc
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012 ARM Limited
+ * Copyright (c) 2012, 2015 ARM Limited
* All rights reserved
*
* The license below extends only to copyright in the software and shall
@@ -533,15 +533,23 @@ BaseKvmCPU::tick()
case RunningServiceCompletion:
case Running: {
- EventQueue *q = curEventQueue();
- Tick ticksToExecute(q->nextTick() - curTick());
+ const uint64_t nextInstEvent(
+ !comInstEventQueue[0]->empty() ?
+ comInstEventQueue[0]->nextTick() : UINT64_MAX);
+ // Enter into KVM and complete pending IO instructions if we
+ // have an instruction event pending.
+ const Tick ticksToExecute(
+ nextInstEvent > ctrInsts ?
+ curEventQueue()->nextTick() - curTick() : 0);
// We might need to update the KVM state.
syncKvmState();
// Setup any pending instruction count breakpoints using
- // PerfEvent.
- setupInstStop();
+ // PerfEvent if we are going to execute more than just an IO
+ // completion.
+ if (ticksToExecute > 0)
+ setupInstStop();
DPRINTF(KvmRun, "Entering KVM...\n");
if (drainManager) {