diff options
author | Helge Deller <deller@gmx.de> | 2016-10-11 20:49:42 +0200 |
---|---|---|
committer | Helge Deller <deller@gmx.de> | 2016-10-11 20:52:47 +0200 |
commit | 0a862485f42af7df530b0b5f0e5ba8ffbb3a4a12 (patch) | |
tree | 15623a89fecbbfbedcc6854ee148ee8ff2efe171 | |
parent | e3b6a02816ebbda3acfde2f079446ba92c97e70b (diff) | |
download | op-kernel-dev-0a862485f42af7df530b0b5f0e5ba8ffbb3a4a12.zip op-kernel-dev-0a862485f42af7df530b0b5f0e5ba8ffbb3a4a12.tar.gz |
parisc: Show trap name in kernel crash
Show the real trap name when the kernel crashes.
Signed-off-by: Helge Deller <deller@gmx.de>
-rw-r--r-- | arch/parisc/include/asm/traps.h | 1 | ||||
-rw-r--r-- | arch/parisc/kernel/traps.c | 4 | ||||
-rw-r--r-- | arch/parisc/mm/fault.c | 17 |
3 files changed, 14 insertions, 8 deletions
diff --git a/arch/parisc/include/asm/traps.h b/arch/parisc/include/asm/traps.h index 5e953ab..6367023 100644 --- a/arch/parisc/include/asm/traps.h +++ b/arch/parisc/include/asm/traps.h @@ -11,6 +11,7 @@ void parisc_terminate(char *msg, struct pt_regs *regs, void die_if_kernel(char *str, struct pt_regs *regs, long err); /* mm/fault.c */ +const char *trap_name(unsigned long code); void do_page_fault(struct pt_regs *regs, unsigned long code, unsigned long address); #endif diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c index 97d6b20..378df92 100644 --- a/arch/parisc/kernel/traps.c +++ b/arch/parisc/kernel/traps.c @@ -458,8 +458,8 @@ void parisc_terminate(char *msg, struct pt_regs *regs, int code, unsigned long o } printk("\n"); - printk(KERN_CRIT "%s: Code=%d regs=%p (Addr=" RFMT ")\n", - msg, code, regs, offset); + pr_crit("%s: Code=%d (%s) regs=%p (Addr=" RFMT ")\n", + msg, code, trap_name(code), regs, offset); show_regs(regs); spin_unlock(&terminate_lock); diff --git a/arch/parisc/mm/fault.c b/arch/parisc/mm/fault.c index d64f1c8..8ff9253 100644 --- a/arch/parisc/mm/fault.c +++ b/arch/parisc/mm/fault.c @@ -204,6 +204,16 @@ static const char * const trap_description[] = { [28] "Unaligned data reference trap", }; +const char *trap_name(unsigned long code) +{ + const char *t = NULL; + + if (code < ARRAY_SIZE(trap_description)) + t = trap_description[code]; + + return t ? t : "Unknown trap"; +} + /* * Print out info about fatal segfaults, if the show_unhandled_signals * sysctl is set: @@ -213,8 +223,6 @@ show_signal_msg(struct pt_regs *regs, unsigned long code, unsigned long address, struct task_struct *tsk, struct vm_area_struct *vma) { - const char *trap_name = NULL; - if (!unhandled_signal(tsk, SIGSEGV)) return; @@ -226,10 +234,7 @@ show_signal_msg(struct pt_regs *regs, unsigned long code, tsk->comm, code, address); print_vma_addr(KERN_CONT " in ", regs->iaoq[0]); - if (code < ARRAY_SIZE(trap_description)) - trap_name = trap_description[code]; - pr_warn(KERN_CONT " trap #%lu: %s%c", code, - trap_name ? trap_name : "unknown", + pr_cont(" trap #%lu: %s%c", code, trap_name(code), vma ? ',':'\n'); if (vma) |