Commit caa8a168 authored by Avi Kivity's avatar Avi Kivity

KVM: x86 emulator: disable writeback for TEST

The TEST instruction doesn't write its destination operand.  This
could cause problems if an MMIO register was accessed using the TEST
instruction.  Recently Windows XP was observed to use TEST against
the APIC ICR; this can cause spurious IPIs.
Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
Signed-off-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
parent c61fa9d6
...@@ -1670,6 +1670,8 @@ static int em_grp3(struct x86_emulate_ctxt *ctxt) ...@@ -1670,6 +1670,8 @@ static int em_grp3(struct x86_emulate_ctxt *ctxt)
switch (ctxt->modrm_reg) { switch (ctxt->modrm_reg) {
case 0 ... 1: /* test */ case 0 ... 1: /* test */
emulate_2op_SrcV(ctxt, "test"); emulate_2op_SrcV(ctxt, "test");
/* Disable writeback. */
ctxt->dst.type = OP_NONE;
break; break;
case 2: /* not */ case 2: /* not */
ctxt->dst.val = ~ctxt->dst.val; ctxt->dst.val = ~ctxt->dst.val;
...@@ -2513,6 +2515,8 @@ static int em_cmp(struct x86_emulate_ctxt *ctxt) ...@@ -2513,6 +2515,8 @@ static int em_cmp(struct x86_emulate_ctxt *ctxt)
static int em_test(struct x86_emulate_ctxt *ctxt) static int em_test(struct x86_emulate_ctxt *ctxt)
{ {
emulate_2op_SrcV(ctxt, "test"); emulate_2op_SrcV(ctxt, "test");
/* Disable writeback. */
ctxt->dst.type = OP_NONE;
return X86EMUL_CONTINUE; return X86EMUL_CONTINUE;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment