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 <boris.ostrovsky@oracle.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
This commit is contained in:
Boris Ostrovsky authored and Jan Beulich committed 2017-03-01 17:51:16 +01:00
1 parent 4a970125d1
commit e63d8abbe7
3 files changed
+30

No files matched your search

+4
View File
@@ -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;
+14
View File
@@ -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;
+12
View File
@@ -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;
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.