diff options
author | Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp> | 2011-11-22 01:18:35 -0500 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2011-12-27 04:17:26 -0500 |
commit | d4ddafcdf2201326ec9717172767cfad0ede1472 (patch) | |
tree | 8b4845a36d23f945657e2cb543a4ecf149a8b8ef | |
parent | ce7faab24fbfb0b5207636ee4795e924bcf97e8a (diff) |
KVM: x86 emulator: Use opcode::execute for CALL
CALL: E8
Signed-off-by: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
-rw-r--r-- | arch/x86/kvm/emulate.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 7a9ce6dbd1ce..6b7a03b18f89 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
@@ -2482,6 +2482,15 @@ static int em_das(struct x86_emulate_ctxt *ctxt) | |||
2482 | return X86EMUL_CONTINUE; | 2482 | return X86EMUL_CONTINUE; |
2483 | } | 2483 | } |
2484 | 2484 | ||
2485 | static int em_call(struct x86_emulate_ctxt *ctxt) | ||
2486 | { | ||
2487 | long rel = ctxt->src.val; | ||
2488 | |||
2489 | ctxt->src.val = (unsigned long)ctxt->_eip; | ||
2490 | jmp_rel(ctxt, rel); | ||
2491 | return em_push(ctxt); | ||
2492 | } | ||
2493 | |||
2485 | static int em_call_far(struct x86_emulate_ctxt *ctxt) | 2494 | static int em_call_far(struct x86_emulate_ctxt *ctxt) |
2486 | { | 2495 | { |
2487 | u16 sel, old_cs; | 2496 | u16 sel, old_cs; |
@@ -3269,7 +3278,7 @@ static struct opcode opcode_table[256] = { | |||
3269 | I2bvIP(SrcImmUByte | DstAcc, em_in, in, check_perm_in), | 3278 | I2bvIP(SrcImmUByte | DstAcc, em_in, in, check_perm_in), |
3270 | I2bvIP(SrcAcc | DstImmUByte, em_out, out, check_perm_out), | 3279 | I2bvIP(SrcAcc | DstImmUByte, em_out, out, check_perm_out), |
3271 | /* 0xE8 - 0xEF */ | 3280 | /* 0xE8 - 0xEF */ |
3272 | D(SrcImm | Stack), D(SrcImm | ImplicitOps), | 3281 | I(SrcImm | Stack, em_call), D(SrcImm | ImplicitOps), |
3273 | I(SrcImmFAddr | No64, em_jmp_far), D(SrcImmByte | ImplicitOps), | 3282 | I(SrcImmFAddr | No64, em_jmp_far), D(SrcImmByte | ImplicitOps), |
3274 | I2bvIP(SrcDX | DstAcc, em_in, in, check_perm_in), | 3283 | I2bvIP(SrcDX | DstAcc, em_in, in, check_perm_in), |
3275 | I2bvIP(SrcAcc | DstDX, em_out, out, check_perm_out), | 3284 | I2bvIP(SrcAcc | DstDX, em_out, out, check_perm_out), |
@@ -3967,13 +3976,6 @@ special_insn: | |||
3967 | ctxt->src.val = ctxt->regs[VCPU_REGS_RCX]; | 3976 | ctxt->src.val = ctxt->regs[VCPU_REGS_RCX]; |
3968 | rc = em_grp2(ctxt); | 3977 | rc = em_grp2(ctxt); |
3969 | break; | 3978 | break; |
3970 | case 0xe8: /* call (near) */ { | ||
3971 | long int rel = ctxt->src.val; | ||
3972 | ctxt->src.val = (unsigned long) ctxt->_eip; | ||
3973 | jmp_rel(ctxt, rel); | ||
3974 | rc = em_push(ctxt); | ||
3975 | break; | ||
3976 | } | ||
3977 | case 0xe9: /* jmp rel */ | 3979 | case 0xe9: /* jmp rel */ |
3978 | case 0xeb: /* jmp rel short */ | 3980 | case 0xeb: /* jmp rel short */ |
3979 | jmp_rel(ctxt, ctxt->src.val); | 3981 | jmp_rel(ctxt, ctxt->src.val); |