47 lines
1.6 KiB
Diff
47 lines
1.6 KiB
Diff
|
# Commit a1ac4cf52e38386bac7ac3440c7da0099662ca5c
|
||
|
# Date 2014-07-29 17:02:25 +0200
|
||
|
# Author Andrew Cooper <andrew.cooper3@citrix.com>
|
||
|
# Committer Jan Beulich <jbeulich@suse.com>
|
||
|
x86/cpu: undo BIOS CPUID max_leaf limit before querying for features
|
||
|
|
||
|
If IA32_MISC_ENABLE[22] is set by the BIOS, CPUID.0.EAX will be limited to 3.
|
||
|
Lift this limit before considering whether to query CPUID.7[ECX=0].EBX for
|
||
|
features.
|
||
|
|
||
|
Without this change, dom0 is able to see this feature leaf (as the limit was
|
||
|
subsequently lifted), and will set features appropriately in HVM domain cpuid
|
||
|
policies.
|
||
|
|
||
|
The specific bug XenServer observed was the advertisement of the FSGSBASE
|
||
|
feature, but an inability to set CR4.FSGSBASE as Xen considered the bit to be
|
||
|
reserved as cpu_has_fsgsbase incorrectly evaluated as false.
|
||
|
|
||
|
This is a regression introduced by c/s 44e24f8567 "x86: don't call
|
||
|
generic_identify() redundantly" where the redundant call actually resampled
|
||
|
CPUID.7[ECX=0] properly to obtain the feature flags.
|
||
|
|
||
|
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
|
||
|
Reviewed-by: Jan Beulich <jbeulich@suse.com>
|
||
|
|
||
|
--- a/xen/arch/x86/cpu/common.c
|
||
|
+++ b/xen/arch/x86/cpu/common.c
|
||
|
@@ -234,6 +234,9 @@ static void __cpuinit generic_identify(s
|
||
|
paddr_bits = cpuid_eax(0x80000008) & 0xff;
|
||
|
}
|
||
|
|
||
|
+ /* Might lift BIOS max_leaf=3 limit. */
|
||
|
+ early_intel_workaround(c);
|
||
|
+
|
||
|
/* Intel-defined flags: level 0x00000007 */
|
||
|
if ( c->cpuid_level >= 0x00000007 ) {
|
||
|
u32 dummy;
|
||
|
@@ -241,8 +244,6 @@ static void __cpuinit generic_identify(s
|
||
|
c->x86_capability[X86_FEATURE_FSGSBASE / 32] = ebx;
|
||
|
}
|
||
|
|
||
|
- early_intel_workaround(c);
|
||
|
-
|
||
|
#ifdef CONFIG_X86_HT
|
||
|
c->phys_proc_id = (cpuid_ebx(1) >> 24) & 0xff;
|
||
|
#endif
|