Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b391667e authored by Helge Deller's avatar Helge Deller
Browse files

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: default avatarHelge Deller <deller@gmx.de>
parent 910a8643
Loading
Loading
Loading
Loading
+47 −1
Original line number Original line Diff line number Diff line
@@ -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);