diff options
Diffstat (limited to 'arch/x86/kernel/cpu/bugs.c')
| -rw-r--r-- | arch/x86/kernel/cpu/bugs.c | 12 | 
1 files changed, 11 insertions, 1 deletions
diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c index d71c8b54b696..bfca937bdcc3 100644 --- a/arch/x86/kernel/cpu/bugs.c +++ b/arch/x86/kernel/cpu/bugs.c @@ -300,6 +300,15 @@ retpoline_auto:  		setup_force_cpu_cap(X86_FEATURE_USE_IBPB);  		pr_info("Spectre v2 mitigation: Enabling Indirect Branch Prediction Barrier\n");  	} + +	/* +	 * Retpoline means the kernel is safe because it has no indirect +	 * branches. But firmware isn't, so use IBRS to protect that. +	 */ +	if (boot_cpu_has(X86_FEATURE_IBRS)) { +		setup_force_cpu_cap(X86_FEATURE_USE_IBRS_FW); +		pr_info("Enabling Restricted Speculation for firmware calls\n"); +	}  }  #undef pr_fmt @@ -326,8 +335,9 @@ ssize_t cpu_show_spectre_v2(struct device *dev, struct device_attribute *attr, c  	if (!boot_cpu_has_bug(X86_BUG_SPECTRE_V2))  		return sprintf(buf, "Not affected\n"); -	return sprintf(buf, "%s%s%s\n", spectre_v2_strings[spectre_v2_enabled], +	return sprintf(buf, "%s%s%s%s\n", spectre_v2_strings[spectre_v2_enabled],  		       boot_cpu_has(X86_FEATURE_USE_IBPB) ? ", IBPB" : "", +		       boot_cpu_has(X86_FEATURE_USE_IBRS_FW) ? ", IBRS_FW" : "",  		       spectre_v2_module_string());  }  #endif  |