diff options
-rw-r--r-- | arch/x86/kvm/emulate.c | 4 | ||||
-rw-r--r-- | arch/x86/kvm/svm.c | 14 |
2 files changed, 16 insertions, 2 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 0bf1f68a71c2..cc32e72fe175 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
@@ -2789,7 +2789,7 @@ static struct opcode opcode_table[256] = { | |||
2789 | D(DstMem | SrcNone | ModRM | Mov), D(ModRM | SrcMem | NoAccess | DstReg), | 2789 | D(DstMem | SrcNone | ModRM | Mov), D(ModRM | SrcMem | NoAccess | DstReg), |
2790 | D(ImplicitOps | SrcMem16 | ModRM), G(0, group1A), | 2790 | D(ImplicitOps | SrcMem16 | ModRM), G(0, group1A), |
2791 | /* 0x90 - 0x97 */ | 2791 | /* 0x90 - 0x97 */ |
2792 | X8(D(SrcAcc | DstReg)), | 2792 | DI(SrcAcc | DstReg, pause), X7(D(SrcAcc | DstReg)), |
2793 | /* 0x98 - 0x9F */ | 2793 | /* 0x98 - 0x9F */ |
2794 | D(DstAcc | SrcNone), I(ImplicitOps | SrcAcc, em_cwd), | 2794 | D(DstAcc | SrcNone), I(ImplicitOps | SrcAcc, em_cwd), |
2795 | I(SrcImmFAddr | No64, em_call_far), N, | 2795 | I(SrcImmFAddr | No64, em_call_far), N, |
@@ -2831,7 +2831,7 @@ static struct opcode opcode_table[256] = { | |||
2831 | D(SrcImmFAddr | No64), D(SrcImmByte | ImplicitOps), | 2831 | D(SrcImmFAddr | No64), D(SrcImmByte | ImplicitOps), |
2832 | D2bv(SrcNone | DstAcc), D2bv(SrcAcc | ImplicitOps), | 2832 | D2bv(SrcNone | DstAcc), D2bv(SrcAcc | ImplicitOps), |
2833 | /* 0xF0 - 0xF7 */ | 2833 | /* 0xF0 - 0xF7 */ |
2834 | N, N, N, N, | 2834 | N, DI(ImplicitOps, icebp), N, N, |
2835 | DI(ImplicitOps | Priv, hlt), D(ImplicitOps), | 2835 | DI(ImplicitOps | Priv, hlt), D(ImplicitOps), |
2836 | G(ByteOp, group3), G(0, group3), | 2836 | G(ByteOp, group3), G(0, group3), |
2837 | /* 0xF8 - 0xFF */ | 2837 | /* 0xF8 - 0xFF */ |
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 903628922440..9eb27100e2ea 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c | |||
@@ -3918,6 +3918,13 @@ static struct __x86_intercept { | |||
3918 | [x86_intercept_rdpmc] = POST_EX(SVM_EXIT_RDPMC), | 3918 | [x86_intercept_rdpmc] = POST_EX(SVM_EXIT_RDPMC), |
3919 | [x86_intercept_cpuid] = PRE_EX(SVM_EXIT_CPUID), | 3919 | [x86_intercept_cpuid] = PRE_EX(SVM_EXIT_CPUID), |
3920 | [x86_intercept_rsm] = PRE_EX(SVM_EXIT_RSM), | 3920 | [x86_intercept_rsm] = PRE_EX(SVM_EXIT_RSM), |
3921 | [x86_intercept_pause] = PRE_EX(SVM_EXIT_PAUSE), | ||
3922 | [x86_intercept_pushf] = PRE_EX(SVM_EXIT_PUSHF), | ||
3923 | [x86_intercept_popf] = PRE_EX(SVM_EXIT_POPF), | ||
3924 | [x86_intercept_intn] = PRE_EX(SVM_EXIT_SWINT), | ||
3925 | [x86_intercept_iret] = PRE_EX(SVM_EXIT_IRET), | ||
3926 | [x86_intercept_icebp] = PRE_EX(SVM_EXIT_ICEBP), | ||
3927 | [x86_intercept_hlt] = POST_EX(SVM_EXIT_HLT), | ||
3921 | }; | 3928 | }; |
3922 | 3929 | ||
3923 | #undef PRE_EX | 3930 | #undef PRE_EX |
@@ -3987,6 +3994,13 @@ static int svm_check_intercept(struct kvm_vcpu *vcpu, | |||
3987 | else | 3994 | else |
3988 | vmcb->control.exit_info_1 = 0; | 3995 | vmcb->control.exit_info_1 = 0; |
3989 | break; | 3996 | break; |
3997 | case SVM_EXIT_PAUSE: | ||
3998 | /* | ||
3999 | * We get this for NOP only, but pause | ||
4000 | * is rep not, check this here | ||
4001 | */ | ||
4002 | if (info->rep_prefix != REPE_PREFIX) | ||
4003 | goto out; | ||
3990 | default: | 4004 | default: |
3991 | break; | 4005 | break; |
3992 | } | 4006 | } |