From mboxrd@z Thu Jan 1 00:00:00 1970 From: Boris Ostrovsky Subject: Re: [PATCH v22 11/14] x86/VPMU: Handle PMU interrupts for PV(H) guests Date: Tue, 26 May 2015 14:09:12 -0400 Message-ID: <5564B6C8.5030801@oracle.com> References: <1432231048-24880-1-git-send-email-boris.ostrovsky@oracle.com> <1432231048-24880-12-git-send-email-boris.ostrovsky@oracle.com> <5564BA57020000780007E021@mail.emea.novell.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; Format="flowed" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <5564BA57020000780007E021@mail.emea.novell.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Jan Beulich Cc: kevin.tian@intel.com, suravee.suthikulpanit@amd.com, andrew.cooper3@citrix.com, tim@xen.org, dietmar.hahn@ts.fujitsu.com, xen-devel@lists.xen.org, Aravind.Gopalakrishnan@amd.com, jun.nakajima@intel.com, dgdegra@tycho.nsa.gov List-Id: xen-devel@lists.xenproject.org On 05/26/2015 12:24 PM, Jan Beulich wrote: >>>> On 21.05.15 at 19:57, wrote: >> @@ -188,27 +189,52 @@ static inline void context_load(struct vcpu *v) >> } >> } >> >> -static void amd_vpmu_load(struct vcpu *v) >> +static int amd_vpmu_load(struct vcpu *v, bool_t from_guest) >> { >> struct vpmu_struct *vpmu = vcpu_vpmu(v); >> - struct xen_pmu_amd_ctxt *ctxt = vpmu->context; >> - uint64_t *ctrl_regs = vpmu_reg_pointer(ctxt, ctrls); >> + struct xen_pmu_amd_ctxt *ctxt; >> + uint64_t *ctrl_regs; >> + unsigned int i; >> >> vpmu_reset(vpmu, VPMU_FROZEN); >> >> - if ( vpmu_is_set(vpmu, VPMU_CONTEXT_LOADED) ) >> + if ( !from_guest && vpmu_is_set(vpmu, VPMU_CONTEXT_LOADED) ) >> { >> - unsigned int i; >> + ctxt = vpmu->context; >> + ctrl_regs = vpmu_reg_pointer(ctxt, ctrls); >> >> for ( i = 0; i < num_counters; i++ ) >> wrmsrl(ctrls[i], ctrl_regs[i]); >> >> - return; >> + return 0; >> + } >> + >> + if ( from_guest ) >> + { >> + ASSERT(!is_hvm_vcpu(v)); >> + >> + ctxt = &vpmu->xenpmu_data->pmu.c.amd; >> + ctrl_regs = vpmu_reg_pointer(ctxt, ctrls); >> + for ( i = 0; i < num_counters; i++ ) >> + { >> + if ( is_pmu_enabled(ctrl_regs[i]) ) >> + { >> + vpmu_set(vpmu, VPMU_RUNNING); >> + break; >> + } >> + } >> + >> + if ( i == num_counters ) >> + vpmu_reset(vpmu, VPMU_RUNNING); >> + >> + memcpy(vpmu->context, &vpmu->xenpmu_data->pmu.c.amd, ctxt_sz); >> } >> >> vpmu_set(vpmu, VPMU_CONTEXT_LOADED); >> >> context_load(v); >> + >> + return 0; >> } > So no verification needed at all on the AMD side? If so, So I went back to BKDGs and it looks like some models of family 15 redefined one of the bits from Reserved to MBZ so I think I'll need to verify that bit now. It's rather strange that this bit (MSRC001_0200[19]) is reserved for models 00h-0Fh and 30-3Fh but is MBZ for 10h-1Fh. It is also reserved for families 10h and 16h. I don't have access to the MBZ models so I can't test whether it is indeed MBZ or a typo in the spec (I can certainly write it with 1 on family 10h and 15h/model2). -boris > Acked-by: Jan Beulich >