aboutsummaryrefslogtreecommitdiffstats
path: root/arch/parisc
diff options
context:
space:
mode:
authorHelge Deller <deller@gmx.de>2016-10-11 14:49:42 -0400
committerHelge Deller <deller@gmx.de>2016-10-11 14:52:47 -0400
commit0a862485f42af7df530b0b5f0e5ba8ffbb3a4a12 (patch)
tree15623a89fecbbfbedcc6854ee148ee8ff2efe171 /arch/parisc
parente3b6a02816ebbda3acfde2f079446ba92c97e70b (diff)
parisc: Show trap name in kernel crash
Show the real trap name when the kernel crashes. Signed-off-by: Helge Deller <deller@gmx.de>
Diffstat (limited to 'arch/parisc')
-rw-r--r--arch/parisc/include/asm/traps.h1
-rw-r--r--arch/parisc/kernel/traps.c4
-rw-r--r--arch/parisc/mm/fault.c17
3 files changed, 14 insertions, 8 deletions
diff --git a/arch/parisc/include/asm/traps.h b/arch/parisc/include/asm/traps.h
index 5e953ab4530d..63670231f48a 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,
11void die_if_kernel(char *str, struct pt_regs *regs, long err); 11void die_if_kernel(char *str, struct pt_regs *regs, long err);
12 12
13/* mm/fault.c */ 13/* mm/fault.c */
14const char *trap_name(unsigned long code);
14void do_page_fault(struct pt_regs *regs, unsigned long code, 15void do_page_fault(struct pt_regs *regs, unsigned long code,
15 unsigned long address); 16 unsigned long address);
16#endif 17#endif
diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c
index 97d6b208e129..378df9207406 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
458 } 458 }
459 459
460 printk("\n"); 460 printk("\n");
461 printk(KERN_CRIT "%s: Code=%d regs=%p (Addr=" RFMT ")\n", 461 pr_crit("%s: Code=%d (%s) regs=%p (Addr=" RFMT ")\n",
462 msg, code, regs, offset); 462 msg, code, trap_name(code), regs, offset);
463 show_regs(regs); 463 show_regs(regs);
464 464
465 spin_unlock(&terminate_lock); 465 spin_unlock(&terminate_lock);
diff --git a/arch/parisc/mm/fault.c b/arch/parisc/mm/fault.c
index d64f1c854fdf..8ff9253930af 100644
--- a/arch/parisc/mm/fault.c
+++ b/arch/parisc/mm/fault.c
@@ -204,6 +204,16 @@ static const char * const trap_description[] = {
204 [28] "Unaligned data reference trap", 204 [28] "Unaligned data reference trap",
205}; 205};
206 206
207const char *trap_name(unsigned long code)
208{
209 const char *t = NULL;
210
211 if (code < ARRAY_SIZE(trap_description))
212 t = trap_description[code];
213
214 return t ? t : "Unknown trap";
215}
216
207/* 217/*
208 * Print out info about fatal segfaults, if the show_unhandled_signals 218 * Print out info about fatal segfaults, if the show_unhandled_signals
209 * sysctl is set: 219 * sysctl is set:
@@ -213,8 +223,6 @@ show_signal_msg(struct pt_regs *regs, unsigned long code,
213 unsigned long address, struct task_struct *tsk, 223 unsigned long address, struct task_struct *tsk,
214 struct vm_area_struct *vma) 224 struct vm_area_struct *vma)
215{ 225{
216 const char *trap_name = NULL;
217
218 if (!unhandled_signal(tsk, SIGSEGV)) 226 if (!unhandled_signal(tsk, SIGSEGV))
219 return; 227 return;
220 228
@@ -226,10 +234,7 @@ show_signal_msg(struct pt_regs *regs, unsigned long code,
226 tsk->comm, code, address); 234 tsk->comm, code, address);
227 print_vma_addr(KERN_CONT " in ", regs->iaoq[0]); 235 print_vma_addr(KERN_CONT " in ", regs->iaoq[0]);
228 236
229 if (code < ARRAY_SIZE(trap_description)) 237 pr_cont(" trap #%lu: %s%c", code, trap_name(code),
230 trap_name = trap_description[code];
231 pr_warn(KERN_CONT " trap #%lu: %s%c", code,
232 trap_name ? trap_name : "unknown",
233 vma ? ',':'\n'); 238 vma ? ',':'\n');
234 239
235 if (vma) 240 if (vma)