[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v3 11/22] x86/CPUID: move bounding of max_{,sub}leaf fields to library code
Break out this logic from calculate_host_policy() to also use it in the x86 emulator harness, where subsequently we'll want to avoid open-coding AMX maximum palette bounding. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> --- v2: New. --- a/tools/tests/x86_emulator/x86-emulate.c +++ b/tools/tests/x86_emulator/x86-emulate.c @@ -79,6 +79,7 @@ bool emul_test_init(void) unsigned long sp; x86_cpuid_policy_fill_native(&cp); + x86_cpuid_policy_bound_max_leaves(&cp); /* * The emulator doesn't use these instructions, so can always emulate @@ -91,6 +92,8 @@ bool emul_test_init(void) cp.feat.rdpid = true; cp.extd.clzero = true; + x86_cpuid_policy_shrink_max_leaves(&cp); + if ( cpu_has_xsave ) { unsigned int tmp, ebx; --- a/xen/arch/x86/cpuid.c +++ b/xen/arch/x86/cpuid.c @@ -322,12 +322,7 @@ static void __init calculate_host_policy *p = raw_cpuid_policy; - p->basic.max_leaf = - min_t(uint32_t, p->basic.max_leaf, ARRAY_SIZE(p->basic.raw) - 1); - p->feat.max_subleaf = - min_t(uint32_t, p->feat.max_subleaf, ARRAY_SIZE(p->feat.raw) - 1); - p->extd.max_leaf = 0x80000000 | min_t(uint32_t, p->extd.max_leaf & 0xffff, - ARRAY_SIZE(p->extd.raw) - 1); + x86_cpuid_policy_bound_max_leaves(p); cpuid_featureset_to_policy(boot_cpu_data.x86_capability, p); recalculate_xstate(p); --- a/xen/include/xen/lib/x86/cpuid.h +++ b/xen/include/xen/lib/x86/cpuid.h @@ -352,6 +352,12 @@ void x86_cpuid_policy_fill_native(struct void x86_cpuid_policy_clear_out_of_range_leaves(struct cpuid_policy *p); /** + * Bound max leaf/subleaf values according to the capacity of the respective + * arrays in struct cpuid_policy. + */ +void x86_cpuid_policy_bound_max_leaves(struct cpuid_policy *p); + +/** * Shrink max leaf/subleaf values such that the last respective valid entry * isn't all blank. While permitted by the spec, such extraneous leaves may * provide undue "hints" to guests. --- a/xen/lib/x86/cpuid.c +++ b/xen/lib/x86/cpuid.c @@ -238,6 +238,16 @@ void x86_cpuid_policy_clear_out_of_range ARRAY_SIZE(p->extd.raw) - 1); } +void x86_cpuid_policy_bound_max_leaves(struct cpuid_policy *p) +{ + p->basic.max_leaf = + min_t(uint32_t, p->basic.max_leaf, ARRAY_SIZE(p->basic.raw) - 1); + p->feat.max_subleaf = + min_t(uint32_t, p->feat.max_subleaf, ARRAY_SIZE(p->feat.raw) - 1); + p->extd.max_leaf = 0x80000000 | min_t(uint32_t, p->extd.max_leaf & 0xffff, + ARRAY_SIZE(p->extd.raw) - 1); +} + void x86_cpuid_policy_shrink_max_leaves(struct cpuid_policy *p) { unsigned int i;
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |