svn commit: r337838 - head/sys/amd64/amd64

Konstantin Belousov kib at FreeBSD.org
Wed Aug 15 12:48:50 UTC 2018


Author: kib
Date: Wed Aug 15 12:48:49 2018
New Revision: 337838
URL: https://svnweb.freebsd.org/changeset/base/337838

Log:
  Fix early EFIRT on PCID machines after r337773.
  
  Ensure that the valid PCID state is created for proc0 pmap, since it
  might be used by efirt enter() before first context switch on the BSP.
  
  Sponsored by:	The FreeBSD Foundation
  MFC after:	6 days

Modified:
  head/sys/amd64/amd64/pmap.c

Modified: head/sys/amd64/amd64/pmap.c
==============================================================================
--- head/sys/amd64/amd64/pmap.c	Wed Aug 15 12:12:21 2018	(r337837)
+++ head/sys/amd64/amd64/pmap.c	Wed Aug 15 12:48:49 2018	(r337838)
@@ -1188,8 +1188,16 @@ pmap_bootstrap(vm_paddr_t *firstaddr)
 			kernel_pmap->pm_pcids[i].pm_pcid = PMAP_PCID_KERN;
 			kernel_pmap->pm_pcids[i].pm_gen = 1;
 		}
-		PCPU_SET(pcid_next, PMAP_PCID_KERN + 1);
+
+		/*
+		 * PMAP_PCID_KERN + 1 is used for initialization of
+		 * proc0 pmap.  The pmap' pcid state might be used by
+		 * EFIRT entry before first context switch, so it
+		 * needs to be valid.
+		 */
+		PCPU_SET(pcid_next, PMAP_PCID_KERN + 2);
 		PCPU_SET(pcid_gen, 1);
+
 		/*
 		 * pcpu area for APs is zeroed during AP startup.
 		 * pc_pcid_next and pc_pcid_gen are initialized by AP
@@ -2651,8 +2659,8 @@ pmap_pinit0(pmap_t pmap)
 	bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
 	pmap->pm_flags = pmap_flags;
 	CPU_FOREACH(i) {
-		pmap->pm_pcids[i].pm_pcid = PMAP_PCID_NONE;
-		pmap->pm_pcids[i].pm_gen = 0;
+		pmap->pm_pcids[i].pm_pcid = PMAP_PCID_KERN + 1;
+		pmap->pm_pcids[i].pm_gen = 1;
 		if (!pti) {
 			__pcpu[i].pc_kcr3 = PMAP_NO_CR3;
 			__pcpu[i].pc_ucr3 = PMAP_NO_CR3;


More information about the svn-src-head mailing list