Commit 49d1cb2b authored by Helge Deller's avatar Helge Deller

parisc: improve SIGBUS/SIGSEGV error reporting

This patch fixes most of the Linux Test Project testcases, e.g. fstat05.
Signed-off-by: default avatarHelge Deller <deller@gmx.de>
parent 38c79373
...@@ -282,16 +282,34 @@ void do_page_fault(struct pt_regs *regs, unsigned long code, ...@@ -282,16 +282,34 @@ void do_page_fault(struct pt_regs *regs, unsigned long code,
#endif #endif
switch (code) { switch (code) {
case 15: /* Data TLB miss fault/Data page fault */ case 15: /* Data TLB miss fault/Data page fault */
/* send SIGSEGV when outside of vma */
if (!vma ||
address < vma->vm_start || address > vma->vm_end) {
si.si_signo = SIGSEGV;
si.si_code = SEGV_MAPERR;
break;
}
/* send SIGSEGV for wrong permissions */
if ((vma->vm_flags & acc_type) != acc_type) {
si.si_signo = SIGSEGV;
si.si_code = SEGV_ACCERR;
break;
}
/* probably address is outside of mapped file */
/* fall through */
case 17: /* NA data TLB miss / page fault */ case 17: /* NA data TLB miss / page fault */
case 18: /* Unaligned access - PCXS only */ case 18: /* Unaligned access - PCXS only */
si.si_signo = SIGBUS; si.si_signo = SIGBUS;
si.si_code = BUS_ADRERR; si.si_code = (code == 18) ? BUS_ADRALN : BUS_ADRERR;
break; break;
case 16: /* Non-access instruction TLB miss fault */ case 16: /* Non-access instruction TLB miss fault */
case 26: /* PCXL: Data memory access rights trap */ case 26: /* PCXL: Data memory access rights trap */
default: default:
si.si_signo = SIGSEGV; si.si_signo = SIGSEGV;
si.si_code = SEGV_MAPERR; si.si_code = (code == 26) ? SEGV_ACCERR : SEGV_MAPERR;
break;
} }
si.si_errno = 0; si.si_errno = 0;
si.si_addr = (void __user *) address; si.si_addr = (void __user *) address;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment