diff options
author | Wei Yongjun <yjwei@cn.fujitsu.com> | 2010-08-18 04:38:21 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2010-10-24 04:51:11 -0400 |
commit | f2f31845341d22e4f20438b05e83d58e71b723b5 (patch) | |
tree | 8cfef24561e4d92786c4a1d9fffc9f1e14a12b76 /arch | |
parent | e8b6fa70e3545f0afd63434dbd0c5220d47205f6 (diff) |
KVM: x86 emulator: add LOOP/LOOPcc instruction emulation
Add LOOP/LOOPcc instruction emulation (opcode 0xe0~0xe2).
Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/kvm/emulate.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 312dda57f93b..2f816edfe31e 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
@@ -2330,7 +2330,7 @@ static struct opcode opcode_table[256] = { | |||
2330 | /* 0xD8 - 0xDF */ | 2330 | /* 0xD8 - 0xDF */ |
2331 | N, N, N, N, N, N, N, N, | 2331 | N, N, N, N, N, N, N, N, |
2332 | /* 0xE0 - 0xE7 */ | 2332 | /* 0xE0 - 0xE7 */ |
2333 | N, N, N, N, | 2333 | X3(D(SrcImmByte)), N, |
2334 | D(ByteOp | SrcImmUByte | DstAcc), D(SrcImmUByte | DstAcc), | 2334 | D(ByteOp | SrcImmUByte | DstAcc), D(SrcImmUByte | DstAcc), |
2335 | D(ByteOp | SrcAcc | DstImmUByte), D(SrcAcc | DstImmUByte), | 2335 | D(ByteOp | SrcAcc | DstImmUByte), D(SrcAcc | DstImmUByte), |
2336 | /* 0xE8 - 0xEF */ | 2336 | /* 0xE8 - 0xEF */ |
@@ -3084,6 +3084,12 @@ special_insn: | |||
3084 | c->src.val = c->regs[VCPU_REGS_RCX]; | 3084 | c->src.val = c->regs[VCPU_REGS_RCX]; |
3085 | emulate_grp2(ctxt); | 3085 | emulate_grp2(ctxt); |
3086 | break; | 3086 | break; |
3087 | case 0xe0 ... 0xe2: /* loop/loopz/loopnz */ | ||
3088 | register_address_increment(c, &c->regs[VCPU_REGS_RCX], -1); | ||
3089 | if (address_mask(c, c->regs[VCPU_REGS_RCX]) != 0 && | ||
3090 | (c->b == 0xe2 || test_cc(c->b ^ 0x5, ctxt->eflags))) | ||
3091 | jmp_rel(c, c->src.val); | ||
3092 | break; | ||
3087 | case 0xe4: /* inb */ | 3093 | case 0xe4: /* inb */ |
3088 | case 0xe5: /* in */ | 3094 | case 0xe5: /* in */ |
3089 | goto do_io_in; | 3095 | goto do_io_in; |