aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.9.21/0045-nospec-Allow-getting-setting-on-non-current-task.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.9.21/0045-nospec-Allow-getting-setting-on-non-current-task.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.9.21/0045-nospec-Allow-getting-setting-on-non-current-task.patch162
1 files changed, 0 insertions, 162 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.9.21/0045-nospec-Allow-getting-setting-on-non-current-task.patch b/common/recipes-kernel/linux/linux-yocto-4.9.21/0045-nospec-Allow-getting-setting-on-non-current-task.patch
deleted file mode 100644
index 5c1e6d48..00000000
--- a/common/recipes-kernel/linux/linux-yocto-4.9.21/0045-nospec-Allow-getting-setting-on-non-current-task.patch
+++ /dev/null
@@ -1,162 +0,0 @@
-From e2a9a40a2a4fbebc999eacc678c2af449db5af11 Mon Sep 17 00:00:00 2001
-From: Kees Cook <keescook@chromium.org>
-Date: Tue, 1 May 2018 15:19:04 -0700
-Subject: [PATCH 45/93] nospec: Allow getting/setting on non-current task
-
-commit 7bbf1373e228840bb0295a2ca26d548ef37f448e upstream
-
-Adjust arch_prctl_get/set_spec_ctrl() to operate on tasks other than
-current.
-
-This is needed both for /proc/$pid/status queries and for seccomp (since
-thread-syncing can trigger seccomp in non-current threads).
-
-Signed-off-by: Kees Cook <keescook@chromium.org>
-Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- arch/x86/kernel/cpu/bugs.c | 27 ++++++++++++++++-----------
- include/linux/nospec.h | 7 +++++--
- kernel/sys.c | 9 +++++----
- 3 files changed, 26 insertions(+), 17 deletions(-)
-
-diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c
-index b7d9adf..3760931 100644
---- a/arch/x86/kernel/cpu/bugs.c
-+++ b/arch/x86/kernel/cpu/bugs.c
-@@ -529,31 +529,35 @@ static void ssb_select_mitigation()
-
- #undef pr_fmt
-
--static int ssb_prctl_set(unsigned long ctrl)
-+static int ssb_prctl_set(struct task_struct *task, unsigned long ctrl)
- {
-- bool rds = !!test_tsk_thread_flag(current, TIF_RDS);
-+ bool rds = !!test_tsk_thread_flag(task, TIF_RDS);
-
- if (ssb_mode != SPEC_STORE_BYPASS_PRCTL)
- return -ENXIO;
-
- if (ctrl == PR_SPEC_ENABLE)
-- clear_tsk_thread_flag(current, TIF_RDS);
-+ clear_tsk_thread_flag(task, TIF_RDS);
- else
-- set_tsk_thread_flag(current, TIF_RDS);
-+ set_tsk_thread_flag(task, TIF_RDS);
-
-- if (rds != !!test_tsk_thread_flag(current, TIF_RDS))
-+ /*
-+ * If being set on non-current task, delay setting the CPU
-+ * mitigation until it is next scheduled.
-+ */
-+ if (task == current && rds != !!test_tsk_thread_flag(task, TIF_RDS))
- speculative_store_bypass_update();
-
- return 0;
- }
-
--static int ssb_prctl_get(void)
-+static int ssb_prctl_get(struct task_struct *task)
- {
- switch (ssb_mode) {
- case SPEC_STORE_BYPASS_DISABLE:
- return PR_SPEC_DISABLE;
- case SPEC_STORE_BYPASS_PRCTL:
-- if (test_tsk_thread_flag(current, TIF_RDS))
-+ if (test_tsk_thread_flag(task, TIF_RDS))
- return PR_SPEC_PRCTL | PR_SPEC_DISABLE;
- return PR_SPEC_PRCTL | PR_SPEC_ENABLE;
- default:
-@@ -563,24 +567,25 @@ static int ssb_prctl_get(void)
- }
- }
-
--int arch_prctl_spec_ctrl_set(unsigned long which, unsigned long ctrl)
-+int arch_prctl_spec_ctrl_set(struct task_struct *task, unsigned long which,
-+ unsigned long ctrl)
- {
- if (ctrl != PR_SPEC_ENABLE && ctrl != PR_SPEC_DISABLE)
- return -ERANGE;
-
- switch (which) {
- case PR_SPEC_STORE_BYPASS:
-- return ssb_prctl_set(ctrl);
-+ return ssb_prctl_set(task, ctrl);
- default:
- return -ENODEV;
- }
- }
-
--int arch_prctl_spec_ctrl_get(unsigned long which)
-+int arch_prctl_spec_ctrl_get(struct task_struct *task, unsigned long which)
- {
- switch (which) {
- case PR_SPEC_STORE_BYPASS:
-- return ssb_prctl_get();
-+ return ssb_prctl_get(task);
- default:
- return -ENODEV;
- }
-diff --git a/include/linux/nospec.h b/include/linux/nospec.h
-index 700bb8a..a908c95 100644
---- a/include/linux/nospec.h
-+++ b/include/linux/nospec.h
-@@ -7,6 +7,8 @@
- #define _LINUX_NOSPEC_H
- #include <asm/barrier.h>
-
-+struct task_struct;
-+
- /**
- * array_index_mask_nospec() - generate a ~0 mask when index < size, 0 otherwise
- * @index: array element index
-@@ -57,7 +59,8 @@ static inline unsigned long array_index_mask_nospec(unsigned long index,
- })
-
- /* Speculation control prctl */
--int arch_prctl_spec_ctrl_get(unsigned long which);
--int arch_prctl_spec_ctrl_set(unsigned long which, unsigned long ctrl);
-+int arch_prctl_spec_ctrl_get(struct task_struct *task, unsigned long which);
-+int arch_prctl_spec_ctrl_set(struct task_struct *task, unsigned long which,
-+ unsigned long ctrl);
-
- #endif /* _LINUX_NOSPEC_H */
-diff --git a/kernel/sys.c b/kernel/sys.c
-index 312c985..143cd63 100644
---- a/kernel/sys.c
-+++ b/kernel/sys.c
-@@ -2074,12 +2074,13 @@ static int prctl_get_tid_address(struct task_struct *me, int __user **tid_addr)
- }
- #endif
-
--int __weak arch_prctl_spec_ctrl_get(unsigned long which)
-+int __weak arch_prctl_spec_ctrl_get(struct task_struct *t, unsigned long which)
- {
- return -EINVAL;
- }
-
--int __weak arch_prctl_spec_ctrl_set(unsigned long which, unsigned long ctrl)
-+int __weak arch_prctl_spec_ctrl_set(struct task_struct *t, unsigned long which,
-+ unsigned long ctrl)
- {
- return -EINVAL;
- }
-@@ -2285,12 +2286,12 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,
- case PR_GET_SPECULATION_CTRL:
- if (arg3 || arg4 || arg5)
- return -EINVAL;
-- error = arch_prctl_spec_ctrl_get(arg2);
-+ error = arch_prctl_spec_ctrl_get(me, arg2);
- break;
- case PR_SET_SPECULATION_CTRL:
- if (arg4 || arg5)
- return -EINVAL;
-- error = arch_prctl_spec_ctrl_set(arg2, arg3);
-+ error = arch_prctl_spec_ctrl_set(me, arg2, arg3);
- break;
- default:
- error = -EINVAL;
---
-2.7.4
-