diff options
author | Avi Kivity <avi.kivity@gmail.com> | 2013-01-04 09:18:54 -0500 |
---|---|---|
committer | Marcelo Tosatti <mtosatti@redhat.com> | 2013-01-09 14:39:30 -0500 |
commit | fb864fbc72fd4e2175fb64072fe9134d3a3ab89a (patch) | |
tree | cf233407df0c7b36b076461218fa5d71a7a633b0 /arch/x86/kvm/emulate.c | |
parent | f7857f35dbf8e7ca36ebff3f43888fd3fb0f0e70 (diff) |
KVM: x86 emulator: convert basic ALU ops to fastop
Opcodes:
TEST
CMP
ADD
ADC
SUB
SBB
XOR
OR
AND
Acked-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi.kivity@gmail.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'arch/x86/kvm/emulate.c')
-rw-r--r-- | arch/x86/kvm/emulate.c | 112 |
1 files changed, 34 insertions, 78 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 3b5d4dd6750a..619a33d0ee0a 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
@@ -3026,59 +3026,15 @@ static int em_ret_near_imm(struct x86_emulate_ctxt *ctxt) | |||
3026 | return X86EMUL_CONTINUE; | 3026 | return X86EMUL_CONTINUE; |
3027 | } | 3027 | } |
3028 | 3028 | ||
3029 | static int em_add(struct x86_emulate_ctxt *ctxt) | 3029 | FASTOP2(add); |
3030 | { | 3030 | FASTOP2(or); |
3031 | emulate_2op_SrcV(ctxt, "add"); | 3031 | FASTOP2(adc); |
3032 | return X86EMUL_CONTINUE; | 3032 | FASTOP2(sbb); |
3033 | } | 3033 | FASTOP2(and); |
3034 | 3034 | FASTOP2(sub); | |
3035 | static int em_or(struct x86_emulate_ctxt *ctxt) | 3035 | FASTOP2(xor); |
3036 | { | 3036 | FASTOP2(cmp); |
3037 | emulate_2op_SrcV(ctxt, "or"); | 3037 | FASTOP2(test); |
3038 | return X86EMUL_CONTINUE; | ||
3039 | } | ||
3040 | |||
3041 | static int em_adc(struct x86_emulate_ctxt *ctxt) | ||
3042 | { | ||
3043 | emulate_2op_SrcV(ctxt, "adc"); | ||
3044 | return X86EMUL_CONTINUE; | ||
3045 | } | ||
3046 | |||
3047 | static int em_sbb(struct x86_emulate_ctxt *ctxt) | ||
3048 | { | ||
3049 | emulate_2op_SrcV(ctxt, "sbb"); | ||
3050 | return X86EMUL_CONTINUE; | ||
3051 | } | ||
3052 | |||
3053 | static int em_and(struct x86_emulate_ctxt *ctxt) | ||
3054 | { | ||
3055 | emulate_2op_SrcV(ctxt, "and"); | ||
3056 | return X86EMUL_CONTINUE; | ||
3057 | } | ||
3058 | |||
3059 | static int em_sub(struct x86_emulate_ctxt *ctxt) | ||
3060 | { | ||
3061 | emulate_2op_SrcV(ctxt, "sub"); | ||
3062 | return X86EMUL_CONTINUE; | ||
3063 | } | ||
3064 | |||
3065 | static int em_xor(struct x86_emulate_ctxt *ctxt) | ||
3066 | { | ||
3067 | emulate_2op_SrcV(ctxt, "xor"); | ||
3068 | return X86EMUL_CONTINUE; | ||
3069 | } | ||
3070 | |||
3071 | static int em_cmp(struct x86_emulate_ctxt *ctxt) | ||
3072 | { | ||
3073 | emulate_2op_SrcV(ctxt, "cmp"); | ||
3074 | return X86EMUL_CONTINUE; | ||
3075 | } | ||
3076 | |||
3077 | static int em_test(struct x86_emulate_ctxt *ctxt) | ||
3078 | { | ||
3079 | emulate_2op_SrcV(ctxt, "test"); | ||
3080 | return X86EMUL_CONTINUE; | ||
3081 | } | ||
3082 | 3038 | ||
3083 | static int em_xchg(struct x86_emulate_ctxt *ctxt) | 3039 | static int em_xchg(struct x86_emulate_ctxt *ctxt) |
3084 | { | 3040 | { |
@@ -3711,9 +3667,9 @@ static int check_perm_out(struct x86_emulate_ctxt *ctxt) | |||
3711 | #define I2bvIP(_f, _e, _i, _p) \ | 3667 | #define I2bvIP(_f, _e, _i, _p) \ |
3712 | IIP((_f) | ByteOp, _e, _i, _p), IIP(_f, _e, _i, _p) | 3668 | IIP((_f) | ByteOp, _e, _i, _p), IIP(_f, _e, _i, _p) |
3713 | 3669 | ||
3714 | #define I6ALU(_f, _e) I2bv((_f) | DstMem | SrcReg | ModRM, _e), \ | 3670 | #define F6ALU(_f, _e) F2bv((_f) | DstMem | SrcReg | ModRM, _e), \ |
3715 | I2bv(((_f) | DstReg | SrcMem | ModRM) & ~Lock, _e), \ | 3671 | F2bv(((_f) | DstReg | SrcMem | ModRM) & ~Lock, _e), \ |
3716 | I2bv(((_f) & ~Lock) | DstAcc | SrcImm, _e) | 3672 | F2bv(((_f) & ~Lock) | DstAcc | SrcImm, _e) |
3717 | 3673 | ||
3718 | static const struct opcode group7_rm1[] = { | 3674 | static const struct opcode group7_rm1[] = { |
3719 | DI(SrcNone | Priv, monitor), | 3675 | DI(SrcNone | Priv, monitor), |
@@ -3739,14 +3695,14 @@ static const struct opcode group7_rm7[] = { | |||
3739 | }; | 3695 | }; |
3740 | 3696 | ||
3741 | static const struct opcode group1[] = { | 3697 | static const struct opcode group1[] = { |
3742 | I(Lock, em_add), | 3698 | F(Lock, em_add), |
3743 | I(Lock | PageTable, em_or), | 3699 | F(Lock | PageTable, em_or), |
3744 | I(Lock, em_adc), | 3700 | F(Lock, em_adc), |
3745 | I(Lock, em_sbb), | 3701 | F(Lock, em_sbb), |
3746 | I(Lock | PageTable, em_and), | 3702 | F(Lock | PageTable, em_and), |
3747 | I(Lock, em_sub), | 3703 | F(Lock, em_sub), |
3748 | I(Lock, em_xor), | 3704 | F(Lock, em_xor), |
3749 | I(NoWrite, em_cmp), | 3705 | F(NoWrite, em_cmp), |
3750 | }; | 3706 | }; |
3751 | 3707 | ||
3752 | static const struct opcode group1A[] = { | 3708 | static const struct opcode group1A[] = { |
@@ -3754,8 +3710,8 @@ static const struct opcode group1A[] = { | |||
3754 | }; | 3710 | }; |
3755 | 3711 | ||
3756 | static const struct opcode group3[] = { | 3712 | static const struct opcode group3[] = { |
3757 | I(DstMem | SrcImm | NoWrite, em_test), | 3713 | F(DstMem | SrcImm | NoWrite, em_test), |
3758 | I(DstMem | SrcImm | NoWrite, em_test), | 3714 | F(DstMem | SrcImm | NoWrite, em_test), |
3759 | F(DstMem | SrcNone | Lock, em_not), | 3715 | F(DstMem | SrcNone | Lock, em_not), |
3760 | F(DstMem | SrcNone | Lock, em_neg), | 3716 | F(DstMem | SrcNone | Lock, em_neg), |
3761 | I(SrcMem, em_mul_ex), | 3717 | I(SrcMem, em_mul_ex), |
@@ -3897,29 +3853,29 @@ static const struct escape escape_dd = { { | |||
3897 | 3853 | ||
3898 | static const struct opcode opcode_table[256] = { | 3854 | static const struct opcode opcode_table[256] = { |
3899 | /* 0x00 - 0x07 */ | 3855 | /* 0x00 - 0x07 */ |
3900 | I6ALU(Lock, em_add), | 3856 | F6ALU(Lock, em_add), |
3901 | I(ImplicitOps | Stack | No64 | Src2ES, em_push_sreg), | 3857 | I(ImplicitOps | Stack | No64 | Src2ES, em_push_sreg), |
3902 | I(ImplicitOps | Stack | No64 | Src2ES, em_pop_sreg), | 3858 | I(ImplicitOps | Stack | No64 | Src2ES, em_pop_sreg), |
3903 | /* 0x08 - 0x0F */ | 3859 | /* 0x08 - 0x0F */ |
3904 | I6ALU(Lock | PageTable, em_or), | 3860 | F6ALU(Lock | PageTable, em_or), |
3905 | I(ImplicitOps | Stack | No64 | Src2CS, em_push_sreg), | 3861 | I(ImplicitOps | Stack | No64 | Src2CS, em_push_sreg), |
3906 | N, | 3862 | N, |
3907 | /* 0x10 - 0x17 */ | 3863 | /* 0x10 - 0x17 */ |
3908 | I6ALU(Lock, em_adc), | 3864 | F6ALU(Lock, em_adc), |
3909 | I(ImplicitOps | Stack | No64 | Src2SS, em_push_sreg), | 3865 | I(ImplicitOps | Stack | No64 | Src2SS, em_push_sreg), |
3910 | I(ImplicitOps | Stack | No64 | Src2SS, em_pop_sreg), | 3866 | I(ImplicitOps | Stack | No64 | Src2SS, em_pop_sreg), |
3911 | /* 0x18 - 0x1F */ | 3867 | /* 0x18 - 0x1F */ |
3912 | I6ALU(Lock, em_sbb), | 3868 | F6ALU(Lock, em_sbb), |
3913 | I(ImplicitOps | Stack | No64 | Src2DS, em_push_sreg), | 3869 | I(ImplicitOps | Stack | No64 | Src2DS, em_push_sreg), |
3914 | I(ImplicitOps | Stack | No64 | Src2DS, em_pop_sreg), | 3870 | I(ImplicitOps | Stack | No64 | Src2DS, em_pop_sreg), |
3915 | /* 0x20 - 0x27 */ | 3871 | /* 0x20 - 0x27 */ |
3916 | I6ALU(Lock | PageTable, em_and), N, N, | 3872 | F6ALU(Lock | PageTable, em_and), N, N, |
3917 | /* 0x28 - 0x2F */ | 3873 | /* 0x28 - 0x2F */ |
3918 | I6ALU(Lock, em_sub), N, I(ByteOp | DstAcc | No64, em_das), | 3874 | F6ALU(Lock, em_sub), N, I(ByteOp | DstAcc | No64, em_das), |
3919 | /* 0x30 - 0x37 */ | 3875 | /* 0x30 - 0x37 */ |
3920 | I6ALU(Lock, em_xor), N, N, | 3876 | F6ALU(Lock, em_xor), N, N, |
3921 | /* 0x38 - 0x3F */ | 3877 | /* 0x38 - 0x3F */ |
3922 | I6ALU(NoWrite, em_cmp), N, N, | 3878 | F6ALU(NoWrite, em_cmp), N, N, |
3923 | /* 0x40 - 0x4F */ | 3879 | /* 0x40 - 0x4F */ |
3924 | X16(D(DstReg)), | 3880 | X16(D(DstReg)), |
3925 | /* 0x50 - 0x57 */ | 3881 | /* 0x50 - 0x57 */ |
@@ -3945,7 +3901,7 @@ static const struct opcode opcode_table[256] = { | |||
3945 | G(DstMem | SrcImm, group1), | 3901 | G(DstMem | SrcImm, group1), |
3946 | G(ByteOp | DstMem | SrcImm | No64, group1), | 3902 | G(ByteOp | DstMem | SrcImm | No64, group1), |
3947 | G(DstMem | SrcImmByte, group1), | 3903 | G(DstMem | SrcImmByte, group1), |
3948 | I2bv(DstMem | SrcReg | ModRM | NoWrite, em_test), | 3904 | F2bv(DstMem | SrcReg | ModRM | NoWrite, em_test), |
3949 | I2bv(DstMem | SrcReg | ModRM | Lock | PageTable, em_xchg), | 3905 | I2bv(DstMem | SrcReg | ModRM | Lock | PageTable, em_xchg), |
3950 | /* 0x88 - 0x8F */ | 3906 | /* 0x88 - 0x8F */ |
3951 | I2bv(DstMem | SrcReg | ModRM | Mov | PageTable, em_mov), | 3907 | I2bv(DstMem | SrcReg | ModRM | Mov | PageTable, em_mov), |
@@ -3965,12 +3921,12 @@ static const struct opcode opcode_table[256] = { | |||
3965 | I2bv(DstAcc | SrcMem | Mov | MemAbs, em_mov), | 3921 | I2bv(DstAcc | SrcMem | Mov | MemAbs, em_mov), |
3966 | I2bv(DstMem | SrcAcc | Mov | MemAbs | PageTable, em_mov), | 3922 | I2bv(DstMem | SrcAcc | Mov | MemAbs | PageTable, em_mov), |
3967 | I2bv(SrcSI | DstDI | Mov | String, em_mov), | 3923 | I2bv(SrcSI | DstDI | Mov | String, em_mov), |
3968 | I2bv(SrcSI | DstDI | String | NoWrite, em_cmp), | 3924 | F2bv(SrcSI | DstDI | String | NoWrite, em_cmp), |
3969 | /* 0xA8 - 0xAF */ | 3925 | /* 0xA8 - 0xAF */ |
3970 | I2bv(DstAcc | SrcImm | NoWrite, em_test), | 3926 | F2bv(DstAcc | SrcImm | NoWrite, em_test), |
3971 | I2bv(SrcAcc | DstDI | Mov | String, em_mov), | 3927 | I2bv(SrcAcc | DstDI | Mov | String, em_mov), |
3972 | I2bv(SrcSI | DstAcc | Mov | String, em_mov), | 3928 | I2bv(SrcSI | DstAcc | Mov | String, em_mov), |
3973 | I2bv(SrcAcc | DstDI | String | NoWrite, em_cmp), | 3929 | F2bv(SrcAcc | DstDI | String | NoWrite, em_cmp), |
3974 | /* 0xB0 - 0xB7 */ | 3930 | /* 0xB0 - 0xB7 */ |
3975 | X8(I(ByteOp | DstReg | SrcImm | Mov, em_mov)), | 3931 | X8(I(ByteOp | DstReg | SrcImm | Mov, em_mov)), |
3976 | /* 0xB8 - 0xBF */ | 3932 | /* 0xB8 - 0xBF */ |