]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
x86/bugs: Don't fill RSB on context switch with eIBRS
authorJosh Poimboeuf <jpoimboe@kernel.org>
Tue, 8 Apr 2025 21:47:34 +0000 (14:47 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 2 May 2025 06:02:08 +0000 (08:02 +0200)
[ Upstream commit 27ce8299bc1ec6df8306073785ff82b30b3cc5ee ]

User->user Spectre v2 attacks (including RSB) across context switches
are already mitigated by IBPB in cond_mitigation(), if enabled globally
or if either the prev or the next task has opted in to protection.  RSB
filling without IBPB serves no purpose for protecting user space, as
indirect branches are still vulnerable.

User->kernel RSB attacks are mitigated by eIBRS.  In which case the RSB
filling on context switch isn't needed, so remove it.

Suggested-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Reviewed-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
Reviewed-by: Amit Shah <amit.shah@amd.com>
Reviewed-by: Nikolay Borisov <nik.borisov@suse.com>
Link: https://lore.kernel.org/r/98cdefe42180358efebf78e3b80752850c7a3e1b.1744148254.git.jpoimboe@kernel.org
Signed-off-by: Sasha Levin <sashal@kernel.org>
arch/x86/kernel/cpu/bugs.c
arch/x86/mm/tlb.c

index 41b4d9018633e33380315842c94f2dbea2cb9ad0..9152285aaaf961383ada5f57777f4931d8dcdc04 100644 (file)
@@ -1578,7 +1578,7 @@ static void __init spec_ctrl_disable_kernel_rrsba(void)
        rrsba_disabled = true;
 }
 
-static void __init spectre_v2_determine_rsb_fill_type_at_vmexit(enum spectre_v2_mitigation mode)
+static void __init spectre_v2_select_rsb_mitigation(enum spectre_v2_mitigation mode)
 {
        /*
         * Similar to context switches, there are two types of RSB attacks
@@ -1602,7 +1602,7 @@ static void __init spectre_v2_determine_rsb_fill_type_at_vmexit(enum spectre_v2_
         */
        switch (mode) {
        case SPECTRE_V2_NONE:
-               return;
+               break;
 
        case SPECTRE_V2_EIBRS:
        case SPECTRE_V2_EIBRS_LFENCE:
@@ -1611,18 +1611,21 @@ static void __init spectre_v2_determine_rsb_fill_type_at_vmexit(enum spectre_v2_
                        pr_info("Spectre v2 / PBRSB-eIBRS: Retire a single CALL on VMEXIT\n");
                        setup_force_cpu_cap(X86_FEATURE_RSB_VMEXIT_LITE);
                }
-               return;
+               break;
 
        case SPECTRE_V2_RETPOLINE:
        case SPECTRE_V2_LFENCE:
        case SPECTRE_V2_IBRS:
-               pr_info("Spectre v2 / SpectreRSB : Filling RSB on VMEXIT\n");
+               pr_info("Spectre v2 / SpectreRSB: Filling RSB on context switch and VMEXIT\n");
+               setup_force_cpu_cap(X86_FEATURE_RSB_CTXSW);
                setup_force_cpu_cap(X86_FEATURE_RSB_VMEXIT);
-               return;
-       }
+               break;
 
-       pr_warn_once("Unknown Spectre v2 mode, disabling RSB mitigation at VM exit");
-       dump_stack();
+       default:
+               pr_warn_once("Unknown Spectre v2 mode, disabling RSB mitigation\n");
+               dump_stack();
+               break;
+       }
 }
 
 /*
@@ -1854,10 +1857,7 @@ static void __init spectre_v2_select_mitigation(void)
         *
         * FIXME: Is this pointless for retbleed-affected AMD?
         */
-       setup_force_cpu_cap(X86_FEATURE_RSB_CTXSW);
-       pr_info("Spectre v2 / SpectreRSB mitigation: Filling RSB on context switch\n");
-
-       spectre_v2_determine_rsb_fill_type_at_vmexit(mode);
+       spectre_v2_select_rsb_mitigation(mode);
 
        /*
         * Retpoline protects the kernel, but doesn't protect firmware.  IBRS
index 6cf881a942bbedc672889f2c96344980f1fd4e46..e491c75b2a68898ca364a6d0752347539894987d 100644 (file)
@@ -389,9 +389,9 @@ static void cond_mitigation(struct task_struct *next)
        prev_mm = this_cpu_read(cpu_tlbstate.last_user_mm_spec);
 
        /*
-        * Avoid user/user BTB poisoning by flushing the branch predictor
-        * when switching between processes. This stops one process from
-        * doing Spectre-v2 attacks on another.
+        * Avoid user->user BTB/RSB poisoning by flushing them when switching
+        * between processes. This stops one process from doing Spectre-v2
+        * attacks on another.
         *
         * Both, the conditional and the always IBPB mode use the mm
         * pointer to avoid the IBPB when switching between tasks of the