From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [PATCH 09/13] KVM: SVM: Add intercept checks for remaining group7 instructions Date: Mon, 28 Mar 2011 14:15:34 +0200 Message-ID: <4D907BE6.8020202@redhat.com> References: <1301309210-11120-1-git-send-email-joerg.roedel@amd.com> <1301309210-11120-10-git-send-email-joerg.roedel@amd.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: Marcelo Tosatti , kvm@vger.kernel.org To: Joerg Roedel Return-path: Received: from mx1.redhat.com ([209.132.183.28]:51817 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752756Ab1C1MPj (ORCPT ); Mon, 28 Mar 2011 08:15:39 -0400 In-Reply-To: <1301309210-11120-10-git-send-email-joerg.roedel@amd.com> Sender: kvm-owner@vger.kernel.org List-ID: On 03/28/2011 12:46 PM, Joerg Roedel wrote: > This patch implements the emulator intercept checks for the > RDTSCP, MONITOR, and MWAIT instructions. > > Signed-off-by: Joerg Roedel > --- > arch/x86/kvm/emulate.c | 15 +++++++++++++-- > arch/x86/kvm/svm.c | 3 +++ > 2 files changed, 16 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c > index 8b8f63d..e0eed4c 100644 > --- a/arch/x86/kvm/emulate.c > +++ b/arch/x86/kvm/emulate.c > @@ -2366,6 +2366,12 @@ static int em_mov(struct x86_emulate_ctxt *ctxt) > D2bv(((_f)& ~Lock) | DstAcc | SrcImm) > > > +static struct opcode group7_rm1[] = { > + DI(SrcNone | ModRM | Priv, monitor), > + DI(SrcNone | ModRM | Priv, mwait), Note these are unprivileged if magic msr c0010015 is tweaked. I don't think we support the enabled setting. > + N, N, N, N, N, N, > +}; > + > static struct opcode group7_rm3[] = { > DI(SrcNone | ModRM | Priv, vmrun), > DI(SrcNone | ModRM | Priv, vmmcall), > @@ -2377,6 +2383,11 @@ static struct opcode group7_rm3[] = { > DI(SrcNone | ModRM | Priv, invlpga), > }; > > +static struct opcode group7_rm7[] = { > + N, > + DI(SrcNone | ModRM, rdtscp), Need to check cr4.tsd before the intercept. > + N, N, N, N, N, N, > +}; > static struct opcode group1[] = { > X7(D(Lock)), N > }; > @@ -2419,10 +2430,10 @@ static struct group_dual group7 = { { > DI(SrcMem16 | ModRM | Mov | Priv, lmsw), > DI(SrcMem | ModRM | ByteOp | Priv | NoAccess, invlpg), > }, { > - D(SrcNone | ModRM | Priv | VendorSpecific), N, > + D(SrcNone | ModRM | Priv | VendorSpecific), EXT(0, group7_rm1), > N, EXT(0, group7_rm3), > DI(SrcNone | ModRM | DstMem | Mov, smsw), N, > - DI(SrcMem16 | ModRM | Mov | Priv, lmsw), N, > + DI(SrcMem16 | ModRM | Mov | Priv, lmsw), EXT(0, group7_rm7), > } }; > > static struct opcode group8[] = { > diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c > index 9b22f5f..2853625 100644 > --- a/arch/x86/kvm/svm.c > +++ b/arch/x86/kvm/svm.c > @@ -3904,6 +3904,9 @@ static struct __x86_intercept { > [x86_intercept_clgi] = POST_EX(SVM_EXIT_CLGI), > [x86_intercept_skinit] = POST_EX(SVM_EXIT_SKINIT), > [x86_intercept_invlpga] = POST_EX(SVM_EXIT_INVLPGA), > + [x86_intercept_rdtscp] = POST_EX(SVM_EXIT_RDTSCP), > + [x86_intercept_monitor] = POST_MEM(SVM_EXIT_MONITOR), > + [x86_intercept_mwait] = POST_EX(SVM_EXIT_MWAIT), > }; > > #undef POST_EX -- error compiling committee.c: too many arguments to function