From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Ahern Subject: Re: [PATCH v2 08/11] KVM: VMX: Intercept RDPMC Date: Mon, 13 Jun 2011 10:17:02 -0600 Message-ID: <4DF637FE.1070006@cisco.com> References: <1307972106-2468-1-git-send-email-avi@redhat.com> <1307972106-2468-9-git-send-email-avi@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Cc: Marcelo Tosatti , kvm@vger.kernel.org, Ingo Molnar , Peter Zijlstra , Arnaldo Carvalho de Melo To: Avi Kivity Return-path: Received: from sj-iport-6.cisco.com ([171.71.176.117]:32975 "EHLO sj-iport-6.cisco.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751083Ab1FMQRE (ORCPT ); Mon, 13 Jun 2011 12:17:04 -0400 In-Reply-To: <1307972106-2468-9-git-send-email-avi@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: On 06/13/2011 07:35 AM, Avi Kivity wrote: > Intercept RDPMC and forward it to the PMU emulation code. > > Signed-off-by: Avi Kivity > --- > arch/x86/kvm/vmx.c | 15 ++++++++++++++- > 1 files changed, 14 insertions(+), 1 deletions(-) > > diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c > index f5b49c7..6ac3d54 100644 > --- a/arch/x86/kvm/vmx.c > +++ b/arch/x86/kvm/vmx.c > @@ -1882,6 +1882,7 @@ static __init void nested_vmx_setup_ctls_msrs(void) > #endif > CPU_BASED_MOV_DR_EXITING | CPU_BASED_UNCOND_IO_EXITING | > CPU_BASED_USE_IO_BITMAPS | CPU_BASED_MONITOR_EXITING | > + CPU_BASED_RDPMC_EXITING | > CPU_BASED_ACTIVATE_SECONDARY_CONTROLS; > /* > * We can allow some features even when not supported by the What tree is this based on? This patch fails here when to applying to latest kernel tree. David > @@ -2340,7 +2341,8 @@ static __init int setup_vmcs_config(struct vmcs_config *vmcs_conf) > CPU_BASED_USE_TSC_OFFSETING | > CPU_BASED_MWAIT_EXITING | > CPU_BASED_MONITOR_EXITING | > - CPU_BASED_INVLPG_EXITING; > + CPU_BASED_INVLPG_EXITING | > + CPU_BASED_RDPMC_EXITING; > > if (yield_on_hlt) > min |= CPU_BASED_HLT_EXITING; > @@ -4491,6 +4493,16 @@ static int handle_invlpg(struct kvm_vcpu *vcpu) > return 1; > } > > +static int handle_rdpmc(struct kvm_vcpu *vcpu) > +{ > + int err; > + > + err = kvm_rdpmc(vcpu); > + kvm_complete_insn_gp(vcpu, err); > + > + return 1; > +} > + > static int handle_wbinvd(struct kvm_vcpu *vcpu) > { > skip_emulated_instruction(vcpu); > @@ -5415,6 +5427,7 @@ static int (*kvm_vmx_exit_handlers[])(struct kvm_vcpu *vcpu) = { > [EXIT_REASON_HLT] = handle_halt, > [EXIT_REASON_INVD] = handle_invd, > [EXIT_REASON_INVLPG] = handle_invlpg, > + [EXIT_REASON_RDPMC] = handle_rdpmc, > [EXIT_REASON_VMCALL] = handle_vmcall, > [EXIT_REASON_VMCLEAR] = handle_vmclear, > [EXIT_REASON_VMLAUNCH] = handle_vmlaunch,