diff options
Diffstat (limited to 'arch/x86/kernel/cpu/bugs.c')
| -rw-r--r-- | arch/x86/kernel/cpu/bugs.c | 27 | 
1 files changed, 13 insertions, 14 deletions
diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c index 0b71970d2d3d..d3f0db463f96 100644 --- a/arch/x86/kernel/cpu/bugs.c +++ b/arch/x86/kernel/cpu/bugs.c @@ -31,6 +31,7 @@  #include <asm/intel-family.h>  #include <asm/e820/api.h>  #include <asm/hypervisor.h> +#include <asm/tlbflush.h>  #include "cpu.h" @@ -543,14 +544,12 @@ static void __init spectre_v1_select_mitigation(void)  		 * If FSGSBASE is enabled, the user can put a kernel address in  		 * GS, in which case SMAP provides no protection.  		 * -		 * [ NOTE: Don't check for X86_FEATURE_FSGSBASE until the -		 *	   FSGSBASE enablement patches have been merged. ] -		 *  		 * If FSGSBASE is disabled, the user can only put a user space  		 * address in GS.  That makes an attack harder, but still  		 * possible if there's no SMAP protection.  		 */ -		if (!smap_works_speculatively()) { +		if (boot_cpu_has(X86_FEATURE_FSGSBASE) || +		    !smap_works_speculatively()) {  			/*  			 * Mitigation can be provided from SWAPGS itself or  			 * PTI as the CR3 write in the Meltdown mitigation @@ -763,10 +762,12 @@ spectre_v2_user_select_mitigation(enum spectre_v2_mitigation_cmd v2_cmd)  	}  	/* -	 * If enhanced IBRS is enabled or SMT impossible, STIBP is not +	 * If no STIBP, enhanced IBRS is enabled or SMT impossible, STIBP is not  	 * required.  	 */ -	if (!smt_possible || spectre_v2_enabled == SPECTRE_V2_IBRS_ENHANCED) +	if (!boot_cpu_has(X86_FEATURE_STIBP) || +	    !smt_possible || +	    spectre_v2_enabled == SPECTRE_V2_IBRS_ENHANCED)  		return;  	/* @@ -778,12 +779,6 @@ spectre_v2_user_select_mitigation(enum spectre_v2_mitigation_cmd v2_cmd)  	    boot_cpu_has(X86_FEATURE_AMD_STIBP_ALWAYS_ON))  		mode = SPECTRE_V2_USER_STRICT_PREFERRED; -	/* -	 * If STIBP is not available, clear the STIBP mode. -	 */ -	if (!boot_cpu_has(X86_FEATURE_STIBP)) -		mode = SPECTRE_V2_USER_NONE; -  	spectre_v2_user_stibp = mode;  set_mode: @@ -1270,7 +1265,6 @@ static int ib_prctl_set(struct task_struct *task, unsigned long ctrl)  		 * Indirect branch speculation is always disabled in strict  		 * mode. It can neither be enabled if it was force-disabled  		 * by a  previous prctl call. -  		 */  		if (spectre_v2_user_ibpb == SPECTRE_V2_USER_STRICT ||  		    spectre_v2_user_stibp == SPECTRE_V2_USER_STRICT || @@ -1556,7 +1550,12 @@ static ssize_t l1tf_show_state(char *buf)  static ssize_t itlb_multihit_show_state(char *buf)  { -	if (itlb_multihit_kvm_mitigation) +	if (!boot_cpu_has(X86_FEATURE_MSR_IA32_FEAT_CTL) || +	    !boot_cpu_has(X86_FEATURE_VMX)) +		return sprintf(buf, "KVM: Mitigation: VMX unsupported\n"); +	else if (!(cr4_read_shadow() & X86_CR4_VMXE)) +		return sprintf(buf, "KVM: Mitigation: VMX disabled\n"); +	else if (itlb_multihit_kvm_mitigation)  		return sprintf(buf, "KVM: Mitigation: Split huge pages\n");  	else  		return sprintf(buf, "KVM: Vulnerable\n");  |