From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752852AbeCOPqk (ORCPT ); Thu, 15 Mar 2018 11:46:40 -0400 Received: from mail.skyhub.de ([5.9.137.197]:48024 "EHLO mail.skyhub.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752600AbeCOPqi (ORCPT ); Thu, 15 Mar 2018 11:46:38 -0400 From: Borislav Petkov To: X86 ML Cc: Andy Lutomirski , Josh Poimboeuf , Linus Torvalds , Peter Zijlstra , LKML Subject: [PATCH 8/9] x86/dumpstack: Save first regs set for the executive summary Date: Thu, 15 Mar 2018 16:44:47 +0100 Message-Id: <20180315154448.16222-9-bp@alien8.de> X-Mailer: git-send-email 2.13.0 In-Reply-To: <20180315154448.16222-1-bp@alien8.de> References: <20180315154448.16222-1-bp@alien8.de> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Borislav Petkov Save the regs set when we call __die() for the first time and print it in oops_end(). Signed-off-by: Borislav Petkov --- arch/x86/kernel/dumpstack.c | 33 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/arch/x86/kernel/dumpstack.c b/arch/x86/kernel/dumpstack.c index 8cf2e2289d50..bb712ca99632 100644 --- a/arch/x86/kernel/dumpstack.c +++ b/arch/x86/kernel/dumpstack.c @@ -26,6 +26,8 @@ int panic_on_unrecovered_nmi; int panic_on_io_nmi; static int die_counter; +static struct pt_regs exec_summary_regs; + bool in_task_stack(unsigned long *stack, struct task_struct *task, struct stack_info *info) { @@ -321,6 +323,9 @@ void oops_end(unsigned long flags, struct pt_regs *regs, int signr) raw_local_irq_restore(flags); oops_exit(); + /* Executive summary in case the oops scrolled away */ + __show_regs(&exec_summary_regs, false); + if (!signr) return; if (in_interrupt()) @@ -339,10 +344,10 @@ NOKPROBE_SYMBOL(oops_end); int __die(const char *str, struct pt_regs *regs, long err) { -#ifdef CONFIG_X86_32 - unsigned short ss; - unsigned long sp; -#endif + /* Save the regs of the first oops for the executive summary later. */ + if (!die_counter) + exec_summary_regs = *regs; + printk(KERN_DEFAULT "%s: %04lx [#%d]%s%s%s%s%s\n", str, err & 0xffff, ++die_counter, IS_ENABLED(CONFIG_PREEMPT) ? " PREEMPT" : "", @@ -352,26 +357,14 @@ int __die(const char *str, struct pt_regs *regs, long err) IS_ENABLED(CONFIG_PAGE_TABLE_ISOLATION) ? (boot_cpu_has(X86_FEATURE_PTI) ? " PTI" : " NOPTI") : ""); + show_regs(regs); + if (notify_die(DIE_OOPS, str, regs, err, current->thread.trap_nr, SIGSEGV) == NOTIFY_STOP) return 1; print_modules(); - show_regs(regs); -#ifdef CONFIG_X86_32 - if (user_mode(regs)) { - sp = regs->sp; - ss = regs->ss; - } else { - sp = kernel_stack_pointer(regs); - savesegment(ss, ss); - } - printk(KERN_EMERG "EIP: %pS SS:ESP: %04x:%08lx\n", - (void *)regs->ip, ss, sp); -#else - /* Executive summary in case the oops scrolled away */ - printk(KERN_ALERT "RIP: %pS RSP: %016lx\n", (void *)regs->ip, regs->sp); -#endif + return 0; } NOKPROBE_SYMBOL(__die); @@ -410,7 +403,5 @@ void show_regs(struct pt_regs *regs) if (regs->ip < PAGE_OFFSET) pr_cont(" Bad RIP value.\n"); - else - show_opcodes((u8 *)regs->ip, KERN_DEFAULT); } } -- 2.13.0