Date: Sun, 8 Jun 2003 18:27:51 -0700 (PDT) From: Marcel Moolenaar <marcel@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 32829 for review Message-ID: <200306090127.h591Rpgi021921@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=32829 Change 32829 by marcel@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;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200306090127.h591Rpgi021921>