aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorJoerg Roedel <joerg.roedel@amd.com>2011-04-04 06:39:34 -0400
committerAvi Kivity <avi@redhat.com>2011-05-11 07:57:02 -0400
commitbf608f88faef1245ff87e731512517fc676ffe02 (patch)
treeca1cada4df6cd8cd2f4bb6978ff270fa2e242fd9 /arch
parent8061252ee0d21e1289235a4b7fe61f53010c46ff (diff)
KVM: SVM: Add intercept checks for one-byte instructions
This patch add intercept checks for emulated one-byte instructions to the KVM instruction emulation path. Signed-off-by: Joerg Roedel <joerg.roedel@amd.com> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/kvm/emulate.c4
-rw-r--r--arch/x86/kvm/svm.c14
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 }