diff options
author | Wei Yongjun <yjwei@cn.fujitsu.com> | 2010-08-10 01:48:22 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2010-10-24 04:51:04 -0400 |
commit | d9574a25afc3cd7ccd6a0bc05252bb84189e4021 (patch) | |
tree | dbfc28503e56516ed19bafda9e581359ef49d1e4 /arch/x86/kvm/emulate.c | |
parent | 8c5eee30a942cb3154f14f12407755ed7da74bbc (diff) |
KVM: x86 emulator: add bsf/bsr instruction emulation
Add bsf/bsr instruction emulation (opcode 0x0f 0xbc~0xbd)
Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/x86/kvm/emulate.c')
-rw-r--r-- | arch/x86/kvm/emulate.c | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 8617c344405d..f6b124fcc3fd 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
@@ -2379,8 +2379,8 @@ static struct opcode twobyte_table[256] = { | |||
2379 | /* 0xB8 - 0xBF */ | 2379 | /* 0xB8 - 0xBF */ |
2380 | N, N, | 2380 | N, N, |
2381 | G(BitOp, group8), D(DstMem | SrcReg | ModRM | BitOp | Lock), | 2381 | G(BitOp, group8), D(DstMem | SrcReg | ModRM | BitOp | Lock), |
2382 | N, N, D(ByteOp | DstReg | SrcMem | ModRM | Mov), | 2382 | D(DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM), |
2383 | D(DstReg | SrcMem16 | ModRM | Mov), | 2383 | D(ByteOp | DstReg | SrcMem | ModRM | Mov), D(DstReg | SrcMem16 | ModRM | Mov), |
2384 | /* 0xC0 - 0xCF */ | 2384 | /* 0xC0 - 0xCF */ |
2385 | N, N, N, D(DstMem | SrcReg | ModRM | Mov), | 2385 | N, N, N, D(DstMem | SrcReg | ModRM | Mov), |
2386 | N, N, N, GD(0, &group9), | 2386 | N, N, N, GD(0, &group9), |
@@ -3511,6 +3511,30 @@ twobyte_insn: | |||
3511 | btc: /* btc */ | 3511 | btc: /* btc */ |
3512 | emulate_2op_SrcV_nobyte("btc", c->src, c->dst, ctxt->eflags); | 3512 | emulate_2op_SrcV_nobyte("btc", c->src, c->dst, ctxt->eflags); |
3513 | break; | 3513 | break; |
3514 | case 0xbc: { /* bsf */ | ||
3515 | u8 zf; | ||
3516 | __asm__ ("bsf %2, %0; setz %1" | ||
3517 | : "=r"(c->dst.val), "=q"(zf) | ||
3518 | : "r"(c->src.val)); | ||
3519 | ctxt->eflags &= ~X86_EFLAGS_ZF; | ||
3520 | if (zf) { | ||
3521 | ctxt->eflags |= X86_EFLAGS_ZF; | ||
3522 | c->dst.type = OP_NONE; /* Disable writeback. */ | ||
3523 | } | ||
3524 | break; | ||
3525 | } | ||
3526 | case 0xbd: { /* bsr */ | ||
3527 | u8 zf; | ||
3528 | __asm__ ("bsr %2, %0; setz %1" | ||
3529 | : "=r"(c->dst.val), "=q"(zf) | ||
3530 | : "r"(c->src.val)); | ||
3531 | ctxt->eflags &= ~X86_EFLAGS_ZF; | ||
3532 | if (zf) { | ||
3533 | ctxt->eflags |= X86_EFLAGS_ZF; | ||
3534 | c->dst.type = OP_NONE; /* Disable writeback. */ | ||
3535 | } | ||
3536 | break; | ||
3537 | } | ||
3514 | case 0xbe ... 0xbf: /* movsx */ | 3538 | case 0xbe ... 0xbf: /* movsx */ |
3515 | c->dst.bytes = c->op_bytes; | 3539 | c->dst.bytes = c->op_bytes; |
3516 | c->dst.val = (c->d & ByteOp) ? (s8) c->src.val : | 3540 | c->dst.val = (c->d & ByteOp) ? (s8) c->src.val : |