PERFORCE change 32829 for review

Marcel Moolenaar marcel at FreeBSD.org
Sun Jun 8 18:27:54 PDT 2003


http://perforce.freebsd.org/chv.cgi?CH=32829

Change 32829 by marcel at marcel_nfs on 2003/06/08 18:27:02

	Avoid the possibility that we're trying to send a signal to
	the process as the result of a fault in the gateway page.
	If this happens, the fault happens either in epc_sigtramp()
	or break_sigtramp() and generally means that the register
	stack space is exhausted or the backing store pointer is
	invalid. Either way, the fault got triggered while sending
	a signal to the process and sending a signal to the process
	because of that is bound to cause exactly the same: a fault,
	followed by a signal, followed by a fault followed by nausea.
	
	Keep a debug printf() in here so that we'll know if and when
	this kicks in.

Affected files ...

.. //depot/projects/ia64/sys/ia64/ia64/machdep.c#77 edit

Differences ...

==== //depot/projects/ia64/sys/ia64/ia64/machdep.c#77 (text+ko) ====

@@ -831,11 +831,26 @@
 	int oonstack;
 
 	td = curthread;
+	tf = td->td_frame;
+
+	/*
+	 * Bail out if we're sending a signal due to a fault in the gateway
+	 * page. If that happens, we were trying to send a signal but the
+	 * backing store address was invalid. Trying to send a signal in that
+	 * case will not work.
+	 * Note that the test for region 5 is a bit sloppy, but does not
+	 * give false positives.
+	 */
+	if ((tf->tf_special.iip >> 61) == 5) {
+		printf("XXX: Fault in gateway page. Cannot send signal.\n");
+		sigexit(td, SIGSEGV);
+		return;
+	}
+
 	p = td->td_proc;
 	PROC_LOCK_ASSERT(p, MA_OWNED);
 	psp = p->p_sigacts;
 	mtx_assert(&psp->ps_mtx, MA_OWNED);
-	tf = td->td_frame;
 	sp = tf->tf_special.sp;
 	oonstack = sigonstack(sp);
 	sbs = 0;


More information about the p4-projects mailing list