]> Pileus Git - ~andy/linux/commitdiff
KVM: x86 emulator: convert bsf/bsr instructions to emulate_2op_SrcV_nobyte()
authorJoerg Roedel <joerg.roedel@amd.com>
Mon, 7 May 2012 10:12:25 +0000 (12:12 +0200)
committerAvi Kivity <avi@redhat.com>
Mon, 14 May 2012 08:32:38 +0000 (11:32 +0300)
The instruction emulation for bsrw is broken in KVM because
the code always uses bsr with 32 or 64 bit operand size for
emulation. Fix that by using emulate_2op_SrcV_nobyte() macro
to use guest operand size for emulation.

Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
arch/x86/kvm/emulate.c

index 7fd25763b0e0334135320cb270de5b79202c51ce..f95d242ee9f72a8f30bf912cf81dd172745dadd9 100644 (file)
@@ -3133,35 +3133,13 @@ static int em_btc(struct x86_emulate_ctxt *ctxt)
 
 static int em_bsf(struct x86_emulate_ctxt *ctxt)
 {
-       u8 zf;
-
-       __asm__ ("bsf %2, %0; setz %1"
-                : "=r"(ctxt->dst.val), "=q"(zf)
-                : "r"(ctxt->src.val));
-
-       ctxt->eflags &= ~X86_EFLAGS_ZF;
-       if (zf) {
-               ctxt->eflags |= X86_EFLAGS_ZF;
-               /* Disable writeback. */
-               ctxt->dst.type = OP_NONE;
-       }
+       emulate_2op_SrcV_nobyte(ctxt, "bsf");
        return X86EMUL_CONTINUE;
 }
 
 static int em_bsr(struct x86_emulate_ctxt *ctxt)
 {
-       u8 zf;
-
-       __asm__ ("bsr %2, %0; setz %1"
-                : "=r"(ctxt->dst.val), "=q"(zf)
-                : "r"(ctxt->src.val));
-
-       ctxt->eflags &= ~X86_EFLAGS_ZF;
-       if (zf) {
-               ctxt->eflags |= X86_EFLAGS_ZF;
-               /* Disable writeback. */
-               ctxt->dst.type = OP_NONE;
-       }
+       emulate_2op_SrcV_nobyte(ctxt, "bsr");
        return X86EMUL_CONTINUE;
 }