svn commit: r334052 - head/sys/arm64/arm64

Andrew Turner andrew at FreeBSD.org
Tue May 22 15:52:12 UTC 2018


Author: andrew
Date: Tue May 22 15:52:11 2018
New Revision: 334052
URL: https://svnweb.freebsd.org/changeset/base/334052

Log:
  Revert r334035 for now. It breaks the boot on some boards as er expect to
  be able to read UEFI RuntimeData memory via the DMAP region.

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

Modified: head/sys/arm64/arm64/pmap.c
==============================================================================
--- head/sys/arm64/arm64/pmap.c	Tue May 22 15:49:23 2018	(r334051)
+++ head/sys/arm64/arm64/pmap.c	Tue May 22 15:52:11 2018	(r334052)
@@ -586,100 +586,33 @@ pmap_early_vtophys(vm_offset_t l1pt, vm_offset_t va)
 	return ((l2[l2_slot] & ~ATTR_MASK) + (va & L2_OFFSET));
 }
 
-static vm_offset_t
-pmap_bootstrap_dmap(vm_offset_t kern_l1, vm_paddr_t min_pa,
-    vm_offset_t freemempos)
+static void
+pmap_bootstrap_dmap(vm_offset_t kern_l1, vm_paddr_t min_pa, vm_paddr_t max_pa)
 {
-	pt_entry_t *l2;
 	vm_offset_t va;
-	vm_paddr_t l2_pa, pa;
-	u_int l1_slot, l2_slot, prev_l1_slot;
+	vm_paddr_t pa;
+	u_int l1_slot;
 	int i;
 
 	dmap_phys_base = min_pa & ~L1_OFFSET;
 	dmap_phys_max = 0;
 	dmap_max_addr = 0;
-	l2 = NULL;
-	prev_l1_slot = -1;
 
-#define	DMAP_TABLES	((DMAP_MAX_ADDRESS - DMAP_MIN_ADDRESS) >> L0_SHIFT)
-	memset(pagetable_dmap, 0, PAGE_SIZE * DMAP_TABLES);
-
 	for (i = 0; i < (physmap_idx * 2); i += 2) {
-		pa = physmap[i] & ~L2_OFFSET;
+		pa = physmap[i] & ~L1_OFFSET;
 		va = pa - dmap_phys_base + DMAP_MIN_ADDRESS;
 
-		/* Create L2 mappings at the start of the region */
-		if ((pa & L1_OFFSET) != 0) {
-			l1_slot = ((va - DMAP_MIN_ADDRESS) >> L1_SHIFT);
-			if (l1_slot != prev_l1_slot) {
-				prev_l1_slot = l1_slot;
-				l2 = (pt_entry_t *)freemempos;
-				l2_pa = pmap_early_vtophys(kern_l1,
-				    (vm_offset_t)l2);
-				freemempos += PAGE_SIZE;
-
-				pmap_load_store(&pagetable_dmap[l1_slot],
-				    (l2_pa & ~Ln_TABLE_MASK) | L1_TABLE);
-
-				memset(l2, 0, PAGE_SIZE);
-			}
-			KASSERT(l2 != NULL,
-			    ("pmap_bootstrap_dmap: NULL l2 map"));
-			for (; va < DMAP_MAX_ADDRESS && pa < physmap[i + 1];
-			    pa += L2_SIZE, va += L2_SIZE) {
-				/*
-				 * We are on a boundary, stop to
-				 * create a level 1 block
-				 */
-				if ((pa & L1_OFFSET) == 0)
-					break;
-
-				l2_slot = pmap_l2_index(va);
-				KASSERT(l2_slot != 0, ("..."));
-				pmap_load_store(&l2[l2_slot],
-				    (pa & ~L2_OFFSET) | ATTR_DEFAULT | ATTR_XN |
-				    ATTR_IDX(CACHED_MEMORY) | L2_BLOCK);
-			}
-			KASSERT(va == (pa - dmap_phys_base + DMAP_MIN_ADDRESS),
-			    ("..."));
-		}
-
-		for (; va < DMAP_MAX_ADDRESS && pa < physmap[i + 1] &&
-		    (physmap[i + 1] - pa) >= L1_SIZE;
+		for (; va < DMAP_MAX_ADDRESS && pa < physmap[i + 1];
 		    pa += L1_SIZE, va += L1_SIZE) {
 			l1_slot = ((va - DMAP_MIN_ADDRESS) >> L1_SHIFT);
+			/* We already have an entry */
+			if (pagetable_dmap[l1_slot] != 0)
+				continue;
 			pmap_load_store(&pagetable_dmap[l1_slot],
 			    (pa & ~L1_OFFSET) | ATTR_DEFAULT | ATTR_XN |
 			    ATTR_IDX(CACHED_MEMORY) | L1_BLOCK);
 		}
 
-		/* Create L2 mappings at the end of the region */
-		if (pa < physmap[i + 1]) {
-			l1_slot = ((va - DMAP_MIN_ADDRESS) >> L1_SHIFT);
-			if (l1_slot != prev_l1_slot) {
-				prev_l1_slot = l1_slot;
-				l2 = (pt_entry_t *)freemempos;
-				l2_pa = pmap_early_vtophys(kern_l1,
-				    (vm_offset_t)l2);
-				freemempos += PAGE_SIZE;
-
-				pmap_load_store(&pagetable_dmap[l1_slot],
-				    (l2_pa & ~Ln_TABLE_MASK) | L1_TABLE);
-
-				memset(l2, 0, PAGE_SIZE);
-			}
-			KASSERT(l2 != NULL,
-			    ("pmap_bootstrap_dmap: NULL l2 map"));
-			for (; va < DMAP_MAX_ADDRESS && pa < physmap[i + 1];
-			    pa += L2_SIZE, va += L2_SIZE) {
-				l2_slot = pmap_l2_index(va);
-				pmap_load_store(&l2[l2_slot],
-				    (pa & ~L2_OFFSET) | ATTR_DEFAULT | ATTR_XN |
-				    ATTR_IDX(CACHED_MEMORY) | L2_BLOCK);
-			}
-		}
-
 		if (pa > dmap_phys_max) {
 			dmap_phys_max = pa;
 			dmap_max_addr = va;
@@ -687,8 +620,6 @@ pmap_bootstrap_dmap(vm_offset_t kern_l1, vm_paddr_t mi
 	}
 
 	cpu_tlb_flushID();
-
-	return (freemempos);
 }
 
 static vm_offset_t
@@ -791,11 +722,8 @@ pmap_bootstrap(vm_offset_t l0pt, vm_offset_t l1pt, vm_
 			max_pa = physmap[i + 1];
 	}
 
-	freemempos = KERNBASE + kernlen;
-	freemempos = roundup2(freemempos, PAGE_SIZE);
-
 	/* Create a direct map region early so we can use it for pa -> va */
-	freemempos = pmap_bootstrap_dmap(l1pt, min_pa, freemempos);
+	pmap_bootstrap_dmap(l1pt, min_pa, max_pa);
 
 	va = KERNBASE;
 	start_pa = pa = KERNBASE - kern_delta;
@@ -827,6 +755,8 @@ pmap_bootstrap(vm_offset_t l0pt, vm_offset_t l1pt, vm_
 
 	va = roundup2(va, L1_SIZE);
 
+	freemempos = KERNBASE + kernlen;
+	freemempos = roundup2(freemempos, PAGE_SIZE);
 	/* Create the l2 tables up to VM_MAX_KERNEL_ADDRESS */
 	freemempos = pmap_bootstrap_l2(l1pt, va, freemempos);
 	/* And the l3 tables for the early devmap */


More information about the svn-src-all mailing list