aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.9.21/0024-kaiser-paranoid_entry-pass-cr3-need-to-paranoid_exit.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.9.21/0024-kaiser-paranoid_entry-pass-cr3-need-to-paranoid_exit.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.9.21/0024-kaiser-paranoid_entry-pass-cr3-need-to-paranoid_exit.patch172
1 files changed, 0 insertions, 172 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.9.21/0024-kaiser-paranoid_entry-pass-cr3-need-to-paranoid_exit.patch b/common/recipes-kernel/linux/linux-yocto-4.9.21/0024-kaiser-paranoid_entry-pass-cr3-need-to-paranoid_exit.patch
deleted file mode 100644
index ce6a3595..00000000
--- a/common/recipes-kernel/linux/linux-yocto-4.9.21/0024-kaiser-paranoid_entry-pass-cr3-need-to-paranoid_exit.patch
+++ /dev/null
@@ -1,172 +0,0 @@
-From 2a172cc2491d54b70e5e54a19d2affa38f009a33 Mon Sep 17 00:00:00 2001
-From: Hugh Dickins <hughd@google.com>
-Date: Tue, 26 Sep 2017 18:43:07 -0700
-Subject: [PATCH 024/103] kaiser: paranoid_entry pass cr3 need to paranoid_exit
-
-Neel Natu points out that paranoid_entry() was wrong to assume that
-an entry that did not need swapgs would not need SWITCH_KERNEL_CR3:
-paranoid_entry (used for debug breakpoint, int3, double fault or MCE;
-though I think it's only the MCE case that is cause for concern here)
-can break in at an awkward time, between cr3 switch and swapgs, but
-its handling always needs kernel gs and kernel cr3.
-
-Easy to fix in itself, but paranoid_entry() also needs to convey to
-paranoid_exit() (and my reading of macro idtentry says paranoid_entry
-and paranoid_exit are always paired) how to restore the prior state.
-The swapgs state is already conveyed by %ebx (0 or 1), so extend that
-also to convey when SWITCH_USER_CR3 will be needed (2 or 3).
-
-(Yes, I'd much prefer that 0 meant no swapgs, whereas it's the other
-way round: and a convention shared with error_entry() and error_exit(),
-which I don't want to touch. Perhaps I should have inverted the bit
-for switch cr3 too, but did not.)
-
-paranoid_exit() would be straightforward, except for TRACE_IRQS: it
-did TRACE_IRQS_IRETQ when doing swapgs, but TRACE_IRQS_IRETQ_DEBUG
-when not: which is it supposed to use when SWITCH_USER_CR3 is split
-apart from that? As best as I can determine, commit 5963e317b1e9
-("ftrace/x86: Do not change stacks in DEBUG when calling lockdep")
-missed the swapgs case, and should have used TRACE_IRQS_IRETQ_DEBUG
-there too (the discrepancy has nothing to do with the liberal use
-of _NO_STACK and _UNSAFE_STACK hereabouts: TRACE_IRQS_OFF_DEBUG has
-just been used in all cases); discrepancy lovingly preserved across
-several paranoid_exit() cleanups, but I'm now removing it.
-
-Neel further indicates that to use SWITCH_USER_CR3_NO_STACK there in
-paranoid_exit() is now not only unnecessary but unsafe: might corrupt
-syscall entry's unsafe_stack_register_backup of %rax. Just use
-SWITCH_USER_CR3: and delete SWITCH_USER_CR3_NO_STACK altogether,
-before we make the mistake of using it again.
-
-hughd adds: this commit fixes an issue in the Kaiser-without-PCIDs
-part of the series, and ought to be moved earlier, if you decided
-to make a release of Kaiser-without-PCIDs.
-
-Signed-off-by: Hugh Dickins <hughd@google.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- arch/x86/entry/entry_64.S | 46 +++++++++++++++++++++++++++++++---------
- arch/x86/entry/entry_64_compat.S | 2 +-
- arch/x86/include/asm/kaiser.h | 8 -------
- 3 files changed, 37 insertions(+), 19 deletions(-)
-
-diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S
-index e158fd5..41bf650 100644
---- a/arch/x86/entry/entry_64.S
-+++ b/arch/x86/entry/entry_64.S
-@@ -1053,7 +1053,11 @@ idtentry machine_check has_error_code=0 paranoid=1 do_sym=*machine_check_vec
- /*
- * Save all registers in pt_regs, and switch gs if needed.
- * Use slow, but surefire "are we in kernel?" check.
-- * Return: ebx=0: need swapgs on exit, ebx=1: otherwise
-+ *
-+ * Return: ebx=0: needs swapgs but not SWITCH_USER_CR3 in paranoid_exit
-+ * ebx=1: needs neither swapgs nor SWITCH_USER_CR3 in paranoid_exit
-+ * ebx=2: needs both swapgs and SWITCH_USER_CR3 in paranoid_exit
-+ * ebx=3: needs SWITCH_USER_CR3 but not swapgs in paranoid_exit
- */
- ENTRY(paranoid_entry)
- cld
-@@ -1065,9 +1069,26 @@ ENTRY(paranoid_entry)
- testl %edx, %edx
- js 1f /* negative -> in kernel */
- SWAPGS
-- SWITCH_KERNEL_CR3
- xorl %ebx, %ebx
--1: ret
-+1:
-+#ifdef CONFIG_KAISER
-+ /*
-+ * We might have come in between a swapgs and a SWITCH_KERNEL_CR3
-+ * on entry, or between a SWITCH_USER_CR3 and a swapgs on exit.
-+ * Do a conditional SWITCH_KERNEL_CR3: this could safely be done
-+ * unconditionally, but we need to find out whether the reverse
-+ * should be done on return (conveyed to paranoid_exit in %ebx).
-+ */
-+ movq %cr3, %rax
-+ testl $KAISER_SHADOW_PGD_OFFSET, %eax
-+ jz 2f
-+ orl $2, %ebx
-+ andq $(~(X86_CR3_PCID_ASID_MASK | KAISER_SHADOW_PGD_OFFSET)), %rax
-+ orq x86_cr3_pcid_noflush, %rax
-+ movq %rax, %cr3
-+2:
-+#endif
-+ ret
- END(paranoid_entry)
-
- /*
-@@ -1080,20 +1101,25 @@ END(paranoid_entry)
- * be complicated. Fortunately, we there's no good reason
- * to try to handle preemption here.
- *
-- * On entry, ebx is "no swapgs" flag (1: don't need swapgs, 0: need it)
-+ * On entry: ebx=0: needs swapgs but not SWITCH_USER_CR3
-+ * ebx=1: needs neither swapgs nor SWITCH_USER_CR3
-+ * ebx=2: needs both swapgs and SWITCH_USER_CR3
-+ * ebx=3: needs SWITCH_USER_CR3 but not swapgs
- */
- ENTRY(paranoid_exit)
- DISABLE_INTERRUPTS(CLBR_NONE)
- TRACE_IRQS_OFF_DEBUG
-- testl %ebx, %ebx /* swapgs needed? */
-+ TRACE_IRQS_IRETQ_DEBUG
-+#ifdef CONFIG_KAISER
-+ testl $2, %ebx /* SWITCH_USER_CR3 needed? */
-+ jz paranoid_exit_no_switch
-+ SWITCH_USER_CR3
-+paranoid_exit_no_switch:
-+#endif
-+ testl $1, %ebx /* swapgs needed? */
- jnz paranoid_exit_no_swapgs
-- TRACE_IRQS_IRETQ
-- SWITCH_USER_CR3_NO_STACK
- SWAPGS_UNSAFE_STACK
-- jmp paranoid_exit_restore
- paranoid_exit_no_swapgs:
-- TRACE_IRQS_IRETQ_DEBUG
--paranoid_exit_restore:
- RESTORE_EXTRA_REGS
- RESTORE_C_REGS
- REMOVE_PT_GPREGS_FROM_STACK 8
-diff --git a/arch/x86/entry/entry_64_compat.S b/arch/x86/entry/entry_64_compat.S
-index 0eb5801..d76a976 100644
---- a/arch/x86/entry/entry_64_compat.S
-+++ b/arch/x86/entry/entry_64_compat.S
-@@ -343,7 +343,7 @@ ENTRY(entry_INT80_compat)
-
- /* Go back to user mode. */
- TRACE_IRQS_ON
-- SWITCH_USER_CR3_NO_STACK
-+ SWITCH_USER_CR3
- SWAPGS
- jmp restore_regs_and_iret
- END(entry_INT80_compat)
-diff --git a/arch/x86/include/asm/kaiser.h b/arch/x86/include/asm/kaiser.h
-index 48d8d70..3dc5f4c 100644
---- a/arch/x86/include/asm/kaiser.h
-+++ b/arch/x86/include/asm/kaiser.h
-@@ -63,20 +63,12 @@ _SWITCH_TO_KERNEL_CR3 %rax
- movq PER_CPU_VAR(unsafe_stack_register_backup), %rax
- .endm
-
--.macro SWITCH_USER_CR3_NO_STACK
--movq %rax, PER_CPU_VAR(unsafe_stack_register_backup)
--_SWITCH_TO_USER_CR3 %rax %al
--movq PER_CPU_VAR(unsafe_stack_register_backup), %rax
--.endm
--
- #else /* CONFIG_KAISER */
-
- .macro SWITCH_KERNEL_CR3 reg
- .endm
- .macro SWITCH_USER_CR3 reg regb
- .endm
--.macro SWITCH_USER_CR3_NO_STACK
--.endm
- .macro SWITCH_KERNEL_CR3_NO_STACK
- .endm
-
---
-2.7.4
-