diff options
Diffstat (limited to 'debian/patches-rt/0015-x86-fpu-Eager-switch-PKRU-state.patch')
-rw-r--r-- | debian/patches-rt/0015-x86-fpu-Eager-switch-PKRU-state.patch | 111 |
1 files changed, 0 insertions, 111 deletions
diff --git a/debian/patches-rt/0015-x86-fpu-Eager-switch-PKRU-state.patch b/debian/patches-rt/0015-x86-fpu-Eager-switch-PKRU-state.patch deleted file mode 100644 index 4b74f9936..000000000 --- a/debian/patches-rt/0015-x86-fpu-Eager-switch-PKRU-state.patch +++ /dev/null @@ -1,111 +0,0 @@ -From: Rik van Riel <riel@surriel.com> -Date: Sun, 9 Sep 2018 18:30:47 +0200 -Subject: [PATCH 15/27] x86/fpu: Eager switch PKRU state -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/5.0/older/patches-5.0.10-rt7.tar.xz - -While most of a task's FPU state is only needed in user space, the -protection keys need to be in place immediately after a context switch. - -The reason is that any access to userspace memory while running in -kernel mode also need to abide by the memory permissions specified in -the protection keys. - -The "eager switch" is a preparation for loading the FPU state on return -to userland. Instead of decoupling PKRU state from xstate I update PKRU -within xstate on write operations by the kernel. - -The read/write_pkru() is moved to another header file so it can easily -accessed from pgtable.h and fpu/internal.h. - -For user tasks we should always get the PKRU from the xsave area and it -should not change anything because the PKRU value was loaded as part of -FPU restore. -For kernel threads we now will have the default "init_pkru_value" -written. Before this commit the kernel thread would end up with a -random value which it inherited from the previous user task. - -Signed-off-by: Rik van Riel <riel@surriel.com> -[bigeasy: save pkru to xstate, no cache, don't use __raw_xsave_addr()] -Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> ---- - arch/x86/include/asm/fpu/internal.h | 24 ++++++++++++++++++++++-- - arch/x86/include/asm/fpu/xstate.h | 1 + - arch/x86/include/asm/pgtable.h | 6 ++++++ - arch/x86/mm/pkeys.c | 1 - - 4 files changed, 29 insertions(+), 3 deletions(-) - ---- a/arch/x86/include/asm/fpu/internal.h -+++ b/arch/x86/include/asm/fpu/internal.h -@@ -14,6 +14,7 @@ - #include <linux/compat.h> - #include <linux/sched.h> - #include <linux/slab.h> -+#include <linux/mm.h> - - #include <asm/user.h> - #include <asm/fpu/api.h> -@@ -562,8 +563,27 @@ switch_fpu_prepare(struct fpu *old_fpu, - */ - static inline void switch_fpu_finish(struct fpu *new_fpu, int cpu) - { -- if (static_cpu_has(X86_FEATURE_FPU)) -- __fpregs_load_activate(new_fpu, cpu); -+ struct pkru_state *pk; -+ u32 pkru_val = init_pkru_value; -+ -+ if (!static_cpu_has(X86_FEATURE_FPU)) -+ return; -+ -+ __fpregs_load_activate(new_fpu, cpu); -+ -+ if (!cpu_feature_enabled(X86_FEATURE_OSPKE)) -+ return; -+ -+ /* -+ * PKRU state is switched eagerly because it needs to be valid before we -+ * return to userland e.g. for a copy_to_user() operation. -+ */ -+ if (current->mm) { -+ pk = get_xsave_addr(&new_fpu->state.xsave, XFEATURE_PKRU); -+ if (pk) -+ pkru_val = pk->pkru; -+ } -+ __write_pkru(pkru_val); - } - - /* ---- a/arch/x86/include/asm/fpu/xstate.h -+++ b/arch/x86/include/asm/fpu/xstate.h -@@ -5,6 +5,7 @@ - #include <linux/types.h> - #include <asm/processor.h> - #include <linux/uaccess.h> -+#include <asm/user.h> - - /* Bit 63 of XCR0 is reserved for future expansion */ - #define XFEATURE_MASK_EXTEND (~(XFEATURE_MASK_FPSSE | (1ULL << 63))) ---- a/arch/x86/include/asm/pgtable.h -+++ b/arch/x86/include/asm/pgtable.h -@@ -1355,6 +1355,12 @@ static inline pmd_t pmd_swp_clear_soft_d - #define PKRU_WD_BIT 0x2 - #define PKRU_BITS_PER_PKEY 2 - -+#ifdef CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS -+extern u32 init_pkru_value; -+#else -+#define init_pkru_value 0 -+#endif -+ - static inline bool __pkru_allows_read(u32 pkru, u16 pkey) - { - int pkru_pkey_bits = pkey * PKRU_BITS_PER_PKEY; ---- a/arch/x86/mm/pkeys.c -+++ b/arch/x86/mm/pkeys.c -@@ -126,7 +126,6 @@ int __arch_override_mprotect_pkey(struct - * in the process's lifetime will not accidentally get access - * to data which is pkey-protected later on. - */ --static - u32 init_pkru_value = PKRU_AD_KEY( 1) | PKRU_AD_KEY( 2) | PKRU_AD_KEY( 3) | - PKRU_AD_KEY( 4) | PKRU_AD_KEY( 5) | PKRU_AD_KEY( 6) | - PKRU_AD_KEY( 7) | PKRU_AD_KEY( 8) | PKRU_AD_KEY( 9) | |