OSDN Git Service

x86/speculation: Add seccomp Spectre v2 user space protection mode
[android-x86/kernel.git] / arch / x86 / kernel / cpu / bugs.c
index e28598f..00263ee 100644 (file)
@@ -254,12 +254,14 @@ enum spectre_v2_user_cmd {
        SPECTRE_V2_USER_CMD_AUTO,
        SPECTRE_V2_USER_CMD_FORCE,
        SPECTRE_V2_USER_CMD_PRCTL,
+       SPECTRE_V2_USER_CMD_SECCOMP,
 };
 
 static const char * const spectre_v2_user_strings[] = {
        [SPECTRE_V2_USER_NONE]          = "User space: Vulnerable",
        [SPECTRE_V2_USER_STRICT]        = "User space: Mitigation: STIBP protection",
        [SPECTRE_V2_USER_PRCTL]         = "User space: Mitigation: STIBP via prctl",
+       [SPECTRE_V2_USER_SECCOMP]       = "User space: Mitigation: STIBP via seccomp and prctl",
 };
 
 static const struct {
@@ -271,6 +273,7 @@ static const struct {
        { "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 },
 };
 
 static void __init spec_v2_user_print_cond(const char *reason, bool secure)
@@ -330,10 +333,16 @@ spectre_v2_user_select_mitigation(enum spectre_v2_mitigation_cmd v2_cmd)
        case SPECTRE_V2_USER_CMD_FORCE:
                mode = SPECTRE_V2_USER_STRICT;
                break;
-       case SPECTRE_V2_USER_CMD_AUTO:
        case SPECTRE_V2_USER_CMD_PRCTL:
                mode = SPECTRE_V2_USER_PRCTL;
                break;
+       case SPECTRE_V2_USER_CMD_AUTO:
+       case SPECTRE_V2_USER_CMD_SECCOMP:
+               if (IS_ENABLED(CONFIG_SECCOMP))
+                       mode = SPECTRE_V2_USER_SECCOMP;
+               else
+                       mode = SPECTRE_V2_USER_PRCTL;
+               break;
        }
 
        /* Initialize Indirect Branch Prediction Barrier */
@@ -345,6 +354,7 @@ spectre_v2_user_select_mitigation(enum spectre_v2_mitigation_cmd v2_cmd)
                        static_branch_enable(&switch_mm_always_ibpb);
                        break;
                case SPECTRE_V2_USER_PRCTL:
+               case SPECTRE_V2_USER_SECCOMP:
                        static_branch_enable(&switch_mm_cond_ibpb);
                        break;
                default:
@@ -596,6 +606,7 @@ void arch_smt_update(void)
                update_stibp_strict();
                break;
        case SPECTRE_V2_USER_PRCTL:
+       case SPECTRE_V2_USER_SECCOMP:
                update_indir_branch_cond();
                break;
        }
@@ -838,6 +849,8 @@ void arch_seccomp_spec_mitigate(struct task_struct *task)
 {
        if (ssb_mode == SPEC_STORE_BYPASS_SECCOMP)
                ssb_prctl_set(task, PR_SPEC_FORCE_DISABLE);
+       if (spectre_v2_user == SPECTRE_V2_USER_SECCOMP)
+               ib_prctl_set(task, PR_SPEC_FORCE_DISABLE);
 }
 #endif
 
@@ -869,6 +882,7 @@ static int ib_prctl_get(struct task_struct *task)
        case SPECTRE_V2_USER_NONE:
                return PR_SPEC_ENABLE;
        case SPECTRE_V2_USER_PRCTL:
+       case SPECTRE_V2_USER_SECCOMP:
                if (task_spec_ib_force_disable(task))
                        return PR_SPEC_PRCTL | PR_SPEC_FORCE_DISABLE;
                if (task_spec_ib_disable(task))
@@ -1069,6 +1083,7 @@ static char *stibp_state(void)
        case SPECTRE_V2_USER_STRICT:
                return ", STIBP: forced";
        case SPECTRE_V2_USER_PRCTL:
+       case SPECTRE_V2_USER_SECCOMP:
                if (static_key_enabled(&switch_to_cond_stibp))
                        return ", STIBP: conditional";
        }