Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 8 May 2003 01:22:14 -0700 (PDT)
From:      Peter Wemm <peter@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 30777 for review
Message-ID:  <200305080822.h488MEIg021724@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
 	}
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200305080822.h488MEIg021724>