summaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
authorPavel Dovgalyuk <pavel.dovgaluk@ispras.ru>2017-01-24 10:17:02 +0300
committerPaolo Bonzini <pbonzini@redhat.com>2017-01-27 18:07:30 +0100
commit8094532b476754d751cd2a46958862fbaccadc24 (patch)
treec2db29b7d89ce82168438c8cc828a5d002ed3111 /hw
parent29ba0cdc1fd1300f910d150c03a0f74236083bf7 (diff)
downloadqemu-8094532b476754d751cd2a46958862fbaccadc24.tar.gz
icount: update instruction counter on apic patching
kvmvapic patches the code when some instructions are executed. E.g. mov 0xff, 0xfffe0080 is interpreted as push 0xff/call ... This patching is also followed by some side effects (changing apic and guest memory state). Therefore deterministic execution should take this operation into account. This patch decreases icount when original mov instruction is trying to execute. Therefore patching becomes deterministic and can be replayed correctly. Signed-off-by: Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru> Message-Id: <20170124071702.4572.17294.stgit@PASHA-ISP> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'hw')
-rw-r--r--hw/i386/kvmvapic.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/hw/i386/kvmvapic.c b/hw/i386/kvmvapic.c
index 702e281dc8..7135633863 100644
--- a/hw/i386/kvmvapic.c
+++ b/hw/i386/kvmvapic.c
@@ -413,6 +413,12 @@ static void patch_instruction(VAPICROMState *s, X86CPU *cpu, target_ulong ip)
if (!kvm_enabled()) {
cpu_get_tb_cpu_state(env, &current_pc, &current_cs_base,
&current_flags);
+ /* Account this instruction, because we will exit the tb.
+ This is the first instruction in the block. Therefore
+ there is no need in restoring CPU state. */
+ if (use_icount) {
+ --cs->icount_decr.u16.low;
+ }
}
pause_all_vcpus();