diff options
Diffstat (limited to 'arch/x86/kernel/cpu/common.c')
| -rw-r--r-- | arch/x86/kernel/cpu/common.c | 33 | 
1 files changed, 13 insertions, 20 deletions
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 2e4d90294fe6..52c9bfbbdb2a 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c @@ -14,6 +14,7 @@  #include <linux/sched/mm.h>  #include <linux/sched/clock.h>  #include <linux/sched/task.h> +#include <linux/sched/smt.h>  #include <linux/init.h>  #include <linux/kprobes.h>  #include <linux/kgdb.h> @@ -49,7 +50,7 @@  #include <asm/cpu.h>  #include <asm/mce.h>  #include <asm/msr.h> -#include <asm/pat.h> +#include <asm/memtype.h>  #include <asm/microcode.h>  #include <asm/microcode_intel.h>  #include <asm/intel-family.h> @@ -163,22 +164,6 @@ DEFINE_PER_CPU_PAGE_ALIGNED(struct gdt_page, gdt_page) = { .gdt = {  } };  EXPORT_PER_CPU_SYMBOL_GPL(gdt_page); -static int __init x86_mpx_setup(char *s) -{ -	/* require an exact match without trailing characters */ -	if (strlen(s)) -		return 0; - -	/* do not emit a message if the feature is not present */ -	if (!boot_cpu_has(X86_FEATURE_MPX)) -		return 1; - -	setup_clear_cpu_cap(X86_FEATURE_MPX); -	pr_info("nompx: Intel Memory Protection Extensions (MPX) disabled\n"); -	return 1; -} -__setup("nompx", x86_mpx_setup); -  #ifdef CONFIG_X86_64  static int __init x86_nopcid_setup(char *s)  { @@ -305,8 +290,6 @@ static inline void squash_the_stupid_serial_number(struct cpuinfo_x86 *c)  static __init int setup_disable_smep(char *arg)  {  	setup_clear_cpu_cap(X86_FEATURE_SMEP); -	/* Check for things that depend on SMEP being enabled: */ -	check_mpx_erratum(&boot_cpu_data);  	return 1;  }  __setup("nosmep", setup_disable_smep); @@ -1023,6 +1006,7 @@ static void identify_cpu_without_cpuid(struct cpuinfo_x86 *c)  #define MSBDS_ONLY		BIT(5)  #define NO_SWAPGS		BIT(6)  #define NO_ITLB_MULTIHIT	BIT(7) +#define NO_SPECTRE_V2		BIT(8)  #define VULNWL(_vendor, _family, _model, _whitelist)	\  	{ X86_VENDOR_##_vendor, _family, _model, X86_FEATURE_ANY, _whitelist } @@ -1084,6 +1068,10 @@ static const __initconst struct x86_cpu_id cpu_vuln_whitelist[] = {  	/* FAMILY_ANY must be last, otherwise 0x0f - 0x12 matches won't work */  	VULNWL_AMD(X86_FAMILY_ANY,	NO_MELTDOWN | NO_L1TF | NO_MDS | NO_SWAPGS | NO_ITLB_MULTIHIT),  	VULNWL_HYGON(X86_FAMILY_ANY,	NO_MELTDOWN | NO_L1TF | NO_MDS | NO_SWAPGS | NO_ITLB_MULTIHIT), + +	/* Zhaoxin Family 7 */ +	VULNWL(CENTAUR,	7, X86_MODEL_ANY,	NO_SPECTRE_V2 | NO_SWAPGS), +	VULNWL(ZHAOXIN,	7, X86_MODEL_ANY,	NO_SPECTRE_V2 | NO_SWAPGS),  	{}  }; @@ -1116,7 +1104,9 @@ static void __init cpu_set_bug_bits(struct cpuinfo_x86 *c)  		return;  	setup_force_cpu_bug(X86_BUG_SPECTRE_V1); -	setup_force_cpu_bug(X86_BUG_SPECTRE_V2); + +	if (!cpu_matches(NO_SPECTRE_V2)) +		setup_force_cpu_bug(X86_BUG_SPECTRE_V2);  	if (!cpu_matches(NO_SSB) && !(ia32_cap & ARCH_CAP_SSB_NO) &&  	   !cpu_has(c, X86_FEATURE_AMD_SSB_NO)) @@ -1449,6 +1439,9 @@ static void identify_cpu(struct cpuinfo_x86 *c)  #endif  	c->x86_cache_alignment = c->x86_clflush_size;  	memset(&c->x86_capability, 0, sizeof(c->x86_capability)); +#ifdef CONFIG_X86_VMX_FEATURE_NAMES +	memset(&c->vmx_capability, 0, sizeof(c->vmx_capability)); +#endif  	generic_identify(c);  |