[Linux-ia64] fix for siginfo.si_addr on NaT page triggered SIGSEGV

From: David Mosberger <davidm_at_napali.hpl.hp.com>
Date: 2003-03-07 08:26:35
The patch below fixes a bug which caused si_addr to be set to the
faulting IP instead of the faulting data address when a SIGSEGV got
triggered by the NaT page.  The patch is relative to 2.5, but I
believe it applies on 2.4 as well.

	--david

===== arch/ia64/kernel/traps.c 1.25 vs edited =====
--- 1.25/arch/ia64/kernel/traps.c	Tue Feb  4 17:06:16 2003
+++ edited/arch/ia64/kernel/traps.c	Thu Mar  6 11:44:58 2003
@@ -486,19 +486,23 @@
 
 	      case 26: /* NaT Consumption */
 		if (user_mode(regs)) {
+			void *addr;
+
 			if (((isr >> 4) & 0xf) == 2) {
 				/* NaT page consumption */
 				sig = SIGSEGV;
 				code = SEGV_ACCERR;
+				addr = (void *) ifa;
 			} else {
 				/* register NaT consumption */
 				sig = SIGILL;
 				code = ILL_ILLOPN;
+				addr = (void *) (regs->cr_iip + ia64_psr(regs)->ri);
 			}
 			siginfo.si_signo = sig;
 			siginfo.si_code = code;
 			siginfo.si_errno = 0;
-			siginfo.si_addr = (void *) (regs->cr_iip + ia64_psr(regs)->ri);
+			siginfo.si_addr = addr;
 			siginfo.si_imm = vector;
 			siginfo.si_flags = __ISR_VALID;
 			siginfo.si_isr = isr;
Received on Thu Mar 06 13:28:15 2003

This archive was generated by hypermail 2.1.8 : 2005-08-02 09:20:12 EST