summaryrefslogtreecommitdiff
path: root/arch/x86/kernel/cpu/bugs.c
diff options
context:
space:
mode:
authorBorislav Petkov (AMD) <bp@alien8.de>2023-06-29 17:43:40 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2023-08-08 19:57:40 +0200
commite47af0c255aed7da91202f26250558a8e34e1c26 (patch)
tree8522082b66f60bd13ca37f35b4d0895432368d7f /arch/x86/kernel/cpu/bugs.c
parentdf76a59feba549825f426cb1586bfa86b49c08fa (diff)
x86/srso: Add SRSO_NO support
Upstream commit: 1b5277c0ea0b247393a9c426769fde18cff5e2f6 Add support for the CPUID flag which denotes that the CPU is not affected by SRSO. Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'arch/x86/kernel/cpu/bugs.c')
-rw-r--r--arch/x86/kernel/cpu/bugs.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c
index 90a91ef0fc64..7bb6750fbd75 100644
--- a/arch/x86/kernel/cpu/bugs.c
+++ b/arch/x86/kernel/cpu/bugs.c
@@ -56,6 +56,9 @@ EXPORT_SYMBOL_GPL(x86_spec_ctrl_base);
DEFINE_PER_CPU(u64, x86_spec_ctrl_current);
EXPORT_SYMBOL_GPL(x86_spec_ctrl_current);
+u64 x86_pred_cmd __ro_after_init = PRED_CMD_IBPB;
+EXPORT_SYMBOL_GPL(x86_pred_cmd);
+
static DEFINE_MUTEX(spec_ctrl_mutex);
/* Update SPEC_CTRL MSR and its cached copy unconditionally */
@@ -2284,7 +2287,7 @@ static void __init srso_select_mitigation(void)
bool has_microcode;
if (!boot_cpu_has_bug(X86_BUG_SRSO) || cpu_mitigations_off())
- return;
+ goto pred_cmd;
/*
* The first check is for the kernel running as a guest in order
@@ -2297,9 +2300,18 @@ static void __init srso_select_mitigation(void)
} else {
/*
* Enable the synthetic (even if in a real CPUID leaf)
- * flag for guests.
+ * flags for guests.
*/
setup_force_cpu_cap(X86_FEATURE_IBPB_BRTYPE);
+ setup_force_cpu_cap(X86_FEATURE_SBPB);
+
+ /*
+ * Zen1/2 with SMT off aren't vulnerable after the right
+ * IBPB microcode has been applied.
+ */
+ if ((boot_cpu_data.x86 < 0x19) &&
+ (cpu_smt_control == CPU_SMT_DISABLED))
+ setup_force_cpu_cap(X86_FEATURE_SRSO_NO);
}
switch (srso_cmd) {
@@ -2322,16 +2334,20 @@ static void __init srso_select_mitigation(void)
srso_mitigation = SRSO_MITIGATION_SAFE_RET;
} else {
pr_err("WARNING: kernel not compiled with CPU_SRSO.\n");
- return;
+ goto pred_cmd;
}
break;
default:
break;
-
}
pr_info("%s%s\n", srso_strings[srso_mitigation], (has_microcode ? "" : ", no microcode"));
+
+pred_cmd:
+ if (boot_cpu_has(X86_FEATURE_SRSO_NO) ||
+ srso_cmd == SRSO_CMD_OFF)
+ x86_pred_cmd = PRED_CMD_SBPB;
}
#undef pr_fmt