diff options
| author | Helge Deller <deller@gmx.de> | 2013-11-07 17:08:36 +0100 | 
|---|---|---|
| committer | Helge Deller <deller@gmx.de> | 2013-11-07 22:29:24 +0100 | 
| commit | 1f2048fd8bc4219db821611da305a74f4b72b3c3 (patch) | |
| tree | be8e53b15accf5a770482f1e33ea4a0904fa25f7 | |
| parent | 63379c135331c724d40a87b98eb62d2122981341 (diff) | |
parisc: signal fixup - SIGBUS vs. SIGSEGV
Clean up code to send correct signal on invalid memory accesses:
Send SIGBUS instead of SIGSEGV for memory accesses outside of mmap'ed
areas
This fixes the mmap13 testcase from the Linux Test Project.
Signed-off-by: Helge Deller <deller@gmx.de>
| -rw-r--r-- | arch/parisc/mm/fault.c | 18 | 
1 files changed, 14 insertions, 4 deletions
diff --git a/arch/parisc/mm/fault.c b/arch/parisc/mm/fault.c index df0d32971cdf..7584a5df0fa4 100644 --- a/arch/parisc/mm/fault.c +++ b/arch/parisc/mm/fault.c @@ -280,12 +280,22 @@ bad_area:  		}  		show_regs(regs);  #endif -		/* FIXME: actually we need to get the signo and code correct */ -		si.si_signo = SIGSEGV; +		switch (code) { +		case 15:	/* Data TLB miss fault/Data page fault */ +		case 17:	/* NA data TLB miss / page fault */ +		case 18:	/* Unaligned access - PCXS only */ +			si.si_signo = SIGBUS; +			si.si_code = 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; +		}  		si.si_errno = 0; -		si.si_code = SEGV_MAPERR;  		si.si_addr = (void __user *) address; -		force_sig_info(SIGSEGV, &si, current); +		force_sig_info(si.si_signo, &si, current);  		return;  	}  | 
