commit: 8348d8b68abd9b60bb2e42c5e7d8ec894d786ba3 Author: Alice Ferrazzi <alicef <AT> gentoo <DOT> org> AuthorDate: Fri Jan 5 15:40:53 2018 +0000 Commit: Alice Ferrazzi <alicef <AT> gentoo <DOT> org> CommitDate: Fri Jan 5 15:40:53 2018 +0000 URL: https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=8348d8b6
removed upstreamed patch x86 page table isolation fixes 0000_README | 3 - 1700_x86-page-table-isolation-fixes.patch | 453 ------------------------------ 2 files changed, 456 deletions(-) diff --git a/0000_README b/0000_README index a10ea98..e98e570 100644 --- a/0000_README +++ b/0000_README @@ -99,9 +99,6 @@ Patch: 1510_fs-enable-link-security-restrictions-by-default.patch From: http://sources.debian.net/src/linux/3.16.7-ckt4-3/debian/patches/debian/fs-enable-link-security-restrictions-by-default.patch/ Desc: Enable link security restrictions by default. -Patch: 1700_x86-page-table-isolation-fixes.patch -From: https://github.com/torvalds/linux/commit/00a5ae218d57741088068799b810416ac249a9ce -Desc: x86 page table isolation fixes comulative patch. Patch: 2100_bcache-data-corruption-fix-for-bi-partno.patch From: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=62530ed8b1d07a45dec94d46e521c0c6c2d476e6 diff --git a/1700_x86-page-table-isolation-fixes.patch b/1700_x86-page-table-isolation-fixes.patch deleted file mode 100644 index 6fcbf41..0000000 --- a/1700_x86-page-table-isolation-fixes.patch +++ /dev/null @@ -1,453 +0,0 @@ -From 87faa0d9b43b4755ff6963a22d1fd1bee1aa3b39 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner <t...@linutronix.de> -Date: Wed, 3 Jan 2018 15:18:44 +0100 -Subject: [PATCH 1/7] x86/pti: Enable PTI by default - -This really want's to be enabled by default. Users who know what they are -doing can disable it either in the config or on the kernel command line. - -Signed-off-by: Thomas Gleixner <t...@linutronix.de> -Cc: sta...@vger.kernel.org ---- - security/Kconfig | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/security/Kconfig b/security/Kconfig -index a623d13bf2884..3d4debd0257e2 100644 ---- a/security/Kconfig -+++ b/security/Kconfig -@@ -56,6 +56,7 @@ config SECURITY_NETWORK - - config PAGE_TABLE_ISOLATION - bool "Remove the kernel mapping in user mode" -+ default y - depends on X86_64 && !UML - help - This feature reduces the number of hardware side channels by - -From 694d99d40972f12e59a3696effee8a376b79d7c8 Mon Sep 17 00:00:00 2001 -From: Tom Lendacky <thomas.lenda...@amd.com> -Date: Tue, 26 Dec 2017 23:43:54 -0600 -Subject: [PATCH 2/7] x86/cpu, x86/pti: Do not enable PTI on AMD processors - -AMD processors are not subject to the types of attacks that the kernel -page table isolation feature protects against. The AMD microarchitecture -does not allow memory references, including speculative references, that -access higher privileged data when running in a lesser privileged mode -when that access would result in a page fault. - -Disable page table isolation by default on AMD processors by not setting -the X86_BUG_CPU_INSECURE feature, which controls whether X86_FEATURE_PTI -is set. - -Signed-off-by: Tom Lendacky <thomas.lenda...@amd.com> -Signed-off-by: Thomas Gleixner <t...@linutronix.de> -Reviewed-by: Borislav Petkov <b...@suse.de> -Cc: Dave Hansen <dave.han...@linux.intel.com> -Cc: Andy Lutomirski <l...@kernel.org> -Cc: sta...@vger.kernel.org -Link: https://lkml.kernel.org/r/20171227054354.20369.94587.st...@tlendack-t1.amdoffice.net ---- - arch/x86/kernel/cpu/common.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c -index f2a94dfb434e9..b1be494ab4e8b 100644 ---- a/arch/x86/kernel/cpu/common.c -+++ b/arch/x86/kernel/cpu/common.c -@@ -899,8 +899,8 @@ static void __init early_identify_cpu(struct cpuinfo_x86 *c) - - setup_force_cpu_cap(X86_FEATURE_ALWAYS); - -- /* Assume for now that ALL x86 CPUs are insecure */ -- setup_force_cpu_bug(X86_BUG_CPU_INSECURE); -+ if (c->x86_vendor != X86_VENDOR_AMD) -+ setup_force_cpu_bug(X86_BUG_CPU_INSECURE); - - fpu__init_system(c); - - -From 52994c256df36fda9a715697431cba9daecb6b11 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner <t...@linutronix.de> -Date: Wed, 3 Jan 2018 15:57:59 +0100 -Subject: [PATCH 3/7] x86/pti: Make sure the user/kernel PTEs match - -Meelis reported that his K8 Athlon64 emits MCE warnings when PTI is -enabled: - -[Hardware Error]: Error Addr: 0x0000ffff81e000e0 -[Hardware Error]: MC1 Error: L1 TLB multimatch. -[Hardware Error]: cache level: L1, tx: INSN - -The address is in the entry area, which is mapped into kernel _AND_ user -space. That's special because we switch CR3 while we are executing -there. - -User mapping: -0xffffffff81e00000-0xffffffff82000000 2M ro PSE GLB x pmd - -Kernel mapping: -0xffffffff81000000-0xffffffff82000000 16M ro PSE x pmd - -So the K8 is complaining that the TLB entries differ. They differ in the -GLB bit. - -Drop the GLB bit when installing the user shared mapping. - -Fixes: 6dc72c3cbca0 ("x86/mm/pti: Share entry text PMD") -Reported-by: Meelis Roos <mr...@linux.ee> -Signed-off-by: Thomas Gleixner <t...@linutronix.de> -Tested-by: Meelis Roos <mr...@linux.ee> -Cc: Borislav Petkov <b...@alien8.de> -Cc: Tom Lendacky <thomas.lenda...@amd.com> -Cc: sta...@vger.kernel.org -Link: https://lkml.kernel.org/r/alpine.DEB.2.20.1801031407180.1957@nanos ---- - arch/x86/mm/pti.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/arch/x86/mm/pti.c b/arch/x86/mm/pti.c -index bce8aea656062..2da28ba975082 100644 ---- a/arch/x86/mm/pti.c -+++ b/arch/x86/mm/pti.c -@@ -367,7 +367,8 @@ static void __init pti_setup_espfix64(void) - static void __init pti_clone_entry_text(void) - { - pti_clone_pmds((unsigned long) __entry_text_start, -- (unsigned long) __irqentry_text_end, _PAGE_RW); -+ (unsigned long) __irqentry_text_end, -+ _PAGE_RW | _PAGE_GLOBAL); - } - - /* - -From a9cdbe72c4e8bf3b38781c317a79326e2e1a230d Mon Sep 17 00:00:00 2001 -From: Josh Poimboeuf <jpoim...@redhat.com> -Date: Sun, 31 Dec 2017 10:18:06 -0600 -Subject: [PATCH 4/7] x86/dumpstack: Fix partial register dumps -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The show_regs_safe() logic is wrong. When there's an iret stack frame, -it prints the entire pt_regs -- most of which is random stack data -- -instead of just the five registers at the end. - -show_regs_safe() is also poorly named: the on_stack() checks aren't for -safety. Rename the function to show_regs_if_on_stack() and add a -comment to explain why the checks are needed. - -These issues were introduced with the "partial register dump" feature of -the following commit: - - b02fcf9ba121 ("x86/unwinder: Handle stack overflows more gracefully") - -That patch had gone through a few iterations of development, and the -above issues were artifacts from a previous iteration of the patch where -'regs' pointed directly to the iret frame rather than to the (partially -empty) pt_regs. - -Tested-by: Alexander Tsoy <alexan...@tsoy.me> -Signed-off-by: Josh Poimboeuf <jpoim...@redhat.com> -Cc: Andy Lutomirski <l...@kernel.org> -Cc: Linus Torvalds <torva...@linux-foundation.org> -Cc: Peter Zijlstra <pet...@infradead.org> -Cc: Thomas Gleixner <t...@linutronix.de> -Cc: Toralf Förster <toralf.foers...@gmx.de> -Cc: sta...@vger.kernel.org -Fixes: b02fcf9ba121 ("x86/unwinder: Handle stack overflows more gracefully") -Link: http://lkml.kernel.org/r/5b05b8b344f59db2d3d50dbdeba92d60f2304c54.1514736742.git.jpoim...@redhat.com -Signed-off-by: Ingo Molnar <mi...@kernel.org> ---- - arch/x86/include/asm/unwind.h | 17 +++++++++++++---- - arch/x86/kernel/dumpstack.c | 28 ++++++++++++++++++++-------- - arch/x86/kernel/stacktrace.c | 2 +- - 3 files changed, 34 insertions(+), 13 deletions(-) - -diff --git a/arch/x86/include/asm/unwind.h b/arch/x86/include/asm/unwind.h -index c1688c2d0a128..1f86e1b0a5cdc 100644 ---- a/arch/x86/include/asm/unwind.h -+++ b/arch/x86/include/asm/unwind.h -@@ -56,18 +56,27 @@ void unwind_start(struct unwind_state *state, struct task_struct *task, - - #if defined(CONFIG_UNWINDER_ORC) || defined(CONFIG_UNWINDER_FRAME_POINTER) - /* -- * WARNING: The entire pt_regs may not be safe to dereference. In some cases, -- * only the iret frame registers are accessible. Use with caution! -+ * If 'partial' returns true, only the iret frame registers are valid. - */ --static inline struct pt_regs *unwind_get_entry_regs(struct unwind_state *state) -+static inline struct pt_regs *unwind_get_entry_regs(struct unwind_state *state, -+ bool *partial) - { - if (unwind_done(state)) - return NULL; - -+ if (partial) { -+#ifdef CONFIG_UNWINDER_ORC -+ *partial = !state->full_regs; -+#else -+ *partial = false; -+#endif -+ } -+ - return state->regs; - } - #else --static inline struct pt_regs *unwind_get_entry_regs(struct unwind_state *state) -+static inline struct pt_regs *unwind_get_entry_regs(struct unwind_state *state, -+ bool *partial) - { - return NULL; - } -diff --git a/arch/x86/kernel/dumpstack.c b/arch/x86/kernel/dumpstack.c -index 5fa110699ed27..d0bb176a7261a 100644 ---- a/arch/x86/kernel/dumpstack.c -+++ b/arch/x86/kernel/dumpstack.c -@@ -76,12 +76,23 @@ void show_iret_regs(struct pt_regs *regs) - regs->sp, regs->flags); - } - --static void show_regs_safe(struct stack_info *info, struct pt_regs *regs) -+static void show_regs_if_on_stack(struct stack_info *info, struct pt_regs *regs, -+ bool partial) - { -- if (on_stack(info, regs, sizeof(*regs))) -+ /* -+ * These on_stack() checks aren't strictly necessary: the unwind code -+ * has already validated the 'regs' pointer. The checks are done for -+ * ordering reasons: if the registers are on the next stack, we don't -+ * want to print them out yet. Otherwise they'll be shown as part of -+ * the wrong stack. Later, when show_trace_log_lvl() switches to the -+ * next stack, this function will be called again with the same regs so -+ * they can be printed in the right context. -+ */ -+ if (!partial && on_stack(info, regs, sizeof(*regs))) { - __show_regs(regs, 0); -- else if (on_stack(info, (void *)regs + IRET_FRAME_OFFSET, -- IRET_FRAME_SIZE)) { -+ -+ } else if (partial && on_stack(info, (void *)regs + IRET_FRAME_OFFSET, -+ IRET_FRAME_SIZE)) { - /* - * When an interrupt or exception occurs in entry code, the - * full pt_regs might not have been saved yet. In that case -@@ -98,6 +109,7 @@ void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs, - struct stack_info stack_info = {0}; - unsigned long visit_mask = 0; - int graph_idx = 0; -+ bool partial; - - printk("%sCall Trace:\n", log_lvl); - -@@ -140,7 +152,7 @@ void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs, - printk("%s <%s>\n", log_lvl, stack_name); - - if (regs) -- show_regs_safe(&stack_info, regs); -+ show_regs_if_on_stack(&stack_info, regs, partial); - - /* - * Scan the stack, printing any text addresses we find. At the -@@ -164,7 +176,7 @@ void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs, - - /* - * Don't print regs->ip again if it was already printed -- * by show_regs_safe() below. -+ * by show_regs_if_on_stack(). - */ - if (regs && stack == ®s->ip) - goto next; -@@ -199,9 +211,9 @@ void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs, - unwind_next_frame(&state); - - /* if the frame has entry regs, print them */ -- regs = unwind_get_entry_regs(&state); -+ regs = unwind_get_entry_regs(&state, &partial); - if (regs) -- show_regs_safe(&stack_info, regs); -+ show_regs_if_on_stack(&stack_info, regs, partial); - } - - if (stack_name) -diff --git a/arch/x86/kernel/stacktrace.c b/arch/x86/kernel/stacktrace.c -index 8dabd7bf16730..60244bfaf88f6 100644 ---- a/arch/x86/kernel/stacktrace.c -+++ b/arch/x86/kernel/stacktrace.c -@@ -98,7 +98,7 @@ static int __save_stack_trace_reliable(struct stack_trace *trace, - for (unwind_start(&state, task, NULL, NULL); !unwind_done(&state); - unwind_next_frame(&state)) { - -- regs = unwind_get_entry_regs(&state); -+ regs = unwind_get_entry_regs(&state, NULL); - if (regs) { - /* - * Kernel mode registers on the stack indicate an - -From 3ffdeb1a02be3086f1411a15c5b9c481fa28e21f Mon Sep 17 00:00:00 2001 -From: Josh Poimboeuf <jpoim...@redhat.com> -Date: Sun, 31 Dec 2017 10:18:07 -0600 -Subject: [PATCH 5/7] x86/dumpstack: Print registers for first stack frame -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -In the stack dump code, if the frame after the starting pt_regs is also -a regs frame, the registers don't get printed. Fix that. - -Reported-by: Andy Lutomirski <l...@amacapital.net> -Tested-by: Alexander Tsoy <alexan...@tsoy.me> -Signed-off-by: Josh Poimboeuf <jpoim...@redhat.com> -Cc: Andy Lutomirski <l...@kernel.org> -Cc: Linus Torvalds <torva...@linux-foundation.org> -Cc: Peter Zijlstra <pet...@infradead.org> -Cc: Thomas Gleixner <t...@linutronix.de> -Cc: Toralf Förster <toralf.foers...@gmx.de> -Cc: sta...@vger.kernel.org -Fixes: 3b3fa11bc700 ("x86/dumpstack: Print any pt_regs found on the stack") -Link: http://lkml.kernel.org/r/396f84491d2f0ef64eda4217a2165f5712f6a115.1514736742.git.jpoim...@redhat.com -Signed-off-by: Ingo Molnar <mi...@kernel.org> ---- - arch/x86/kernel/dumpstack.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/arch/x86/kernel/dumpstack.c b/arch/x86/kernel/dumpstack.c -index d0bb176a7261a..afbecff161d16 100644 ---- a/arch/x86/kernel/dumpstack.c -+++ b/arch/x86/kernel/dumpstack.c -@@ -115,6 +115,7 @@ void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs, - - unwind_start(&state, task, regs, stack); - stack = stack ? : get_stack_pointer(task, regs); -+ regs = unwind_get_entry_regs(&state, &partial); - - /* - * Iterate through the stacks, starting with the current stack pointer. -@@ -132,7 +133,7 @@ void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs, - * - hardirq stack - * - entry stack - */ -- for (regs = NULL; stack; stack = PTR_ALIGN(stack_info.next_sp, sizeof(long))) { -+ for ( ; stack; stack = PTR_ALIGN(stack_info.next_sp, sizeof(long))) { - const char *stack_name; - - if (get_stack_info(stack, task, &stack_info, &visit_mask)) { - -From d7732ba55c4b6a2da339bb12589c515830cfac2c Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner <t...@linutronix.de> -Date: Wed, 3 Jan 2018 19:52:04 +0100 -Subject: [PATCH 6/7] x86/pti: Switch to kernel CR3 at early in - entry_SYSCALL_compat() - -The preparation for PTI which added CR3 switching to the entry code -misplaced the CR3 switch in entry_SYSCALL_compat(). - -With PTI enabled the entry code tries to access a per cpu variable after -switching to kernel GS. This fails because that variable is not mapped to -user space. This results in a double fault and in the worst case a kernel -crash. - -Move the switch ahead of the access and clobber RSP which has been saved -already. - -Fixes: 8a09317b895f ("x86/mm/pti: Prepare the x86/entry assembly code for entry/exit CR3 switching") -Reported-by: Lars Wendler <wendler.l...@web.de> -Reported-by: Laura Abbott <labb...@redhat.com> -Signed-off-by: Thomas Gleixner <t...@linutronix.de> -Cc: Borislav Betkov <b...@alien8.de> -Cc: Andy Lutomirski <l...@kernel.org>, -Cc: Dave Hansen <dave.han...@linux.intel.com>, -Cc: Peter Zijlstra <pet...@infradead.org>, -Cc: Greg KH <gre...@linuxfoundation.org>, , -Cc: Boris Ostrovsky <boris.ostrov...@oracle.com>, -Cc: Juergen Gross <jgr...@suse.com> -Cc: sta...@vger.kernel.org -Link: https://lkml.kernel.org/r/alpine.DEB.2.20.1801031949200.1957@nanos ---- - arch/x86/entry/entry_64_compat.S | 13 ++++++------- - 1 file changed, 6 insertions(+), 7 deletions(-) - -diff --git a/arch/x86/entry/entry_64_compat.S b/arch/x86/entry/entry_64_compat.S -index 40f17009ec20c..98d5358e4041a 100644 ---- a/arch/x86/entry/entry_64_compat.S -+++ b/arch/x86/entry/entry_64_compat.S -@@ -190,8 +190,13 @@ ENTRY(entry_SYSCALL_compat) - /* Interrupts are off on entry. */ - swapgs - -- /* Stash user ESP and switch to the kernel stack. */ -+ /* Stash user ESP */ - movl %esp, %r8d -+ -+ /* Use %rsp as scratch reg. User ESP is stashed in r8 */ -+ SWITCH_TO_KERNEL_CR3 scratch_reg=%rsp -+ -+ /* Switch to the kernel stack */ - movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp - - /* Construct struct pt_regs on stack */ -@@ -219,12 +224,6 @@ GLOBAL(entry_SYSCALL_compat_after_hwframe) - pushq $0 /* pt_regs->r14 = 0 */ - pushq $0 /* pt_regs->r15 = 0 */ - -- /* -- * We just saved %rdi so it is safe to clobber. It is not -- * preserved during the C calls inside TRACE_IRQS_OFF anyway. -- */ -- SWITCH_TO_KERNEL_CR3 scratch_reg=%rdi -- - /* - * User mode is traced as though IRQs are on, and SYSENTER - * turned them off. - -From 2fd9c41aea47f4ad071accf94b94f94f2c4d31eb Mon Sep 17 00:00:00 2001 -From: Nick Desaulniers <ndesaulni...@google.com> -Date: Wed, 3 Jan 2018 12:39:52 -0800 -Subject: [PATCH 7/7] x86/process: Define cpu_tss_rw in same section as - declaration - -cpu_tss_rw is declared with DECLARE_PER_CPU_PAGE_ALIGNED -but then defined with DEFINE_PER_CPU_SHARED_ALIGNED -leading to section mismatch warnings. - -Use DEFINE_PER_CPU_PAGE_ALIGNED consistently. This is necessary because -it's mapped to the cpu entry area and must be page aligned. - -[ tglx: Massaged changelog a bit ] - -Fixes: 1a935bc3d4ea ("x86/entry: Move SYSENTER_stack to the beginning of struct tss_struct") -Suggested-by: Thomas Gleixner <t...@linutronix.de> -Signed-off-by: Nick Desaulniers <ndesaulni...@google.com> -Signed-off-by: Thomas Gleixner <t...@linutronix.de> -Cc: thomas.lenda...@amd.com -Cc: Borislav Petkov <bpet...@suse.de> -Cc: tklau...@distanz.ch -Cc: mini...@googlemail.com -Cc: m...@kylehuey.com -Cc: na...@vmware.com -Cc: l...@kernel.org -Cc: jpoim...@redhat.com -Cc: t...@kernel.org -Cc: c...@linux.com -Cc: b...@suse.de -Cc: thgar...@google.com -Cc: kirill.shute...@linux.intel.com -Cc: sta...@vger.kernel.org -Link: https://lkml.kernel.org/r/20180103203954.183360-1-ndesaulni...@google.com ---- - arch/x86/kernel/process.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c -index 5174159784093..3cb2486c47e48 100644 ---- a/arch/x86/kernel/process.c -+++ b/arch/x86/kernel/process.c -@@ -47,7 +47,7 @@ - * section. Since TSS's are completely CPU-local, we want them - * on exact cacheline boundaries, to eliminate cacheline ping-pong. - */ --__visible DEFINE_PER_CPU_SHARED_ALIGNED(struct tss_struct, cpu_tss_rw) = { -+__visible DEFINE_PER_CPU_PAGE_ALIGNED(struct tss_struct, cpu_tss_rw) = { - .x86_tss = { - /* - * .sp0 is only used when entering ring 0 from a lower