Patch "s390: always save and restore all registers on context switch" has been added to the 4.14-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
s390: always save and restore all registers on context switch
to the 4.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
s390-always-save-and-restore-all-registers-on-context-switch.patch
and it can be found in the queue-4.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
fbbd7f1a51965b50dd12924841da0d478f3da71bMon Sep 17 00:00:00 2001
From: Heiko Carstens <[email protected]>
Date: Mon, 20 Nov 2017 12:38:44 +0100
Subject: s390: always save and restore all registers on context switch
From: Heiko Carstens <[email protected]>
commit fbbd7f1a51965b50dd12924841da0d478f3da71b upstream.
The switch_to() macro has an optimization to avoid saving and restoring register contents that aren't needed for kernel threads.
There is however the possibility that a kernel thread execve's a user space program. In such a case the execve'd process can partially see the contents of the previous process, which shouldn't be allowed.
To avoid this, simply always save and restore register contents on context switch.
--- arch/s390/include/asm/switch_to.h | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-)
arch/s390/include/asm/switch_to.h +13 -14
@@ -30,21 +30,20 @@ static inline void restore_access_regs(u asmvolatile ("lam 0,15,%0" : :"Q" (*(acrstype *)acrs)); } -#define switch_to (prev,next,last) do { \ - if (prev->mm) { \ - save_fpu_regs(); \ - save_access_regs(&prev->thread.acrs[0]); \ - save_ri_cb(prev->thread.ri_cb); \ - save_gs_cb(prev->thread.gs_cb); \ - } \ +#define switch_to (prev, next, last) do { \ +/* save_fpu_regs() sets the CIF_FPU flag, which enforces \ +* a restore of the floating point / vector registers as \ +* soon as the next task returns to user space \ +*/ \ +save_fpu_regs (); \ + save_access_regs(&prev->thread.acrs[0]); \ + save_ri_cb(prev->thread.ri_cb); \ + save_gs_cb(prev->thread.gs_cb); \update_cr_regs (next); \ - if (next->mm) { \ - set_cpu_flag(CIF_FPU); \ - restore_access_regs(&next->thread.acrs[0]); \ - restore_ri_cb(next->thread.ri_cb, prev->thread.ri_cb); \ - restore_gs_cb(next->thread.gs_cb); \ - } \ - prev = __switch_to(prev,next); \ + restore_access_regs(&next->thread.acrs[0]); \ + restore_ri_cb(next->thread.ri_cb, prev->thread.ri_cb); \ + restore_gs_cb(next->thread.gs_cb); \ + prev =__switch_to (prev, next); \ } while (0)#endif /* __ASM_SWITCH_TO_H */
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/s390-always-save-and-restore-all-registers-on-context-switch.patch queue-4.14/s390-fix-compat-system-call-table.patch queue-4.14/s390-mm-fix-off-by-one-bug-in-5-level-page-table-handling.patch