Skip site navigation (1)Skip section navigation (2)
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>