diff options
author | Joerg Roedel <joerg.roedel@amd.com> | 2012-05-07 06:12:25 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2012-05-14 04:32:38 -0400 |
commit | d54e4237bcbb400fda11c902fd538aa0b4805720 (patch) | |
tree | f2b89d6c56fc585fa4b0edacb109889f1ed64d9f /arch/x86 | |
parent | 5f3fbc342f408199e5cbb4b3dc220569147a99a7 (diff) |
KVM: x86 emulator: convert bsf/bsr instructions to emulate_2op_SrcV_nobyte()
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>
Diffstat (limited to 'arch/x86')
-rw-r--r-- | arch/x86/kvm/emulate.c | 26 |
1 files changed, 2 insertions, 24 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 7fd25763b0e0..f95d242ee9f7 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
@@ -3133,35 +3133,13 @@ static int em_btc(struct x86_emulate_ctxt *ctxt) | |||
3133 | 3133 | ||
3134 | static int em_bsf(struct x86_emulate_ctxt *ctxt) | 3134 | static int em_bsf(struct x86_emulate_ctxt *ctxt) |
3135 | { | 3135 | { |
3136 | u8 zf; | 3136 | emulate_2op_SrcV_nobyte(ctxt, "bsf"); |
3137 | |||
3138 | __asm__ ("bsf %2, %0; setz %1" | ||
3139 | : "=r"(ctxt->dst.val), "=q"(zf) | ||
3140 | : "r"(ctxt->src.val)); | ||
3141 | |||
3142 | ctxt->eflags &= ~X86_EFLAGS_ZF; | ||
3143 | if (zf) { | ||
3144 | ctxt->eflags |= X86_EFLAGS_ZF; | ||
3145 | /* Disable writeback. */ | ||
3146 | ctxt->dst.type = OP_NONE; | ||
3147 | } | ||
3148 | return X86EMUL_CONTINUE; | 3137 | return X86EMUL_CONTINUE; |
3149 | } | 3138 | } |
3150 | 3139 | ||
3151 | static int em_bsr(struct x86_emulate_ctxt *ctxt) | 3140 | static int em_bsr(struct x86_emulate_ctxt *ctxt) |
3152 | { | 3141 | { |
3153 | u8 zf; | 3142 | emulate_2op_SrcV_nobyte(ctxt, "bsr"); |
3154 | |||
3155 | __asm__ ("bsr %2, %0; setz %1" | ||
3156 | : "=r"(ctxt->dst.val), "=q"(zf) | ||
3157 | : "r"(ctxt->src.val)); | ||
3158 | |||
3159 | ctxt->eflags &= ~X86_EFLAGS_ZF; | ||
3160 | if (zf) { | ||
3161 | ctxt->eflags |= X86_EFLAGS_ZF; | ||
3162 | /* Disable writeback. */ | ||
3163 | ctxt->dst.type = OP_NONE; | ||
3164 | } | ||
3165 | return X86EMUL_CONTINUE; | 3143 | return X86EMUL_CONTINUE; |
3166 | } | 3144 | } |
3167 | 3145 | ||