Date: Wed, 2 Jan 2002 04:00:45 +1100 (EST) From: Bruce Evans <bde@zeta.org.au> To: John Baldwin <jhb@FreeBSD.org> Cc: Poul-Henning Kamp <phk@FreeBSD.org>, <cvs-all@FreeBSD.org>, <cvs-committers@FreeBSD.org> Subject: RE: cvs commit: src/sys/i386/i386 trap.c Message-ID: <20020102035156.M10589-100000@gamplex.bde.org> In-Reply-To: <XFMail.011231123911.jhb@FreeBSD.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, 31 Dec 2001, John Baldwin wrote: > On 30-Dec-01 Poul-Henning Kamp wrote: > > phk 2001/12/30 11:43:59 PST > > > > Modified files: > > sys/i386/i386 trap.c > > Log: > > GC an alternate trap_pfault() which has rotted away behind an "#ifdef > > notyet" > > since 21-Mar-95 . > > I thought we wanted to switch to using it as it simplifies some of the kernel > fault handling but just had a few unsafe places in the kernel to fix? I added the check for disallowing pagefaults for user addresses in kernel mode except ones for copying functions. It is just the (!usermode && PCPU_GET(curpcb)->pcb_onfault == NULL) part of the patch (the other changes are mostly to optimize some copying functions). I haven't merged any of the simplifications from the old version. %%% Index: trap.c =================================================================== RCS file: /home/ncvs/src/sys/i386/i386/trap.c,v retrieving revision 1.210 diff -u -2 -r1.210 trap.c --- trap.c 30 Dec 2001 19:43:59 -0000 1.210 +++ trap.c 1 Jan 2002 16:39:50 -0000 @@ -688,10 +719,21 @@ /* * This is a fault on non-kernel virtual memory. - * vm is initialized above to NULL. If curproc is NULL - * or curproc->p_vmspace is NULL the fault is fatal. + * Do not allow it in kernel mode unless it is for a + * a recognized copying function. */ - if (p != NULL) - vm = p->p_vmspace; + if (!usermode && + frame->tf_eip != (int)fubyte_access && + frame->tf_eip != (int)fusword_access && + frame->tf_eip != (int)fuword_access && + frame->tf_eip != (int)subyte_access && + frame->tf_eip != (int)susword_access && + frame->tf_eip != (int)suword_access && + PCPU_GET(curpcb)->pcb_onfault == NULL) + goto nogo; + /* + * If curproc->p_vmspace is NULL the fault is fatal. + */ + vm = p->p_vmspace; if (vm == NULL) goto nogo; %%% This is completely untested (except for removing the p != NULL check). Bruce To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe cvs-all" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020102035156.M10589-100000>