PERFORCE change 30777 for review

John Baldwin jhb at FreeBSD.org
Thu May 8 07:39:53 PDT 2003


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.  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 at FreeBSD.org>  <><  http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve!"  -  http://www.FreeBSD.org/


More information about the p4-projects mailing list