diff options
author | Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp> | 2011-05-29 21:56:26 +0900 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2011-07-12 13:15:59 +0300 |
commit | db5b0762f3cab58398f16379ab37ef66ef9ba497 (patch) | |
tree | d4b7c00fcb088ad41f9fbddcacf250c2b5cb4a9f | |
parent | e01991e71a179ddab494c8e02100ad73bc0010c4 (diff) | |
download | op-kernel-dev-db5b0762f3cab58398f16379ab37ef66ef9ba497.zip op-kernel-dev-db5b0762f3cab58398f16379ab37ef66ef9ba497.tar.gz |
KVM: x86 emulator: Use opcode::execute for some instructions
Move the following functions to the opcode tables:
RET (Far return) : CB
IRET : CF
JMP (Jump far) : EA
SYSCALL : 0F 05
CLTS : 0F 06
SYSENTER : 0F 34
SYSEXIT : 0F 35
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 | 37 |
1 files changed, 8 insertions, 29 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 4af9442..136bc6c 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -3169,9 +3169,9 @@ static struct opcode opcode_table[256] = { D(DstReg | SrcMemFAddr | ModRM | No64), D(DstReg | SrcMemFAddr | ModRM | No64), G(ByteOp, group11), G(0, group11), /* 0xC8 - 0xCF */ - N, N, N, D(ImplicitOps | Stack), + N, N, N, I(ImplicitOps | Stack, em_ret_far), D(ImplicitOps), DI(SrcImmByte, intn), - D(ImplicitOps | No64), DI(ImplicitOps, iret), + D(ImplicitOps | No64), II(ImplicitOps, em_iret, iret), /* 0xD0 - 0xD7 */ D2bv(DstMem | SrcOne | ModRM), D2bv(DstMem | ModRM), N, N, N, N, @@ -3183,7 +3183,7 @@ static struct opcode opcode_table[256] = { D2bvIP(SrcAcc | DstImmUByte, out, check_perm_out), /* 0xE8 - 0xEF */ D(SrcImm | Stack), D(SrcImm | ImplicitOps), - D(SrcImmFAddr | No64), D(SrcImmByte | ImplicitOps), + I(SrcImmFAddr | No64, em_jmp_far), D(SrcImmByte | ImplicitOps), D2bvIP(SrcDX | DstAcc, in, check_perm_in), D2bvIP(SrcAcc | DstDX, out, check_perm_out), /* 0xF0 - 0xF7 */ @@ -3198,7 +3198,8 @@ static struct opcode opcode_table[256] = { static struct opcode twobyte_table[256] = { /* 0x00 - 0x0F */ G(0, group6), GD(0, &group7), N, N, - N, D(ImplicitOps | VendorSpecific), DI(ImplicitOps | Priv, clts), N, + N, I(ImplicitOps | VendorSpecific, em_syscall), + II(ImplicitOps | Priv, em_clts, clts), N, DI(ImplicitOps | Priv, invd), DI(ImplicitOps | Priv, wbinvd), N, N, N, D(ImplicitOps | ModRM), N, N, /* 0x10 - 0x1F */ @@ -3215,7 +3216,8 @@ static struct opcode twobyte_table[256] = { IIP(ImplicitOps, em_rdtsc, rdtsc, check_rdtsc), DI(ImplicitOps | Priv, rdmsr), DIP(ImplicitOps | Priv, rdpmc, check_rdpmc), - D(ImplicitOps | VendorSpecific), D(ImplicitOps | Priv | VendorSpecific), + I(ImplicitOps | VendorSpecific, em_sysenter), + I(ImplicitOps | Priv | VendorSpecific, em_sysexit), N, N, N, N, N, N, N, N, N, N, /* 0x40 - 0x4F */ @@ -3947,9 +3949,6 @@ special_insn: case 0xc5: /* lds */ rc = emulate_load_segment(ctxt, VCPU_SREG_DS); break; - case 0xcb: /* ret far */ - rc = em_ret_far(ctxt); - break; case 0xcc: /* int3 */ irq = 3; goto do_interrupt; @@ -3964,9 +3963,6 @@ special_insn: goto do_interrupt; } break; - case 0xcf: /* iret */ - rc = em_iret(ctxt); - break; case 0xd0 ... 0xd1: /* Grp2 */ rc = em_grp2(ctxt); break; @@ -3998,12 +3994,7 @@ special_insn: break; } case 0xe9: /* jmp rel */ - goto jmp; - case 0xea: /* jmp far */ - rc = em_jmp_far(ctxt); - break; - case 0xeb: - jmp: /* jmp rel short */ + case 0xeb: /* jmp rel short */ jmp_rel(c, c->src.val); c->dst.type = OP_NONE; /* Disable writeback. */ break; @@ -4126,12 +4117,6 @@ done: twobyte_insn: switch (c->b) { - case 0x05: /* syscall */ - rc = em_syscall(ctxt); - break; - case 0x06: - rc = em_clts(ctxt); - break; case 0x09: /* wbinvd */ (ctxt->ops->wbinvd)(ctxt); break; @@ -4188,12 +4173,6 @@ twobyte_insn: } rc = X86EMUL_CONTINUE; break; - case 0x34: /* sysenter */ - rc = em_sysenter(ctxt); - break; - case 0x35: /* sysexit */ - rc = em_sysexit(ctxt); - break; case 0x40 ... 0x4f: /* cmov */ c->dst.val = c->dst.orig_val = c->src.val; if (!test_cc(c->b, ctxt->eflags)) |