linux/arch/x86/entry
Chang S. Bae c82965f9e5 x86/entry/64: Handle FSGSBASE enabled paranoid entry/exit
Without FSGSBASE, user space cannot change GSBASE other than through a
PRCTL. The kernel enforces that the user space GSBASE value is postive as
negative values are used for detecting the kernel space GSBASE value in the
paranoid entry code.

If FSGSBASE is enabled, user space can set arbitrary GSBASE values without
kernel intervention, including negative ones, which breaks the paranoid
entry assumptions.

To avoid this, paranoid entry needs to unconditionally save the current
GSBASE value independent of the interrupted context, retrieve and write the
kernel GSBASE and unconditionally restore the saved value on exit. The
restore happens either in paranoid_exit or in the special exit path of the
NMI low level code.

All other entry code pathes which use unconditional SWAPGS are not affected
as they do not depend on the actual content.

[ tglx: Massaged changelogs and comments ]

Suggested-by: H. Peter Anvin <hpa@zytor.com>
Suggested-by: Andy Lutomirski <luto@kernel.org>
Suggested-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Chang S. Bae <chang.seok.bae@intel.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lkml.kernel.org/r/1557309753-24073-13-git-send-email-chang.seok.bae@intel.com
Link: https://lkml.kernel.org/r/20200528201402.1708239-12-sashal@kernel.org
2020-06-18 15:47:04 +02:00
..
syscalls vfs: add faccessat2 syscall 2020-05-14 16:44:25 +02:00
vdso Rebase locking/kcsan to locking/urgent 2020-06-11 20:02:46 +02:00
vsyscall y2038: syscall implementation cleanups 2019-12-01 14:00:59 -08:00
calling.h x86/entry/64: Handle FSGSBASE enabled paranoid entry/exit 2020-06-18 15:47:04 +02:00
common.c x86/entry: Force rcu_irq_enter() when in idle task 2020-06-12 21:36:33 +02:00
entry_32.S x86/entry: Unbreak __irqentry_text_start/end magic 2020-06-11 15:15:29 +02:00
entry_64_compat.S x86/entry: Make entry_64_compat.S objtool clean 2020-06-11 15:14:40 +02:00
entry_64.S x86/entry/64: Handle FSGSBASE enabled paranoid entry/exit 2020-06-18 15:47:04 +02:00
Makefile x86/entry: Make entry_64_compat.S objtool clean 2020-06-11 15:14:40 +02:00
syscall_32.c x86/entry: Drop asmlinkage from syscalls 2020-03-21 16:03:25 +01:00
syscall_64.c x86/entry: Drop asmlinkage from syscalls 2020-03-21 16:03:25 +01:00
syscall_x32.c x86/entry: Drop asmlinkage from syscalls 2020-03-21 16:03:25 +01:00
thunk_32.S x86/entry: Rename ___preempt_schedule 2020-03-21 16:03:53 +01:00
thunk_64.S x86/entry: Remove the TRACE_IRQS cruft 2020-06-11 15:15:19 +02:00