4892188 Non-faulting load returns 0 for misaligned address under v8plus & memalign=8i
authormb158278
Thu, 27 Jul 2006 13:46:03 -0700
changeset 2458 57289607cb87
parent 2457 4d90a6ed88f7
child 2459 7511d9859fcd
4892188 Non-faulting load returns 0 for misaligned address under v8plus & memalign=8i
usr/src/uts/sun4/os/trap.c
--- a/usr/src/uts/sun4/os/trap.c	Thu Jul 27 13:37:12 2006 -0700
+++ b/usr/src/uts/sun4/os/trap.c	Thu Jul 27 13:46:03 2006 -0700
@@ -804,10 +804,10 @@
 				goto out;
 		}
 
-		if (nfload(rp, NULL))
-			goto out;
 		bzero(&siginfo, sizeof (siginfo));
 		if (type == T_SYS_RTT_ALIGN + T_USER) {
+			if (nfload(rp, NULL))
+				goto out;
 			/*
 			 * Can't do unaligned stack access
 			 */
@@ -817,17 +817,25 @@
 			fault = FLTACCESS;
 			break;
 		}
+
+		/*
+		 * Try to fix alignment before non-faulting load test.
+		 */
 		if (p->p_fixalignment) {
 			if (do_unaligned(rp, &badaddr) == SIMU_SUCCESS) {
 				rp->r_pc = rp->r_npc;
 				rp->r_npc += 4;
 				goto out;
 			}
+			if (nfload(rp, NULL))
+				goto out;
 			siginfo.si_signo = SIGSEGV;
 			siginfo.si_code = SEGV_MAPERR;
 			siginfo.si_addr = badaddr;
 			fault = FLTBOUNDS;
 		} else {
+			if (nfload(rp, NULL))
+				goto out;
 			siginfo.si_signo = SIGBUS;
 			siginfo.si_code = BUS_ADRALN;
 			if (rp->r_pc & 3) {	/* offending address, if pc */