From mboxrd@z Thu Jan 1 00:00:00 1970 From: Suravee Suthikulanit Subject: Re: [PATCH v2 9/9] x86/AMD: Dump AMD VPMU info Date: Mon, 15 Apr 2013 12:54:49 -0500 Message-ID: <516C3EE9.3000004@amd.com> References: <1365789566-3733-1-git-send-email-boris.ostrovsky@oracle.com> <1365789566-3733-10-git-send-email-boris.ostrovsky@oracle.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; Format="flowed" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1365789566-3733-10-git-send-email-boris.ostrovsky@oracle.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: Boris Ostrovsky Cc: jun.nakajima@intel.com, haitao.shan@intel.com, jacob.shin@amd.com, dietmar.hahn@ts.fujitsu.com, xen-devel@lists.xen.org, JBeulich@suse.com List-Id: xen-devel@lists.xenproject.org This is nice. Tested and Acked. Thanks Suravee On 4/12/2013 12:59 PM, Boris Ostrovsky wrote: > Dump VPMU registers on AMD in the 'q' keyhandler. > > Signed-off-by: Boris Ostrovsky > --- > xen/arch/x86/hvm/svm/vpmu.c | 42 +++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 41 insertions(+), 1 deletion(-) > > diff --git a/xen/arch/x86/hvm/svm/vpmu.c b/xen/arch/x86/hvm/svm/vpmu.c > index b36ab2b..4d1fbc8 100644 > --- a/xen/arch/x86/hvm/svm/vpmu.c > +++ b/xen/arch/x86/hvm/svm/vpmu.c > @@ -414,13 +414,53 @@ static void amd_vpmu_destroy(struct vcpu *v) > } > } > > +/* VPMU part of the 'q' keyhandler */ > +static void amd_vpmu_dump(struct vcpu *v) > +{ > + struct vpmu_struct *vpmu = vcpu_vpmu(v); > + struct amd_vpmu_context *ctxt = vpmu->context; > + unsigned int i; > + > + printk(" VPMU state: 0x%x ", vpmu->flags); > + if ( !vpmu_is_set(vpmu, VPMU_CONTEXT_ALLOCATED) ) > + { > + printk("\n"); > + return; > + } > + > + printk("("); > + if ( vpmu_is_set(vpmu, VPMU_PASSIVE_DOMAIN_ALLOCATED) ) > + printk("PASSIVE_DOMAIN_ALLOCATED, "); > + if ( vpmu_is_set(vpmu, VPMU_FROZEN) ) > + printk("FROZEN, "); > + if ( vpmu_is_set(vpmu, VPMU_CONTEXT_SAVE) ) > + printk("SAVE, "); > + if ( vpmu_is_set(vpmu, VPMU_RUNNING) ) > + printk("RUNNING, "); > + if ( vpmu_is_set(vpmu, VPMU_CONTEXT_LOADED) ) > + printk("LOADED, "); > + printk("ALLOCATED)\n"); > + > + for ( i = 0; i < num_counters; i++ ) > + { > + uint64_t ctrl, cntr; > + > + rdmsrl(ctrls[i], ctrl); > + rdmsrl(counters[i], cntr); > + printk(" 0x%08x: 0x%lx (0x%lx in HW) 0x%08x: 0x%lx (0x%lx in HW)\n", > + ctrls[i], ctxt->ctrls[i], ctrl, > + counters[i], ctxt->counters[i], cntr); > + } > +} > + > struct arch_vpmu_ops amd_vpmu_ops = { > .do_wrmsr = amd_vpmu_do_wrmsr, > .do_rdmsr = amd_vpmu_do_rdmsr, > .do_interrupt = amd_vpmu_do_interrupt, > .arch_vpmu_destroy = amd_vpmu_destroy, > .arch_vpmu_save = amd_vpmu_save, > - .arch_vpmu_load = amd_vpmu_load > + .arch_vpmu_load = amd_vpmu_load, > + .arch_vpmu_dump = amd_vpmu_dump > }; > > int svm_vpmu_initialise(struct vcpu *v, unsigned int vpmu_flags)