[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen staging] libx86: Recalculate synthesised cpuid_policy fields when appropriate
commit e88afede8cbc18032bcab49b3a25b472d5516cf5 Author: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> AuthorDate: Tue Jul 10 13:53:21 2018 +0100 Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> CommitDate: Wed Mar 27 14:45:47 2019 +0000 libx86: Recalculate synthesised cpuid_policy fields when appropriate When filling a policy, either from CPUID or an incomming leaf stream, recalculate the synthesised vendor value. All callers are expected to want this behaviour. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> --- xen/arch/x86/cpuid.c | 3 ++- xen/include/xen/lib/x86/cpuid.h | 8 +++++--- xen/lib/x86/cpuid.c | 11 +++++++++++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/xen/arch/x86/cpuid.c b/xen/arch/x86/cpuid.c index b5eb584a47..cb170ac4d7 100644 --- a/xen/arch/x86/cpuid.c +++ b/xen/arch/x86/cpuid.c @@ -272,7 +272,8 @@ static void __init calculate_raw_policy(void) x86_cpuid_policy_fill_native(p); - p->x86_vendor = boot_cpu_data.x86_vendor; + /* Nothing good will come from Xen and libx86 disagreeing on vendor. */ + ASSERT(p->x86_vendor == boot_cpu_data.x86_vendor); } static void __init calculate_host_policy(void) diff --git a/xen/include/xen/lib/x86/cpuid.h b/xen/include/xen/lib/x86/cpuid.h index f392c78358..c7a3bffeda 100644 --- a/xen/include/xen/lib/x86/cpuid.h +++ b/xen/include/xen/lib/x86/cpuid.h @@ -297,8 +297,9 @@ const uint32_t *x86_cpuid_lookup_deep_deps(uint32_t feature); /** * Fill a CPUID policy using the native CPUID instruction. * - * No sanitisation is performed. Values may be influenced by a hypervisor or - * from masking/faulting configuration. + * No sanitisation is performed, but synthesised values are calculated. + * Values may be influenced by a hypervisor or from masking/faulting + * configuration. */ void x86_cpuid_policy_fill_native(struct cpuid_policy *p); @@ -339,7 +340,8 @@ int x86_cpuid_copy_to_buffer(const struct cpuid_policy *policy, * incoming leaf is out of range of cpuid_policy, in which case the optional * err_* pointers are filled to aid diagnostics. * - * No content validation of in-range leaves is performed. + * No content validation of in-range leaves is performed. Synthesised data is + * recalculated. */ int x86_cpuid_copy_from_buffer(struct cpuid_policy *policy, const cpuid_leaf_buffer_t leaves, diff --git a/xen/lib/x86/cpuid.c b/xen/lib/x86/cpuid.c index 104a867064..311d19e471 100644 --- a/xen/lib/x86/cpuid.c +++ b/xen/lib/x86/cpuid.c @@ -34,6 +34,13 @@ unsigned int x86_cpuid_lookup_vendor(uint32_t ebx, uint32_t ecx, uint32_t edx) return X86_VENDOR_UNKNOWN; } +/* Recalculate the content in a CPUID policy which is derived from raw data. */ +static void recalculate_synth(struct cpuid_policy *p) +{ + p->x86_vendor = x86_cpuid_lookup_vendor( + p->basic.vendor_ebx, p->basic.vendor_ecx, p->basic.vendor_edx); +} + void x86_cpuid_policy_fill_native(struct cpuid_policy *p) { unsigned int i; @@ -141,6 +148,8 @@ void x86_cpuid_policy_fill_native(struct cpuid_policy *p) for ( i = 1; i < min_t(unsigned int, ARRAY_SIZE(p->extd.raw), p->extd.max_leaf + 1 - 0x80000000); ++i ) cpuid_leaf(0x80000000 + i, &p->extd.raw[i]); + + recalculate_synth(p); } const uint32_t *x86_cpuid_lookup_deep_deps(uint32_t feature) @@ -363,6 +372,8 @@ int x86_cpuid_copy_from_buffer(struct cpuid_policy *p, } } + recalculate_synth(p); + return 0; out_of_range: -- generated by git-patchbot for /home/xen/git/xen.git#staging _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |