mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86: suppress ERMS for internal use when MISC_ENABLE.FAST_STRING is clear
Before we start actually adjusting behavior when ERMS is available,
follow Linux commit 161ec53c702c ("x86, mem, intel: Initialize Enhanced
REP MOVSB/STOSB") and zap the CPUID-derived feature flag when the MSR
bit is clear.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Jason Andryuk <jason.andryuk@amd.com>
This commit is contained in:
1 parent
970b185ab5
commit
5cbaa5d92e
3 files changed
+24
No files matched your search
@@ -501,6 +501,12 @@ static void __init guest_common_max_feature_adjustments(uint32_t *fs)
|
||||
*/
|
||||
__set_bit(X86_FEATURE_HTT, fs);
|
||||
__set_bit(X86_FEATURE_CMP_LEGACY, fs);
|
||||
|
||||
/*
|
||||
* ERMS is a performance hint. A VM which previously saw ERMS will
|
||||
* function correctly when migrated here, even if ERMS isn't available.
|
||||
*/
|
||||
__set_bit(X86_FEATURE_ERMS, fs);
|
||||
}
|
||||
|
||||
static void __init guest_common_default_feature_adjustments(uint32_t *fs)
|
||||
@@ -588,6 +594,13 @@ static void __init guest_common_default_feature_adjustments(uint32_t *fs)
|
||||
|
||||
if ( !cpu_has_cmp_legacy )
|
||||
__clear_bit(X86_FEATURE_CMP_LEGACY, fs);
|
||||
|
||||
/*
|
||||
* ERMS is a performance hint, so is set unconditionally in the max
|
||||
* policy. However, guests should default to the host setting.
|
||||
*/
|
||||
if ( !host_cpu_policy.feat.erms )
|
||||
__clear_bit(X86_FEATURE_ERMS, fs);
|
||||
}
|
||||
|
||||
static void __init guest_common_feature_adjustments(uint32_t *fs)
|
||||
|
||||
@@ -363,8 +363,18 @@ static void cf_check early_init_intel(struct cpuinfo_x86 *c)
|
||||
paddr_bits = 36;
|
||||
|
||||
if (c == &boot_cpu_data) {
|
||||
uint64_t misc_enable;
|
||||
|
||||
check_memory_type_self_snoop_errata();
|
||||
|
||||
/*
|
||||
* If fast string is not enabled in IA32_MISC_ENABLE for any reason,
|
||||
* clear the enhanced fast string CPU capability.
|
||||
*/
|
||||
rdmsrl(MSR_IA32_MISC_ENABLE, misc_enable);
|
||||
if (!(misc_enable & MSR_IA32_MISC_ENABLE_FAST_STRING))
|
||||
setup_clear_cpu_cap(X86_FEATURE_ERMS);
|
||||
|
||||
intel_init_levelling();
|
||||
}
|
||||
|
||||
|
||||
@@ -493,6 +493,7 @@
|
||||
#define MSR_IA32_THERM_INTERRUPT 0x0000019b
|
||||
#define MSR_IA32_THERM_STATUS 0x0000019c
|
||||
#define MSR_IA32_MISC_ENABLE 0x000001a0
|
||||
#define MSR_IA32_MISC_ENABLE_FAST_STRING (1<<0)
|
||||
#define MSR_IA32_MISC_ENABLE_PERF_AVAIL (1<<7)
|
||||
#define MSR_IA32_MISC_ENABLE_BTS_UNAVAIL (1<<11)
|
||||
#define MSR_IA32_MISC_ENABLE_PEBS_UNAVAIL (1<<12)
|
||||
|
||||