KVM: x86 emulator: disable writeback for TEST
authorAvi Kivity <avi@redhat.com>
Sun, 11 Sep 2011 08:23:02 +0000 (11:23 +0300)
committerAvi Kivity <avi@redhat.com>
Sun, 25 Sep 2011 16:52:40 +0000 (19:52 +0300)
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: Avi Kivity <avi@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
arch/x86/kvm/emulate.c

index e10fd3732d10ad42c7eb35172ffa683181067f3b..af06539369b4ff8d257207a0af97fd2772a2d7a0 100644 (file)
@@ -1670,6 +1670,8 @@ static int em_grp3(struct x86_emulate_ctxt *ctxt)
        switch (ctxt->modrm_reg) {
        case 0 ... 1:   /* test */
                emulate_2op_SrcV(ctxt, "test");
+               /* Disable writeback. */
+               ctxt->dst.type = OP_NONE;
                break;
        case 2: /* not */
                ctxt->dst.val = ~ctxt->dst.val;
@@ -2513,6 +2515,8 @@ static int em_cmp(struct x86_emulate_ctxt *ctxt)
 static int em_test(struct x86_emulate_ctxt *ctxt)
 {
        emulate_2op_SrcV(ctxt, "test");
+       /* Disable writeback. */
+       ctxt->dst.type = OP_NONE;
        return X86EMUL_CONTINUE;
 }