aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/emulate.c
diff options
context:
space:
mode:
authorTakuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>2011-05-29 08:57:53 -0400
committerAvi Kivity <avi@redhat.com>2011-07-12 06:16:00 -0400
commit9f21ca599cd609502de8a56c1d4c4688d40abb2d (patch)
tree6741823f140817294f313154752f2dfaa4fc10f5 /arch/x86/kvm/emulate.c
parentdb5b0762f3cab58398f16379ab37ef66ef9ba497 (diff)
KVM: x86 emulator: Use opcode::execute for TEST(84/85, A8/A9)
Signed-off-by: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'arch/x86/kvm/emulate.c')
-rw-r--r--arch/x86/kvm/emulate.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 136bc6cbd5fa..d25cfc238b90 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -2605,6 +2605,14 @@ static int em_cmp(struct x86_emulate_ctxt *ctxt)
2605 return X86EMUL_CONTINUE; 2605 return X86EMUL_CONTINUE;
2606} 2606}
2607 2607
2608static int em_test(struct x86_emulate_ctxt *ctxt)
2609{
2610 struct decode_cache *c = &ctxt->decode;
2611
2612 emulate_2op_SrcV("test", c->src, c->dst, ctxt->eflags);
2613 return X86EMUL_CONTINUE;
2614}
2615
2608static int em_imul(struct x86_emulate_ctxt *ctxt) 2616static int em_imul(struct x86_emulate_ctxt *ctxt)
2609{ 2617{
2610 struct decode_cache *c = &ctxt->decode; 2618 struct decode_cache *c = &ctxt->decode;
@@ -3135,7 +3143,8 @@ static struct opcode opcode_table[256] = {
3135 G(DstMem | SrcImm | ModRM | Group, group1), 3143 G(DstMem | SrcImm | ModRM | Group, group1),
3136 G(ByteOp | DstMem | SrcImm | ModRM | No64 | Group, group1), 3144 G(ByteOp | DstMem | SrcImm | ModRM | No64 | Group, group1),
3137 G(DstMem | SrcImmByte | ModRM | Group, group1), 3145 G(DstMem | SrcImmByte | ModRM | Group, group1),
3138 D2bv(DstMem | SrcReg | ModRM), D2bv(DstMem | SrcReg | ModRM | Lock), 3146 I2bv(DstMem | SrcReg | ModRM, em_test),
3147 D2bv(DstMem | SrcReg | ModRM | Lock),
3139 /* 0x88 - 0x8F */ 3148 /* 0x88 - 0x8F */
3140 I2bv(DstMem | SrcReg | ModRM | Mov, em_mov), 3149 I2bv(DstMem | SrcReg | ModRM | Mov, em_mov),
3141 I2bv(DstReg | SrcMem | ModRM | Mov, em_mov), 3150 I2bv(DstReg | SrcMem | ModRM | Mov, em_mov),
@@ -3154,7 +3163,7 @@ static struct opcode opcode_table[256] = {
3154 I2bv(SrcSI | DstDI | Mov | String, em_mov), 3163 I2bv(SrcSI | DstDI | Mov | String, em_mov),
3155 I2bv(SrcSI | DstDI | String, em_cmp), 3164 I2bv(SrcSI | DstDI | String, em_cmp),
3156 /* 0xA8 - 0xAF */ 3165 /* 0xA8 - 0xAF */
3157 D2bv(DstAcc | SrcImm), 3166 I2bv(DstAcc | SrcImm, em_test),
3158 I2bv(SrcAcc | DstDI | Mov | String, em_mov), 3167 I2bv(SrcAcc | DstDI | Mov | String, em_mov),
3159 I2bv(SrcSI | DstAcc | Mov | String, em_mov), 3168 I2bv(SrcSI | DstAcc | Mov | String, em_mov),
3160 I2bv(SrcAcc | DstDI | String, em_cmp), 3169 I2bv(SrcAcc | DstDI | String, em_cmp),
@@ -3873,10 +3882,6 @@ special_insn:
3873 if (test_cc(c->b, ctxt->eflags)) 3882 if (test_cc(c->b, ctxt->eflags))
3874 jmp_rel(c, c->src.val); 3883 jmp_rel(c, c->src.val);
3875 break; 3884 break;
3876 case 0x84 ... 0x85:
3877 test:
3878 emulate_2op_SrcV("test", c->src, c->dst, ctxt->eflags);
3879 break;
3880 case 0x86 ... 0x87: /* xchg */ 3885 case 0x86 ... 0x87: /* xchg */
3881 xchg: 3886 xchg:
3882 /* Write back the register source. */ 3887 /* Write back the register source. */
@@ -3932,8 +3937,6 @@ special_insn:
3932 case 8: c->dst.val = (s32)c->dst.val; break; 3937 case 8: c->dst.val = (s32)c->dst.val; break;
3933 } 3938 }
3934 break; 3939 break;
3935 case 0xa8 ... 0xa9: /* test ax, imm */
3936 goto test;
3937 case 0xc0 ... 0xc1: 3940 case 0xc0 ... 0xc1:
3938 rc = em_grp2(ctxt); 3941 rc = em_grp2(ctxt);
3939 break; 3942 break;