Commit-ID:  55a974021ec952ee460dc31ca08722158639de72
Gitweb:     https://git.kernel.org/tip/55a974021ec952ee460dc31ca08722158639de72
Author:     Thomas Gleixner <t...@linutronix.de>
AuthorDate: Sun, 25 Nov 2018 19:33:56 +0100
Committer:  Thomas Gleixner <t...@linutronix.de>
CommitDate: Wed, 28 Nov 2018 11:57:14 +0100

x86/speculation: Provide IBPB always command line options

Provide the possibility to enable IBPB always in combination with 'prctl'
and 'seccomp'.

Add the extra command line options and rework the IBPB selection to
evaluate the command instead of the mode selected by the STIPB switch case.

Signed-off-by: Thomas Gleixner <t...@linutronix.de>
Reviewed-by: Ingo Molnar <mi...@kernel.org>
Cc: Peter Zijlstra <pet...@infradead.org>
Cc: Andy Lutomirski <l...@kernel.org>
Cc: Linus Torvalds <torva...@linux-foundation.org>
Cc: Jiri Kosina <jkos...@suse.cz>
Cc: Tom Lendacky <thomas.lenda...@amd.com>
Cc: Josh Poimboeuf <jpoim...@redhat.com>
Cc: Andrea Arcangeli <aarca...@redhat.com>
Cc: David Woodhouse <d...@amazon.co.uk>
Cc: Tim Chen <tim.c.c...@linux.intel.com>
Cc: Andi Kleen <a...@linux.intel.com>
Cc: Dave Hansen <dave.han...@intel.com>
Cc: Casey Schaufler <casey.schauf...@intel.com>
Cc: Asit Mallick <asit.k.mall...@intel.com>
Cc: Arjan van de Ven <ar...@linux.intel.com>
Cc: Jon Masters <j...@redhat.com>
Cc: Waiman Long <longman9...@gmail.com>
Cc: Greg KH <gre...@linuxfoundation.org>
Cc: Dave Stewart <david.c.stew...@intel.com>
Cc: Kees Cook <keesc...@chromium.org>
Cc: sta...@vger.kernel.org
Link: https://lkml.kernel.org/r/20181125185006.144047...@linutronix.de

---
 Documentation/admin-guide/kernel-parameters.txt | 12 +++++++++
 arch/x86/kernel/cpu/bugs.c                      | 34 +++++++++++++++++--------
 2 files changed, 35 insertions(+), 11 deletions(-)

diff --git a/Documentation/admin-guide/kernel-parameters.txt 
b/Documentation/admin-guide/kernel-parameters.txt
index f405281bb202..05a252e5178d 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -4241,11 +4241,23 @@
                                  per thread.  The mitigation control state
                                  is inherited on fork.
 
+                       prctl,ibpb
+                               - Like "prctl" above, but only STIBP is
+                                 controlled per thread. IBPB is issued
+                                 always when switching between different user
+                                 space processes.
+
                        seccomp
                                - Same as "prctl" above, but all seccomp
                                  threads will enable the mitigation unless
                                  they explicitly opt out.
 
+                       seccomp,ibpb
+                               - Like "seccomp" above, but only STIBP is
+                                 controlled per thread. IBPB is issued
+                                 always when switching between different
+                                 user space processes.
+
                        auto    - Kernel selects the mitigation depending on
                                  the available CPU features and vulnerability.
 
diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c
index c9e304960534..500278f5308e 100644
--- a/arch/x86/kernel/cpu/bugs.c
+++ b/arch/x86/kernel/cpu/bugs.c
@@ -256,7 +256,9 @@ enum spectre_v2_user_cmd {
        SPECTRE_V2_USER_CMD_AUTO,
        SPECTRE_V2_USER_CMD_FORCE,
        SPECTRE_V2_USER_CMD_PRCTL,
+       SPECTRE_V2_USER_CMD_PRCTL_IBPB,
        SPECTRE_V2_USER_CMD_SECCOMP,
+       SPECTRE_V2_USER_CMD_SECCOMP_IBPB,
 };
 
 static const char * const spectre_v2_user_strings[] = {
@@ -271,11 +273,13 @@ static const struct {
        enum spectre_v2_user_cmd        cmd;
        bool                            secure;
 } v2_user_options[] __initdata = {
-       { "auto",       SPECTRE_V2_USER_CMD_AUTO,       false },
-       { "off",        SPECTRE_V2_USER_CMD_NONE,       false },
-       { "on",         SPECTRE_V2_USER_CMD_FORCE,      true  },
-       { "prctl",      SPECTRE_V2_USER_CMD_PRCTL,      false },
-       { "seccomp",    SPECTRE_V2_USER_CMD_SECCOMP,    false },
+       { "auto",               SPECTRE_V2_USER_CMD_AUTO,               false },
+       { "off",                SPECTRE_V2_USER_CMD_NONE,               false },
+       { "on",                 SPECTRE_V2_USER_CMD_FORCE,              true  },
+       { "prctl",              SPECTRE_V2_USER_CMD_PRCTL,              false },
+       { "prctl,ibpb",         SPECTRE_V2_USER_CMD_PRCTL_IBPB,         false },
+       { "seccomp",            SPECTRE_V2_USER_CMD_SECCOMP,            false },
+       { "seccomp,ibpb",       SPECTRE_V2_USER_CMD_SECCOMP_IBPB,       false },
 };
 
 static void __init spec_v2_user_print_cond(const char *reason, bool secure)
@@ -321,6 +325,7 @@ spectre_v2_user_select_mitigation(enum 
spectre_v2_mitigation_cmd v2_cmd)
 {
        enum spectre_v2_user_mitigation mode = SPECTRE_V2_USER_NONE;
        bool smt_possible = IS_ENABLED(CONFIG_SMP);
+       enum spectre_v2_user_cmd cmd;
 
        if (!boot_cpu_has(X86_FEATURE_IBPB) && !boot_cpu_has(X86_FEATURE_STIBP))
                return;
@@ -329,17 +334,20 @@ spectre_v2_user_select_mitigation(enum 
spectre_v2_mitigation_cmd v2_cmd)
            cpu_smt_control == CPU_SMT_NOT_SUPPORTED)
                smt_possible = false;
 
-       switch (spectre_v2_parse_user_cmdline(v2_cmd)) {
+       cmd = spectre_v2_parse_user_cmdline(v2_cmd);
+       switch (cmd) {
        case SPECTRE_V2_USER_CMD_NONE:
                goto set_mode;
        case SPECTRE_V2_USER_CMD_FORCE:
                mode = SPECTRE_V2_USER_STRICT;
                break;
        case SPECTRE_V2_USER_CMD_PRCTL:
+       case SPECTRE_V2_USER_CMD_PRCTL_IBPB:
                mode = SPECTRE_V2_USER_PRCTL;
                break;
        case SPECTRE_V2_USER_CMD_AUTO:
        case SPECTRE_V2_USER_CMD_SECCOMP:
+       case SPECTRE_V2_USER_CMD_SECCOMP_IBPB:
                if (IS_ENABLED(CONFIG_SECCOMP))
                        mode = SPECTRE_V2_USER_SECCOMP;
                else
@@ -351,12 +359,15 @@ spectre_v2_user_select_mitigation(enum 
spectre_v2_mitigation_cmd v2_cmd)
        if (boot_cpu_has(X86_FEATURE_IBPB)) {
                setup_force_cpu_cap(X86_FEATURE_USE_IBPB);
 
-               switch (mode) {
-               case SPECTRE_V2_USER_STRICT:
+               switch (cmd) {
+               case SPECTRE_V2_USER_CMD_FORCE:
+               case SPECTRE_V2_USER_CMD_PRCTL_IBPB:
+               case SPECTRE_V2_USER_CMD_SECCOMP_IBPB:
                        static_branch_enable(&switch_mm_always_ibpb);
                        break;
-               case SPECTRE_V2_USER_PRCTL:
-               case SPECTRE_V2_USER_SECCOMP:
+               case SPECTRE_V2_USER_CMD_PRCTL:
+               case SPECTRE_V2_USER_CMD_AUTO:
+               case SPECTRE_V2_USER_CMD_SECCOMP:
                        static_branch_enable(&switch_mm_cond_ibpb);
                        break;
                default:
@@ -364,7 +375,8 @@ spectre_v2_user_select_mitigation(enum 
spectre_v2_mitigation_cmd v2_cmd)
                }
 
                pr_info("mitigation: Enabling %s Indirect Branch Prediction 
Barrier\n",
-                       mode == SPECTRE_V2_USER_STRICT ? "always-on" : 
"conditional");
+                       static_key_enabled(&switch_mm_always_ibpb) ?
+                       "always-on" : "conditional");
        }
 
        /* If enhanced IBRS is enabled no STIPB required */

Reply via email to