PERFORCE change 30777 for review
Peter Wemm
peter at wemm.org
Thu May 8 08:15:24 PDT 2003
John Baldwin wrote:
>
> On 08-May-2003 Peter Wemm wrote:
> > http://perforce.freebsd.org/chv.cgi?CH=30777
> >
> > Change 30777 by peter at 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. T
his
> > + * is just like a trap gate, except interrupts are disabled.
This
> > + * happens to be critically important, because we could other
wise
> > + * 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.
Hmm. I was just going by the i386 code. Is that wrong too, or is this
because I'm using the cheat implementation of the nonlazy critical masking?
Cheers,
-Peter
--
Peter Wemm - peter at wemm.org; peter at FreeBSD.org; peter at yahoo-inc.com
"All of this is for nothing if we don't go to the stars" - JMS/B5
More information about the p4-projects
mailing list