Merge branch 'core/speculation' of git://git.kernel.org/pub/scm/linux/kernel/git...
[sfrench/cifs-2.6.git] / arch / x86 / kernel / cpu / bugs.c
index 435c078c29483abcc9dcc4589a238477b98f7eb5..8043a21f36bea925f2be1b61eecdf84dcc85b4f0 100644 (file)
@@ -800,15 +800,25 @@ static int ssb_prctl_set(struct task_struct *task, unsigned long ctrl)
                if (task_spec_ssb_force_disable(task))
                        return -EPERM;
                task_clear_spec_ssb_disable(task);
+               task_clear_spec_ssb_noexec(task);
                task_update_spec_tif(task);
                break;
        case PR_SPEC_DISABLE:
                task_set_spec_ssb_disable(task);
+               task_clear_spec_ssb_noexec(task);
                task_update_spec_tif(task);
                break;
        case PR_SPEC_FORCE_DISABLE:
                task_set_spec_ssb_disable(task);
                task_set_spec_ssb_force_disable(task);
+               task_clear_spec_ssb_noexec(task);
+               task_update_spec_tif(task);
+               break;
+       case PR_SPEC_DISABLE_NOEXEC:
+               if (task_spec_ssb_force_disable(task))
+                       return -EPERM;
+               task_set_spec_ssb_disable(task);
+               task_set_spec_ssb_noexec(task);
                task_update_spec_tif(task);
                break;
        default:
@@ -887,6 +897,8 @@ static int ssb_prctl_get(struct task_struct *task)
        case SPEC_STORE_BYPASS_PRCTL:
                if (task_spec_ssb_force_disable(task))
                        return PR_SPEC_PRCTL | PR_SPEC_FORCE_DISABLE;
+               if (task_spec_ssb_noexec(task))
+                       return PR_SPEC_PRCTL | PR_SPEC_DISABLE_NOEXEC;
                if (task_spec_ssb_disable(task))
                        return PR_SPEC_PRCTL | PR_SPEC_DISABLE;
                return PR_SPEC_PRCTL | PR_SPEC_ENABLE;