Commit c5f1e32e authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'x86-urgent-2022-08-13' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull x86 fix from Ingo Molnar:
 "Fix the 'IBPB mitigated RETBleed' mode of operation on AMD CPUs (not
  turned on by default), which also need STIBP enabled (if available) to
  be '100% safe' on even the shortest speculation windows"

* tag 'x86-urgent-2022-08-13' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86/bugs: Enable STIBP for IBPB mitigated RETBleed
parents 04734361 e6cfcdda
...@@ -5274,20 +5274,33 @@ ...@@ -5274,20 +5274,33 @@
Speculative Code Execution with Return Instructions) Speculative Code Execution with Return Instructions)
vulnerability. vulnerability.
AMD-based UNRET and IBPB mitigations alone do not stop
sibling threads from influencing the predictions of other
sibling threads. For that reason, STIBP is used on pro-
cessors that support it, and mitigate SMT on processors
that don't.
off - no mitigation off - no mitigation
auto - automatically select a migitation auto - automatically select a migitation
auto,nosmt - automatically select a mitigation, auto,nosmt - automatically select a mitigation,
disabling SMT if necessary for disabling SMT if necessary for
the full mitigation (only on Zen1 the full mitigation (only on Zen1
and older without STIBP). and older without STIBP).
ibpb - mitigate short speculation windows on ibpb - On AMD, mitigate short speculation
basic block boundaries too. Safe, highest windows on basic block boundaries too.
perf impact. Safe, highest perf impact. It also
unret - force enable untrained return thunks, enables STIBP if present. Not suitable
only effective on AMD f15h-f17h on Intel.
based systems. ibpb,nosmt - Like "ibpb" above but will disable SMT
unret,nosmt - like unret, will disable SMT when STIBP when STIBP is not available. This is
is not available. the alternative for systems which do not
have STIBP.
unret - Force enable untrained return thunks,
only effective on AMD f15h-f17h based
systems.
unret,nosmt - Like unret, but will disable SMT when STIBP
is not available. This is the alternative for
systems which do not have STIBP.
Selecting 'auto' will choose a mitigation method at run Selecting 'auto' will choose a mitigation method at run
time according to the CPU. time according to the CPU.
......
...@@ -152,7 +152,7 @@ void __init check_bugs(void) ...@@ -152,7 +152,7 @@ void __init check_bugs(void)
/* /*
* spectre_v2_user_select_mitigation() relies on the state set by * spectre_v2_user_select_mitigation() relies on the state set by
* retbleed_select_mitigation(); specifically the STIBP selection is * retbleed_select_mitigation(); specifically the STIBP selection is
* forced for UNRET. * forced for UNRET or IBPB.
*/ */
spectre_v2_user_select_mitigation(); spectre_v2_user_select_mitigation();
ssb_select_mitigation(); ssb_select_mitigation();
...@@ -1179,7 +1179,8 @@ spectre_v2_user_select_mitigation(void) ...@@ -1179,7 +1179,8 @@ spectre_v2_user_select_mitigation(void)
boot_cpu_has(X86_FEATURE_AMD_STIBP_ALWAYS_ON)) boot_cpu_has(X86_FEATURE_AMD_STIBP_ALWAYS_ON))
mode = SPECTRE_V2_USER_STRICT_PREFERRED; mode = SPECTRE_V2_USER_STRICT_PREFERRED;
if (retbleed_mitigation == RETBLEED_MITIGATION_UNRET) { if (retbleed_mitigation == RETBLEED_MITIGATION_UNRET ||
retbleed_mitigation == RETBLEED_MITIGATION_IBPB) {
if (mode != SPECTRE_V2_USER_STRICT && if (mode != SPECTRE_V2_USER_STRICT &&
mode != SPECTRE_V2_USER_STRICT_PREFERRED) mode != SPECTRE_V2_USER_STRICT_PREFERRED)
pr_info("Selecting STIBP always-on mode to complement retbleed mitigation\n"); pr_info("Selecting STIBP always-on mode to complement retbleed mitigation\n");
...@@ -2360,10 +2361,11 @@ static ssize_t srbds_show_state(char *buf) ...@@ -2360,10 +2361,11 @@ static ssize_t srbds_show_state(char *buf)
static ssize_t retbleed_show_state(char *buf) static ssize_t retbleed_show_state(char *buf)
{ {
if (retbleed_mitigation == RETBLEED_MITIGATION_UNRET) { if (retbleed_mitigation == RETBLEED_MITIGATION_UNRET ||
retbleed_mitigation == RETBLEED_MITIGATION_IBPB) {
if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD && if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD &&
boot_cpu_data.x86_vendor != X86_VENDOR_HYGON) boot_cpu_data.x86_vendor != X86_VENDOR_HYGON)
return sprintf(buf, "Vulnerable: untrained return thunk on non-Zen uarch\n"); return sprintf(buf, "Vulnerable: untrained return thunk / IBPB on non-AMD based uarch\n");
return sprintf(buf, "%s; SMT %s\n", return sprintf(buf, "%s; SMT %s\n",
retbleed_strings[retbleed_mitigation], retbleed_strings[retbleed_mitigation],
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment