parisc: Report trap type as human readable string
When faulting on some trap, the kernel currently reports in dmesg: do_page_fault() command='perl' type=6 address=0xbe400403 in libcrypt-2.24.so[f9086000+9000] vm_start = 0x00922000, vm_end = 0x00aed000 With this change the trap type additionally gets reported as human readable string which makes it simpler to recognize the type of problem: do_page_fault() command='perl' type=6 address=0xbe400403 in libcrypt-2.24.so[f9086000+9000] trap #6: Instruction TLB miss fault, vm_start = 0x00922000, vm_end = 0x00aed000 Signed-off-by: Helge Deller <deller@gmx.de>
This commit is contained in:
parent
910a86435d
commit
b391667eb4
@ -167,6 +167,43 @@ int fixup_exception(struct pt_regs *regs)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* parisc hardware trap list
|
||||||
|
*
|
||||||
|
* Documented in section 3 "Addressing and Access Control" of the
|
||||||
|
* "PA-RISC 1.1 Architecture and Instruction Set Reference Manual"
|
||||||
|
* https://parisc.wiki.kernel.org/index.php/File:Pa11_acd.pdf
|
||||||
|
*
|
||||||
|
* For implementation see handle_interruption() in traps.c
|
||||||
|
*/
|
||||||
|
static const char * const trap_description[] = {
|
||||||
|
[1] "High-priority machine check (HPMC)",
|
||||||
|
[2] "Power failure interrupt",
|
||||||
|
[3] "Recovery counter trap",
|
||||||
|
[5] "Low-priority machine check",
|
||||||
|
[6] "Instruction TLB miss fault",
|
||||||
|
[7] "Instruction access rights / protection trap",
|
||||||
|
[8] "Illegal instruction trap",
|
||||||
|
[9] "Break instruction trap",
|
||||||
|
[10] "Privileged operation trap",
|
||||||
|
[11] "Privileged register trap",
|
||||||
|
[12] "Overflow trap",
|
||||||
|
[13] "Conditional trap",
|
||||||
|
[14] "FP Assist Exception trap",
|
||||||
|
[15] "Data TLB miss fault",
|
||||||
|
[16] "Non-access ITLB miss fault",
|
||||||
|
[17] "Non-access DTLB miss fault",
|
||||||
|
[18] "Data memory protection/unaligned access trap",
|
||||||
|
[19] "Data memory break trap",
|
||||||
|
[20] "TLB dirty bit trap",
|
||||||
|
[21] "Page reference trap",
|
||||||
|
[22] "Assist emulation trap",
|
||||||
|
[25] "Taken branch trap",
|
||||||
|
[26] "Data memory access rights trap",
|
||||||
|
[27] "Data memory protection ID trap",
|
||||||
|
[28] "Unaligned data reference trap",
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Print out info about fatal segfaults, if the show_unhandled_signals
|
* Print out info about fatal segfaults, if the show_unhandled_signals
|
||||||
* sysctl is set:
|
* sysctl is set:
|
||||||
@ -176,6 +213,8 @@ show_signal_msg(struct pt_regs *regs, unsigned long code,
|
|||||||
unsigned long address, struct task_struct *tsk,
|
unsigned long address, struct task_struct *tsk,
|
||||||
struct vm_area_struct *vma)
|
struct vm_area_struct *vma)
|
||||||
{
|
{
|
||||||
|
const char *trap_name = NULL;
|
||||||
|
|
||||||
if (!unhandled_signal(tsk, SIGSEGV))
|
if (!unhandled_signal(tsk, SIGSEGV))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -186,8 +225,15 @@ show_signal_msg(struct pt_regs *regs, unsigned long code,
|
|||||||
pr_warn("do_page_fault() command='%s' type=%lu address=0x%08lx",
|
pr_warn("do_page_fault() command='%s' type=%lu address=0x%08lx",
|
||||||
tsk->comm, code, address);
|
tsk->comm, code, address);
|
||||||
print_vma_addr(KERN_CONT " in ", regs->iaoq[0]);
|
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",
|
||||||
|
vma ? ',':'\n');
|
||||||
|
|
||||||
if (vma)
|
if (vma)
|
||||||
pr_warn(" vm_start = 0x%08lx, vm_end = 0x%08lx\n",
|
pr_warn(KERN_CONT " vm_start = 0x%08lx, vm_end = 0x%08lx\n",
|
||||||
vma->vm_start, vma->vm_end);
|
vma->vm_start, vma->vm_end);
|
||||||
|
|
||||||
show_regs(regs);
|
show_regs(regs);
|
||||||
|
Loading…
Reference in New Issue
Block a user