summaryrefslogtreecommitdiff
path: root/arch/x86/kernel/cpu/amd.c
diff options
context:
space:
mode:
authorBorislav Petkov (AMD) <bp@alien8.de>2023-08-07 11:46:04 +0300
committerBorislav Petkov (AMD) <bp@alien8.de>2023-08-07 11:53:08 +0300
commit5a15d8348881e9371afdf9f5357a135489496955 (patch)
tree477c10789c4ac4d317cc375926e6eda917baf0d3 /arch/x86/kernel/cpu/amd.c
parent3bbbe97ad83db8d9df06daf027b0840188de625d (diff)
downloadlinux-5a15d8348881e9371afdf9f5357a135489496955.tar.xz
x86/srso: Tie SBPB bit setting to microcode patch detection
The SBPB bit in MSR_IA32_PRED_CMD is supported only after a microcode patch has been applied so set X86_FEATURE_SBPB only then. Otherwise, guests would attempt to set that bit and #GP on the MSR write. While at it, make SMT detection more robust as some guests - depending on how and what CPUID leafs their report - lead to cpu_smt_control getting set to CPU_SMT_NOT_SUPPORTED but SRSO_NO should be set for any guest incarnation where one simply cannot do SMT, for whatever reason. Fixes: fb3bd914b3ec ("x86/srso: Add a Speculative RAS Overflow mitigation") Reported-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Reported-by: Salvatore Bonaccorso <carnil@debian.org> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Diffstat (limited to 'arch/x86/kernel/cpu/amd.c')
-rw-r--r--arch/x86/kernel/cpu/amd.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
index 834f310b2f1a..41e10c26efb5 100644
--- a/arch/x86/kernel/cpu/amd.c
+++ b/arch/x86/kernel/cpu/amd.c
@@ -1238,14 +1238,19 @@ EXPORT_SYMBOL_GPL(amd_get_highest_perf);
bool cpu_has_ibpb_brtype_microcode(void)
{
- u8 fam = boot_cpu_data.x86;
-
+ switch (boot_cpu_data.x86) {
/* Zen1/2 IBPB flushes branch type predictions too. */
- if (fam == 0x17)
+ case 0x17:
return boot_cpu_has(X86_FEATURE_AMD_IBPB);
- /* Poke the MSR bit on Zen3/4 to check its presence. */
- else if (fam == 0x19)
- return !wrmsrl_safe(MSR_IA32_PRED_CMD, PRED_CMD_SBPB);
- else
+ case 0x19:
+ /* Poke the MSR bit on Zen3/4 to check its presence. */
+ if (!wrmsrl_safe(MSR_IA32_PRED_CMD, PRED_CMD_SBPB)) {
+ setup_force_cpu_cap(X86_FEATURE_SBPB);
+ return true;
+ } else {
+ return false;
+ }
+ default:
return false;
+ }
}