From e63d8abbe760fce8507549fd5e46d337beca7244 Mon Sep 17 00:00:00 2001 From: Boris Ostrovsky Date: Wed, 1 Mar 2017 17:51:16 +0100 Subject: [PATCH] x86/vpmu: disable VPMU if guest's CPUID indicates no PMU support When toolstack overrides Intel CPUID leaf 0xa's PMU version with an invalid value VPMU should not be available to the guest. Signed-off-by: Boris Ostrovsky Reviewed-by: Jan Beulich Reviewed-by: Kevin Tian --- xen/arch/x86/cpu/vpmu_intel.c | 4 ++++ xen/arch/x86/domctl.c | 14 ++++++++++++++ xen/include/asm-x86/cpuid.h | 12 ++++++++++++ 3 files changed, 30 insertions(+) diff --git a/xen/arch/x86/cpu/vpmu_intel.c b/xen/arch/x86/cpu/vpmu_intel.c index 0ce68f1b70..626bed561a 100644 --- a/xen/arch/x86/cpu/vpmu_intel.c +++ b/xen/arch/x86/cpu/vpmu_intel.c @@ -883,6 +883,10 @@ int vmx_vpmu_initialise(struct vcpu *v) if ( vpmu_mode == XENPMU_MODE_OFF ) return 0; + if ( v->domain->arch.cpuid->basic.pmu_version <= 1 || + v->domain->arch.cpuid->basic.pmu_version >= 5 ) + return -EINVAL; + if ( (arch_pmc_cnt + fixed_pmc_cnt) == 0 ) return -EINVAL; diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c index d5f8d2fd21..02b48e85c1 100644 --- a/xen/arch/x86/domctl.c +++ b/xen/arch/x86/domctl.c @@ -252,6 +252,20 @@ static int update_domain_cpuid_info(struct domain *d, } break; + case 0xa: + if ( boot_cpu_data.x86_vendor != X86_VENDOR_INTEL ) + break; + + /* If PMU version is zero then the guest doesn't have VPMU */ + if ( p->basic.pmu_version == 0 ) + { + struct vcpu *v; + + for_each_vcpu ( d, v ) + vpmu_destroy(v); + } + break; + case 0xd: if ( ctl->input[1] != 1 ) break; diff --git a/xen/include/asm-x86/cpuid.h b/xen/include/asm-x86/cpuid.h index 6d1990bfe2..aa482b719f 100644 --- a/xen/include/asm-x86/cpuid.h +++ b/xen/include/asm-x86/cpuid.h @@ -122,6 +122,18 @@ struct cpuid_policy /* Leaf 0x2 - TLB/Cache/Prefetch. */ uint8_t l2_nr_queries; /* Documented as fixed to 1. */ + uint8_t l2_desc[15]; + + uint64_t :64, :64; /* Leaf 0x3 - PSN. */ + uint64_t :64, :64; /* Leaf 0x4 - Structured Cache. */ + uint64_t :64, :64; /* Leaf 0x5 - MONITOR. */ + uint64_t :64, :64; /* Leaf 0x6 - Therm/Perf. */ + uint64_t :64, :64; /* Leaf 0x7 - Structured Features. */ + uint64_t :64, :64; /* Leaf 0x8 - rsvd */ + uint64_t :64, :64; /* Leaf 0x9 - DCA */ + + /* Leaf 0xa - Intel PMU. */ + uint8_t pmu_version; }; } basic; -- 2.30.2