diff options
author | Avi Kivity <avi@redhat.com> | 2010-08-18 11:31:43 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2010-10-24 04:51:12 -0400 |
commit | 5c82aa29988c0160d91f75cceebd0a07d8f2406b (patch) | |
tree | 53de17b33ca061ce4ba256a48c960b18f3fa3e01 /arch | |
parent | f3a1b9f49647133e8c6eb6a68399ed8dbd61554a (diff) |
KVM: x86 emulator: implement IMUL REG, R/M (opcode 0F AF)
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/kvm/emulate.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 618386f80518..a4d2a469b4ab 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
@@ -2264,15 +2264,22 @@ static int em_ret_near_imm(struct x86_emulate_ctxt *ctxt) | |||
2264 | return X86EMUL_CONTINUE; | 2264 | return X86EMUL_CONTINUE; |
2265 | } | 2265 | } |
2266 | 2266 | ||
2267 | static int em_imul_3op(struct x86_emulate_ctxt *ctxt) | 2267 | static int em_imul(struct x86_emulate_ctxt *ctxt) |
2268 | { | 2268 | { |
2269 | struct decode_cache *c = &ctxt->decode; | 2269 | struct decode_cache *c = &ctxt->decode; |
2270 | 2270 | ||
2271 | c->dst.val = c->src2.val; | ||
2272 | emulate_2op_SrcV_nobyte("imul", c->src, c->dst, ctxt->eflags); | 2271 | emulate_2op_SrcV_nobyte("imul", c->src, c->dst, ctxt->eflags); |
2273 | return X86EMUL_CONTINUE; | 2272 | return X86EMUL_CONTINUE; |
2274 | } | 2273 | } |
2275 | 2274 | ||
2275 | static int em_imul_3op(struct x86_emulate_ctxt *ctxt) | ||
2276 | { | ||
2277 | struct decode_cache *c = &ctxt->decode; | ||
2278 | |||
2279 | c->dst.val = c->src2.val; | ||
2280 | return em_imul(ctxt); | ||
2281 | } | ||
2282 | |||
2276 | #define D(_y) { .flags = (_y) } | 2283 | #define D(_y) { .flags = (_y) } |
2277 | #define N D(0) | 2284 | #define N D(0) |
2278 | #define G(_f, _g) { .flags = ((_f) | Group), .u.group = (_g) } | 2285 | #define G(_f, _g) { .flags = ((_f) | Group), .u.group = (_g) } |
@@ -2488,7 +2495,7 @@ static struct opcode twobyte_table[256] = { | |||
2488 | N, D(DstMem | SrcReg | ModRM | BitOp | Lock), | 2495 | N, D(DstMem | SrcReg | ModRM | BitOp | Lock), |
2489 | D(DstMem | SrcReg | Src2ImmByte | ModRM), | 2496 | D(DstMem | SrcReg | Src2ImmByte | ModRM), |
2490 | D(DstMem | SrcReg | Src2CL | ModRM), | 2497 | D(DstMem | SrcReg | Src2CL | ModRM), |
2491 | D(ModRM), N, | 2498 | D(ModRM), I(DstReg | SrcMem | ModRM, em_imul), |
2492 | /* 0xB0 - 0xB7 */ | 2499 | /* 0xB0 - 0xB7 */ |
2493 | D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock), | 2500 | D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock), |
2494 | N, D(DstMem | SrcReg | ModRM | BitOp | Lock), | 2501 | N, D(DstMem | SrcReg | ModRM | BitOp | Lock), |