From owner-p4-projects@FreeBSD.ORG Thu May 8 01:22:16 2003 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id F393137B404; Thu, 8 May 2003 01:22:15 -0700 (PDT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 8D6B637B401 for ; Thu, 8 May 2003 01:22:15 -0700 (PDT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 3247C43F93 for ; Thu, 8 May 2003 01:22:15 -0700 (PDT) (envelope-from peter@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.6/8.12.6) with ESMTP id h488MF0U021728 for ; Thu, 8 May 2003 01:22:15 -0700 (PDT) (envelope-from peter@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.6/8.12.6/Submit) id h488MEIg021724 for perforce@freebsd.org; Thu, 8 May 2003 01:22:14 -0700 (PDT) Date: Thu, 8 May 2003 01:22:14 -0700 (PDT) Message-Id: <200305080822.h488MEIg021724@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to peter@freebsd.org using -f From: Peter Wemm To: Perforce Change Reviews Subject: PERFORCE change 30777 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 08 May 2003 08:22:17 -0000 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); }