parisc: improve SIGBUS/SIGSEGV error reporting
Helge Deller
maintainerPATCH 1/1 parisc: improve SIGBUS/SIGSEGV error reporting
This patch fixes most of the Linux Test Project testcases, e.g. fstat05.
Signed-off-by Helge Deller <[email protected]>
arch/parisc/mm/fault.c +19 -4
@@ -282,16 +282,31 @@ bad_area:#endif switch (code) {case 15 :/* Data TLB miss fault/Data page fault */ +/* Outside of vma area? -> send SIGSEGV */ +if (!vma || + address < vma->vm_start || address > vma->vm_end) + goto send_sigsegv; + +/* Wrong permissions? -> send SIGSEGV */ +if ((vma->vm_flags & acc_type) != acc_type) { + si.si_signo =SIGSEGV ; + si.si_code =SEGV_ACCERR ; +break ; + } + +/* permissions & location OK, but end of mapped file? */ +/* fall through */ case 17 :/* NA data TLB miss / page fault */ case 18 :/* Unaligned access - PCXS only */ - si.si_signo =SIGBUS ; - si.si_code =BUS_ADRERR ; +send_sigbus: si.si_signo =SIGBUS ; + si.si_code = (code ==18 ) ?BUS_ADRALN :BUS_ADRERR ;break ;case 16 :/* Non-access instruction TLB miss fault */ case 26 :/* PCXL: Data memory access rights trap */ default : - si.si_signo =SIGSEGV ; - si.si_code =SEGV_MAPERR ; +send_sigsegv: si.si_signo =SIGSEGV ; + si.si_code = (code ==26 ) ?SEGV_ACCERR :SEGV_MAPERR ; +break ; } si.si_errno =0 ; si.si_addr = (void __user *) address;