[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 06/13] x86/PMU: Add public xenpmu.h
Am Freitag 20 September 2013, 05:42:05 schrieb Boris Ostrovsky: > Add xenpmu.h header file, move various macros and structures that will be > shared between hypervisor and PV guests to it. > > Signed-off-by: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx> > --- > xen/arch/x86/hvm/svm/vpmu.c | 15 +++----- > xen/arch/x86/hvm/vmx/vpmu_core2.c | 43 ++++++++++++---------- > xen/arch/x86/hvm/vpmu.c | 1 + > xen/arch/x86/oprofile/op_model_ppro.c | 6 +++- > xen/include/asm-x86/hvm/vmx/vpmu_core2.h | 32 ----------------- > xen/include/asm-x86/hvm/vpmu.h | 10 ++---- > xen/include/public/arch-x86/xenpmu-x86.h | 62 > ++++++++++++++++++++++++++++++++ > xen/include/public/xenpmu.h | 38 ++++++++++++++++++++ > 8 files changed, 136 insertions(+), 71 deletions(-) > delete mode 100644 xen/include/asm-x86/hvm/vmx/vpmu_core2.h > create mode 100644 xen/include/public/arch-x86/xenpmu-x86.h > create mode 100644 xen/include/public/xenpmu.h > > diff --git a/xen/arch/x86/hvm/svm/vpmu.c b/xen/arch/x86/hvm/svm/vpmu.c > index a09930e..25532d0 100644 > --- a/xen/arch/x86/hvm/svm/vpmu.c > +++ b/xen/arch/x86/hvm/svm/vpmu.c > @@ -30,10 +30,7 @@ > #include <asm/apic.h> > #include <asm/hvm/vlapic.h> > #include <asm/hvm/vpmu.h> > - > -#define F10H_NUM_COUNTERS 4 > -#define F15H_NUM_COUNTERS 6 > -#define MAX_NUM_COUNTERS F15H_NUM_COUNTERS > +#include <public/xenpmu.h> > > #define MSR_F10H_EVNTSEL_GO_SHIFT 40 > #define MSR_F10H_EVNTSEL_EN_SHIFT 22 > @@ -49,6 +46,9 @@ static const u32 __read_mostly *counters; > static const u32 __read_mostly *ctrls; > static bool_t __read_mostly k7_counters_mirrored; > > +#define F10H_NUM_COUNTERS 4 > +#define F15H_NUM_COUNTERS 6 > + > /* PMU Counter MSRs. */ > static const u32 AMD_F10H_COUNTERS[] = { > MSR_K7_PERFCTR0, > @@ -83,13 +83,6 @@ static const u32 AMD_F15H_CTRLS[] = { > MSR_AMD_FAM15H_EVNTSEL5 > }; > > -/* storage for context switching */ > -struct amd_vpmu_context { > - u64 counters[MAX_NUM_COUNTERS]; > - u64 ctrls[MAX_NUM_COUNTERS]; > - bool_t msr_bitmap_set; > -}; > - > static inline int get_pmu_reg_type(u32 addr) > { > if ( (addr >= MSR_K7_EVNTSEL0) && (addr <= MSR_K7_EVNTSEL3) ) > diff --git a/xen/arch/x86/hvm/vmx/vpmu_core2.c > b/xen/arch/x86/hvm/vmx/vpmu_core2.c > index 50f784f..7d1da3f 100644 > --- a/xen/arch/x86/hvm/vmx/vpmu_core2.c > +++ b/xen/arch/x86/hvm/vmx/vpmu_core2.c > @@ -35,8 +35,8 @@ > #include <asm/hvm/vmx/vmcs.h> > #include <public/sched.h> > #include <public/hvm/save.h> > +#include <public/xenpmu.h> > #include <asm/hvm/vpmu.h> > -#include <asm/hvm/vmx/vpmu_core2.h> > > /* > * See Intel SDM Vol 2a Instruction Set Reference chapter 3 for CPUID > @@ -64,6 +64,10 @@ > #define PMU_FIXED_WIDTH_BITS 8 /* 8 bits 5..12 */ > #define PMU_FIXED_WIDTH_MASK (((1 << PMU_FIXED_WIDTH_BITS) -1) << > PMU_FIXED_WIDTH_SHIFT) > > +/* Intel-specific VPMU features */ > +#define VPMU_CPU_HAS_DS 0x100 /* Has Debug Store */ > +#define VPMU_CPU_HAS_BTS 0x200 /* Has Branch Trace Store > */ > + > /* > * MSR_CORE_PERF_FIXED_CTR_CTRL contains the configuration of all fixed > * counters. 4 bits for every counter. > @@ -71,16 +75,6 @@ > #define FIXED_CTR_CTRL_BITS 4 > #define FIXED_CTR_CTRL_MASK ((1 << FIXED_CTR_CTRL_BITS) - 1) > > -#define VPMU_CORE2_MAX_FIXED_PMCS 4 > -struct core2_vpmu_context { > - u64 fixed_ctrl; > - u64 ds_area; > - u64 pebs_enable; > - u64 global_ovf_status; > - u64 fix_counters[VPMU_CORE2_MAX_FIXED_PMCS]; > - struct arch_msr_pair arch_msr_pair[1]; > -}; > - > static int arch_pmc_cnt; /* Number of general-purpose performance counters */ > static int fixed_pmc_cnt; /* Number of fixed performance counters */ > > @@ -225,6 +219,7 @@ static int is_core2_vpmu_msr(u32 msr_index, int *type, > int *index) > return 0; > } > > +#define msraddr_to_bitpos(x) (((x)&0xffff) + ((x)>>31)*0x2000) > static void core2_vpmu_set_msr_bitmap(unsigned long *msr_bitmap) > { > int i; > @@ -349,8 +344,7 @@ static int core2_vpmu_alloc_resource(struct vcpu *v) > vmx_write_guest_msr(MSR_CORE_PERF_GLOBAL_CTRL, > core2_calc_intial_glb_ctrl_msr()); > > - core2_vpmu_cxt = xzalloc_bytes(sizeof(struct core2_vpmu_context) + > - (arch_pmc_cnt-1)*sizeof(struct arch_msr_pair)); > + core2_vpmu_cxt = xzalloc_bytes(sizeof(struct core2_vpmu_context)); > if ( !core2_vpmu_cxt ) > goto out_err; > > @@ -614,6 +608,18 @@ static void core2_vpmu_do_cpuid(unsigned int input, > *ecx |= cpufeat_mask(X86_FEATURE_DSCPL); > } > } > + else if ( input == 0xa ) > + { > + /* Limit number of counters to max that we support */ > + if ( ((*eax & PMU_GENERAL_NR_MASK) >> PMU_GENERAL_NR_SHIFT) > > + XENPMU_CORE2_MAX_ARCH_PMCS ) > + *eax = (*eax & ~PMU_GENERAL_NR_MASK) | > + (XENPMU_CORE2_MAX_ARCH_PMCS << PMU_GENERAL_NR_SHIFT); > + if ( ((*edx & PMU_FIXED_NR_MASK) >> PMU_FIXED_NR_SHIFT) > > + XENPMU_CORE2_MAX_FIXED_PMCS ) > + *eax = (*eax & ~PMU_FIXED_NR_MASK) | > + (XENPMU_CORE2_MAX_FIXED_PMCS << PMU_FIXED_NR_SHIFT); > + } > } > > /* Dump vpmu info on console, called in the context of keyhandler 'q'. */ > @@ -641,11 +647,10 @@ static void core2_vpmu_dump(struct vcpu *v) > > /* Print the contents of the counter and its configuration msr. */ > for ( i = 0; i < arch_pmc_cnt; i++ ) > - { > - struct arch_msr_pair* msr_pair = core2_vpmu_cxt->arch_msr_pair; > printk(" general_%d: 0x%016lx ctrl: 0x%016lx\n", > - i, msr_pair[i].counter, msr_pair[i].control); > - } > + i, core2_vpmu_cxt->arch_msr_pair[i].counter, > + core2_vpmu_cxt->arch_msr_pair[i].control); > + > /* > * The configuration of the fixed counter is 4 bits each in the > * MSR_CORE_PERF_FIXED_CTR_CTRL. > @@ -739,8 +744,8 @@ func_out: > > arch_pmc_cnt = core2_get_arch_pmc_count(); > fixed_pmc_cnt = core2_get_fixed_pmc_count(); > - if ( fixed_pmc_cnt > VPMU_CORE2_MAX_FIXED_PMCS ) > - fixed_pmc_cnt = VPMU_CORE2_MAX_FIXED_PMCS; > + if ( fixed_pmc_cnt > XENPMU_CORE2_MAX_FIXED_PMCS ) > + fixed_pmc_cnt = XENPMU_CORE2_MAX_FIXED_PMCS; > check_pmc_quirk(); > > return 0; > diff --git a/xen/arch/x86/hvm/vpmu.c b/xen/arch/x86/hvm/vpmu.c > index d6a9ff6..fa8cfd7 100644 > --- a/xen/arch/x86/hvm/vpmu.c > +++ b/xen/arch/x86/hvm/vpmu.c > @@ -31,6 +31,7 @@ > #include <asm/hvm/svm/svm.h> > #include <asm/hvm/svm/vmcb.h> > #include <asm/apic.h> > +#include <public/xenpmu.h> > > /* > * "vpmu" : vpmu generally enabled > diff --git a/xen/arch/x86/oprofile/op_model_ppro.c > b/xen/arch/x86/oprofile/op_model_ppro.c > index 3225937..5aae2e7 100644 > --- a/xen/arch/x86/oprofile/op_model_ppro.c > +++ b/xen/arch/x86/oprofile/op_model_ppro.c > @@ -20,11 +20,15 @@ > #include <asm/regs.h> > #include <asm/current.h> > #include <asm/hvm/vpmu.h> > -#include <asm/hvm/vmx/vpmu_core2.h> > > #include "op_x86_model.h" > #include "op_counter.h" > > +struct arch_msr_pair { > + u64 counter; > + u64 control; > +}; > + > /* > * Intel "Architectural Performance Monitoring" CPUID > * detection/enumeration details: > diff --git a/xen/include/asm-x86/hvm/vmx/vpmu_core2.h > b/xen/include/asm-x86/hvm/vmx/vpmu_core2.h > deleted file mode 100644 > index 410372d..0000000 > --- a/xen/include/asm-x86/hvm/vmx/vpmu_core2.h > +++ /dev/null > @@ -1,32 +0,0 @@ > - > -/* > - * vpmu_core2.h: CORE 2 specific PMU virtualization for HVM domain. > - * > - * Copyright (c) 2007, Intel Corporation. > - * > - * This program is free software; you can redistribute it and/or modify it > - * under the terms and conditions of the GNU General Public License, > - * version 2, as published by the Free Software Foundation. > - * > - * This program is distributed in the hope it will be useful, but WITHOUT > - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or > - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for > - * more details. > - * > - * You should have received a copy of the GNU General Public License along > with > - * this program; if not, write to the Free Software Foundation, Inc., 59 > Temple > - * Place - Suite 330, Boston, MA 02111-1307 USA. > - * > - * Author: Haitao Shan <haitao.shan@xxxxxxxxx> > - */ > - > -#ifndef __ASM_X86_HVM_VPMU_CORE_H_ > -#define __ASM_X86_HVM_VPMU_CORE_H_ > - > -struct arch_msr_pair { > - u64 counter; > - u64 control; > -}; > - > -#endif /* __ASM_X86_HVM_VPMU_CORE_H_ */ > - > diff --git a/xen/include/asm-x86/hvm/vpmu.h b/xen/include/asm-x86/hvm/vpmu.h > index 674cdad..50cdc4f 100644 > --- a/xen/include/asm-x86/hvm/vpmu.h > +++ b/xen/include/asm-x86/hvm/vpmu.h > @@ -22,6 +22,8 @@ > #ifndef __ASM_X86_HVM_VPMU_H_ > #define __ASM_X86_HVM_VPMU_H_ > > +#include <public/xenpmu.h> > + > /* > * Flag bits given as a string on the hypervisor boot parameter 'vpmu'. > * See arch/x86/hvm/vpmu.c. > @@ -29,12 +31,9 @@ > #define VPMU_BOOT_ENABLED 0x1 /* vpmu generally enabled. */ > #define VPMU_BOOT_BTS 0x2 /* Intel BTS feature wanted. */ > > - > -#define msraddr_to_bitpos(x) (((x)&0xffff) + ((x)>>31)*0x2000) > #define vcpu_vpmu(vcpu) (&((vcpu)->arch.hvm_vcpu.vpmu)) > #define vpmu_vcpu(vpmu) (container_of((vpmu), struct vcpu, \ > arch.hvm_vcpu.vpmu)) > -#define vpmu_domain(vpmu) (vpmu_vcpu(vpmu)->domain) > > #define MSR_TYPE_COUNTER 0 > #define MSR_TYPE_CTRL 1 > @@ -76,11 +75,6 @@ struct vpmu_struct { > #define VPMU_FROZEN 0x10 /* Stop counters while > VCPU is not running */ > #define VPMU_PASSIVE_DOMAIN_ALLOCATED 0x20 > > -/* VPMU features */ > -#define VPMU_CPU_HAS_DS 0x100 /* Has Debug Store */ > -#define VPMU_CPU_HAS_BTS 0x200 /* Has Branch Trace Store > */ > - > - > #define vpmu_set(_vpmu, _x) ((_vpmu)->flags |= (_x)) > #define vpmu_reset(_vpmu, _x) ((_vpmu)->flags &= ~(_x)) > #define vpmu_is_set(_vpmu, _x) ((_vpmu)->flags & (_x)) > diff --git a/xen/include/public/arch-x86/xenpmu-x86.h > b/xen/include/public/arch-x86/xenpmu-x86.h > new file mode 100644 > index 0000000..04e02b3 > --- /dev/null > +++ b/xen/include/public/arch-x86/xenpmu-x86.h > @@ -0,0 +1,62 @@ > +#ifndef __XEN_PUBLIC_ARCH_X86_PMU_H__ > +#define __XEN_PUBLIC_ARCH_X86_PMU_H__ > + > +/* x86-specific PMU definitions */ > + > + > +/* AMD PMU registers and structures */ > +#define XENPMU_AMD_MAX_COUNTERS 16 /* To accommodate more counters in > */ > + /* the future (e.g. NB counters) > */ > +struct amd_vpmu_context { > + uint64_t counters[XENPMU_AMD_MAX_COUNTERS]; > + uint64_t ctrls[XENPMU_AMD_MAX_COUNTERS]; > + uint8_t msr_bitmap_set; /* Used by HVM only */ > +}; > + > +/* Intel PMU registers and structures */ > +#define XENPMU_CORE2_MAX_ARCH_PMCS 16 > +#define XENPMU_CORE2_MAX_FIXED_PMCS 4 > +struct core2_vpmu_context { > + uint64_t global_ctrl; > + uint64_t global_ovf_ctrl; > + uint64_t global_status; > + uint64_t global_ovf_status; > + uint64_t fixed_ctrl; > + uint64_t ds_area; > + uint64_t pebs_enable; > + uint64_t debugctl; What is debugctl for? I couldn't find it in the other patches. > + uint64_t fix_counters[XENPMU_CORE2_MAX_FIXED_PMCS]; > + struct { > + uint64_t counter; > + uint64_t control; > + } arch_msr_pair[XENPMU_CORE2_MAX_ARCH_PMCS]; > +}; > + > +#define MAX(x, y) ((x) > (y) ? (x) : (y)) Maybe using MAX() from xen/kernel.h ? Dietmar. > +#define XENPMU_MAX_CTXT_SZ MAX(sizeof(struct amd_vpmu_context),\ > + sizeof(struct core2_vpmu_context)) > +#define XENPMU_CTXT_PAD_SZ (((XENPMU_MAX_CTXT_SZ + 64) & ~63) + 128) > +struct arch_xenpmu { > + union { > + struct cpu_user_regs regs; > + uint8_t pad2[256]; > + }; > + union { > + struct amd_vpmu_context amd; > + struct core2_vpmu_context intel; > + uint8_t pad1[XENPMU_CTXT_PAD_SZ]; > + }; > +}; > +typedef struct arch_xenpmu arch_xenpmu_t; > + > +#endif /* __XEN_PUBLIC_ARCH_X86_PMU_H__ */ > +/* > + * Local variables: > + * mode: C > + * c-file-style: "BSD" > + * c-basic-offset: 4 > + * tab-width: 4 > + * indent-tabs-mode: nil > + * End: > + */ > + > diff --git a/xen/include/public/xenpmu.h b/xen/include/public/xenpmu.h > new file mode 100644 > index 0000000..fbacd7e > --- /dev/null > +++ b/xen/include/public/xenpmu.h > @@ -0,0 +1,38 @@ > +#ifndef __XEN_PUBLIC_XENPMU_H__ > +#define __XEN_PUBLIC_XENPMU_H__ > + > +#include "xen.h" > +#if defined(__i386__) || defined(__x86_64__) > +#include "arch-x86/xenpmu-x86.h" > +#elif defined (__arm__) || defined (__aarch64__) > +#include "arch-arm.h" > +#else > +#error "Unsupported architecture" > +#endif > + > +#define XENPMU_VER_MAJ 0 > +#define XENPMU_VER_MIN 0 > + > + > +/* Shared between hypervisor and PV domain */ > +struct xenpmu_data { > + uint32_t domain_id; > + uint32_t vcpu_id; > + uint32_t pcpu_id; > + uint32_t pmu_flags; > + > + arch_xenpmu_t pmu; > +}; > +typedef struct xenpmu_data xenpmu_data_t; > + > +#endif /* __XEN_PUBLIC_XENPMU_H__ */ > + > +/* > + * Local variables: > + * mode: C > + * c-file-style: "BSD" > + * c-basic-offset: 4 > + * tab-width: 4 > + * indent-tabs-mode: nil > + * End: > + */ > -- Company details: http://ts.fujitsu.com/imprint.html _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |