svn commit: r297958 - in head/sys/arm64: arm64 include

Andrew Turner andrew at FreeBSD.org
Thu Apr 14 10:43:29 UTC 2016


Author: andrew
Date: Thu Apr 14 10:43:28 2016
New Revision: 297958
URL: https://svnweb.freebsd.org/changeset/base/297958

Log:
  Set the upper limit of the DMAP region to the limit of RAM as was found in
  the physmap. This will reduce the likelihood of an issue where we have
  device memory mapped in the DMAP. This can only happen if it is within the
  same 1G block of normal memory.
  
  Reviewed by:	kib
  Obtained from:	ABT Systems Ltd
  Sponsored by:	The FreeBSD Foundation
  Differential Revision:	https://reviews.freebsd.org/D5938

Modified:
  head/sys/arm64/arm64/pmap.c
  head/sys/arm64/include/vmparam.h

Modified: head/sys/arm64/arm64/pmap.c
==============================================================================
--- head/sys/arm64/arm64/pmap.c	Thu Apr 14 09:10:09 2016	(r297957)
+++ head/sys/arm64/arm64/pmap.c	Thu Apr 14 10:43:28 2016	(r297958)
@@ -221,6 +221,8 @@ struct msgbuf *msgbufp = NULL;
 static struct rwlock_padalign pvh_global_lock;
 
 vm_paddr_t dmap_phys_base;	/* The start of the dmap region */
+vm_paddr_t dmap_phys_max;	/* The limit of the dmap region */
+vm_offset_t dmap_max_addr;	/* The virtual address limit of the dmap */
 
 /* This code assumes all L1 DMAP entries will be used */
 CTASSERT((DMAP_MIN_ADDRESS  & ~L0_OFFSET) == DMAP_MIN_ADDRESS);
@@ -550,15 +552,15 @@ pmap_early_vtophys(vm_offset_t l1pt, vm_
 }
 
 static void
-pmap_bootstrap_dmap(vm_offset_t kern_l1, vm_paddr_t kernstart)
+pmap_bootstrap_dmap(vm_offset_t kern_l1, vm_paddr_t min_pa, vm_paddr_t max_pa)
 {
 	vm_offset_t va;
 	vm_paddr_t pa;
 	u_int l1_slot;
 
-	pa = dmap_phys_base = kernstart & ~L1_OFFSET;
+	pa = dmap_phys_base = min_pa & ~L1_OFFSET;
 	va = DMAP_MIN_ADDRESS;
-	for (; va < DMAP_MAX_ADDRESS;
+	for (; va < DMAP_MAX_ADDRESS && pa < max_pa;
 	    pa += L1_SIZE, va += L1_SIZE, l1_slot++) {
 		l1_slot = ((va - DMAP_MIN_ADDRESS) >> L1_SHIFT);
 
@@ -567,6 +569,10 @@ pmap_bootstrap_dmap(vm_offset_t kern_l1,
 		    ATTR_IDX(CACHED_MEMORY) | L1_BLOCK);
 	}
 
+	/* Set the upper limit of the DMAP region */
+	dmap_phys_max = pa;
+	dmap_max_addr = va;
+
 	cpu_dcache_wb_range((vm_offset_t)pagetable_dmap,
 	    PAGE_SIZE * DMAP_TABLES);
 	cpu_tlb_flushID();
@@ -651,7 +657,7 @@ pmap_bootstrap(vm_offset_t l0pt, vm_offs
 	pt_entry_t *l2;
 	vm_offset_t va, freemempos;
 	vm_offset_t dpcpu, msgbufpv;
-	vm_paddr_t pa, min_pa;
+	vm_paddr_t pa, max_pa, min_pa;
 	int i;
 
 	kern_delta = KERNBASE - kernstart;
@@ -671,7 +677,7 @@ pmap_bootstrap(vm_offset_t l0pt, vm_offs
 	rw_init(&pvh_global_lock, "pmap pv global");
 
 	/* Assume the address we were loaded to is a valid physical address */
-	min_pa = KERNBASE - kern_delta;
+	min_pa = max_pa = KERNBASE - kern_delta;
 
 	/*
 	 * Find the minimum physical address. physmap is sorted,
@@ -682,11 +688,12 @@ pmap_bootstrap(vm_offset_t l0pt, vm_offs
 			continue;
 		if (physmap[i] <= min_pa)
 			min_pa = physmap[i];
-		break;
+		if (physmap[i + 1] > max_pa)
+			max_pa = physmap[i + 1];
 	}
 
 	/* Create a direct map region early so we can use it for pa -> va */
-	pmap_bootstrap_dmap(l1pt, min_pa);
+	pmap_bootstrap_dmap(l1pt, min_pa, max_pa);
 
 	va = KERNBASE;
 	pa = KERNBASE - kern_delta;

Modified: head/sys/arm64/include/vmparam.h
==============================================================================
--- head/sys/arm64/include/vmparam.h	Thu Apr 14 09:10:09 2016	(r297957)
+++ head/sys/arm64/include/vmparam.h	Thu Apr 14 10:43:28 2016	(r297958)
@@ -162,19 +162,19 @@
 #define	VM_MIN_KERNEL_ADDRESS	(0xffff000000000000UL)
 #define	VM_MAX_KERNEL_ADDRESS	(0xffff008000000000UL)
 
-/* 2TiB for the direct map region */
+/* 2 TiB maximum for the direct map region */
 #define	DMAP_MIN_ADDRESS	(0xfffffd0000000000UL)
 #define	DMAP_MAX_ADDRESS	(0xffffff0000000000UL)
 
 #define	DMAP_MIN_PHYSADDR	(dmap_phys_base)
-#define	DMAP_MAX_PHYSADDR	(dmap_phys_base + (DMAP_MAX_ADDRESS - DMAP_MIN_ADDRESS))
+#define	DMAP_MAX_PHYSADDR	(dmap_phys_max)
 
 /* True if pa is in the dmap range */
 #define	PHYS_IN_DMAP(pa)	((pa) >= DMAP_MIN_PHYSADDR && \
     (pa) < DMAP_MAX_PHYSADDR)
 /* True if va is in the dmap range */
 #define	VIRT_IN_DMAP(va)	((va) >= DMAP_MIN_ADDRESS && \
-    (va) < DMAP_MAX_ADDRESS)
+    (va) < (dmap_max_addr))
 
 #define	PHYS_TO_DMAP(pa)						\
 ({									\
@@ -237,6 +237,8 @@
 #ifndef LOCORE
 
 extern vm_paddr_t dmap_phys_base;
+extern vm_paddr_t dmap_phys_max;
+extern vm_offset_t dmap_max_addr;
 extern u_int tsb_kernel_ldd_phys;
 extern vm_offset_t vm_max_kernel_address;
 extern vm_offset_t init_pt_va;


More information about the svn-src-all mailing list