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