Date: Thu, 08 May 2003 10:39:50 -0400 (EDT) From: John Baldwin <jhb@FreeBSD.org> To: Peter Wemm <peter@FreeBSD.org> Cc: Perforce Change Reviews <perforce@freebsd.org> Subject: RE: PERFORCE change 30777 for review Message-ID: <XFMail.20030508103950.jhb@FreeBSD.org> In-Reply-To: <200305080822.h488MEIg021724@repoman.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On 08-May-2003 Peter Wemm wrote: > http://perforce.freebsd.org/chv.cgi?CH=30777 > > Change 30777 by peter@peter_overcee on 2003/05/08 01:21:28 > > Change the page IDTVEC back to an interrupt gate instead of a trap > gate. Otherwise we could preempt and %cr2 could be reused on another > process when it faults. > > Affected files ... > > .. //depot/projects/hammer/sys/amd64/amd64/machdep.c#12 edit > .. //depot/projects/hammer/sys/amd64/amd64/trap.c#6 edit > > Differences ... > > ==== //depot/projects/hammer/sys/amd64/amd64/machdep.c#12 (text+ko) ==== > > @@ -1219,7 +1219,7 @@ > setidt(11, &IDTVEC(missing), SDT_SYSTGT, SEL_KPL, 0); > setidt(12, &IDTVEC(stk), SDT_SYSTGT, SEL_KPL, 0); > setidt(13, &IDTVEC(prot), SDT_SYSTGT, SEL_KPL, 0); > - setidt(14, &IDTVEC(page), SDT_SYSTGT, SEL_KPL, 0); > + setidt(14, &IDTVEC(page), SDT_SYSIGT, SEL_KPL, 0); > setidt(15, &IDTVEC(rsvd), SDT_SYSTGT, SEL_KPL, 0); > setidt(16, &IDTVEC(fpu), SDT_SYSTGT, SEL_KPL, 0); > setidt(17, &IDTVEC(align), SDT_SYSTGT, SEL_KPL, 0); > > ==== //depot/projects/hammer/sys/amd64/amd64/trap.c#6 (text+ko) ==== > > @@ -213,9 +213,17 @@ > * do the VM lookup, so just consider it a fatal trap so the > * kernel can print out a useful trap message and even get > * to the debugger. > + * > + * Note that T_PAGEFLT is registered as an interrupt gate. This > + * is just like a trap gate, except interrupts are disabled. This > + * happens to be critically important, because we could otherwise > + * preempt and run another process that may cause %cr2 to be > + * clobbered for something else. > */ > eva = rcr2(); > - if (PCPU_GET(spinlocks) != NULL) > + if (PCPU_GET(spinlocks) == NULL) > + enable_intr(); > + else > trap_fatal(&frame, eva); > } The spinlocks check only works if witness is on. What you want to do is check td_critnest > 0 instead. -- John Baldwin <jhb@FreeBSD.org> <>< http://www.FreeBSD.org/~jhb/ "Power Users Use the Power to Serve!" - http://www.FreeBSD.org/
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?XFMail.20030508103950.jhb>