PERFORCE change 30777 for review
Peter Wemm
peter at FreeBSD.org
Thu May 8 01:22:17 PDT 2003
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);
}
More information about the p4-projects
mailing list