[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 1/3] x86/VPMU: Support only versions 2 through 4 of architectural performance monitoring
We need to have at least version 2 since it's the first version to support various control and status registers (such as MSR_CORE_PERF_GLOBAL_CTRL) that VPMU relies on always having. Since we don't fully support version 4 yet report it as version 3 in CPUID. With explicit testing for PMU version we can now remove CPUID model check. Signed-off-by: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx> --- v2: * Support PMU version 4 (emulated at version 3 level) * Minor code adjustments xen/arch/x86/cpu/vpmu_intel.c | 73 ++++++++++++++----------------------------- 1 file changed, 23 insertions(+), 50 deletions(-) diff --git a/xen/arch/x86/cpu/vpmu_intel.c b/xen/arch/x86/cpu/vpmu_intel.c index d5ea7fe..a267a3c 100644 --- a/xen/arch/x86/cpu/vpmu_intel.c +++ b/xen/arch/x86/cpu/vpmu_intel.c @@ -733,11 +733,11 @@ static void core2_vpmu_do_cpuid(unsigned int input, unsigned int *eax, unsigned int *ebx, unsigned int *ecx, unsigned int *edx) { - if (input == 0x1) + switch ( input ) { - struct vpmu_struct *vpmu = vcpu_vpmu(current); + case 0x1: - if ( vpmu_is_set(vpmu, VPMU_CPU_HAS_DS) ) + if ( vpmu_is_set(vcpu_vpmu(current), VPMU_CPU_HAS_DS) ) { /* Switch on the 'Debug Store' feature in CPUID.EAX[1]:EDX[21] */ *edx |= cpufeat_mask(X86_FEATURE_DS); @@ -746,6 +746,13 @@ static void core2_vpmu_do_cpuid(unsigned int input, if ( cpu_has(¤t_cpu_data, X86_FEATURE_DSCPL) ) *ecx |= cpufeat_mask(X86_FEATURE_DSCPL); } + break; + + case 0xa: + /* Since we don't fully emulate version 4 report version 3 */ + if ( MASK_EXTR(*eax, PMU_VERSION_MASK) == 4 ) + *eax = (*eax & ~PMU_VERSION_MASK) | MASK_INSR(3, PMU_VERSION_MASK); + break; } } @@ -955,59 +962,25 @@ int vmx_vpmu_initialise(struct vcpu *v) int __init core2_vpmu_init(void) { u64 caps; + unsigned int version = 0; - if ( current_cpu_data.x86 != 6 ) + if ( current_cpu_data.cpuid_level >= 0xa ) + version = MASK_EXTR(cpuid_eax(0xa), PMU_VERSION_MASK); + + if ( version == 4 ) + printk(XENLOG_INFO "VPMU: PMU version 4 is not fully supported. " + "Emulating version 3\n"); + else if ( (version != 2) && (version != 3) ) { - printk(XENLOG_WARNING "VPMU: only family 6 is supported\n"); + printk(XENLOG_WARNING "VPMU: PMU version %u is not supported\n", + version); return -EINVAL; } - switch ( current_cpu_data.x86_model ) + if ( current_cpu_data.x86 != 6 ) { - /* Core2: */ - case 0x0f: /* original 65 nm celeron/pentium/core2/xeon, "Merom"/"Conroe" */ - case 0x16: /* single-core 65 nm celeron/core2solo "Merom-L"/"Conroe-L" */ - case 0x17: /* 45 nm celeron/core2/xeon "Penryn"/"Wolfdale" */ - case 0x1d: /* six-core 45 nm xeon "Dunnington" */ - - case 0x2a: /* SandyBridge */ - case 0x2d: /* SandyBridge, "Romley-EP" */ - - /* Nehalem: */ - case 0x1a: /* 45 nm nehalem, "Bloomfield" */ - case 0x1e: /* 45 nm nehalem, "Lynnfield", "Clarksfield", "Jasper Forest" */ - case 0x2e: /* 45 nm nehalem-ex, "Beckton" */ - - /* Westmere: */ - case 0x25: /* 32 nm nehalem, "Clarkdale", "Arrandale" */ - case 0x2c: /* 32 nm nehalem, "Gulftown", "Westmere-EP" */ - case 0x2f: /* 32 nm Westmere-EX */ - - case 0x3a: /* IvyBridge */ - case 0x3e: /* IvyBridge EP */ - - /* Haswell: */ - case 0x3c: - case 0x3f: - case 0x45: - case 0x46: - - /* Broadwell */ - case 0x3d: - case 0x4f: - case 0x56: - - /* future: */ - case 0x4e: - - /* next gen Xeon Phi */ - case 0x57: - break; - - default: - printk(XENLOG_WARNING "VPMU: Unsupported CPU model %#x\n", - current_cpu_data.x86_model); - return -EINVAL; + printk(XENLOG_WARNING "VPMU: only family 6 is supported\n"); + return -EINVAL; } arch_pmc_cnt = core2_get_arch_pmc_count(); -- 1.8.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |