Module Name:    src
Committed By:   maxv
Date:           Wed Jun 14 14:17:15 UTC 2017

Modified Files:
        src/sys/arch/x86/include: pmap.h
        src/sys/arch/x86/x86: pmap.c

Log Message:
Give the direct map 32 slots (16TB of va). This matches MAXPHYSMEM, in
such a way that the direct map is no longer the limiting factor for high
memory systems.


To generate a diff of this commit:
cvs rdiff -u -r1.65 -r1.66 src/sys/arch/x86/include/pmap.h
cvs rdiff -u -r1.245 -r1.246 src/sys/arch/x86/x86/pmap.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/x86/include/pmap.h
diff -u src/sys/arch/x86/include/pmap.h:1.65 src/sys/arch/x86/include/pmap.h:1.66
--- src/sys/arch/x86/include/pmap.h:1.65	Wed Jun 14 12:49:37 2017
+++ src/sys/arch/x86/include/pmap.h	Wed Jun 14 14:17:15 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.h,v 1.65 2017/06/14 12:49:37 maxv Exp $	*/
+/*	$NetBSD: pmap.h,v 1.66 2017/06/14 14:17:15 maxv Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -488,8 +488,10 @@ void	pmap_free_ptps(struct vm_page *);
 #define L4_SLOT_DIRECT		460
 #define PDIR_SLOT_DIRECT	L4_SLOT_DIRECT
 
+#define NL4_SLOT_DIRECT		32
+
 #define PMAP_DIRECT_BASE	(VA_SIGN_NEG((L4_SLOT_DIRECT * NBPD_L4)))
-#define PMAP_DIRECT_END		(VA_SIGN_NEG(((L4_SLOT_DIRECT + 1) * NBPD_L4)))
+#define PMAP_DIRECT_END		(PMAP_DIRECT_BASE + NL4_SLOT_DIRECT * NBPD_L4)
 
 #define PMAP_DIRECT_MAP(pa)	((vaddr_t)PMAP_DIRECT_BASE + (pa))
 #define PMAP_DIRECT_UNMAP(va)	((paddr_t)(va) - PMAP_DIRECT_BASE)

Index: src/sys/arch/x86/x86/pmap.c
diff -u src/sys/arch/x86/x86/pmap.c:1.245 src/sys/arch/x86/x86/pmap.c:1.246
--- src/sys/arch/x86/x86/pmap.c:1.245	Fri Mar 24 10:58:06 2017
+++ src/sys/arch/x86/x86/pmap.c	Wed Jun 14 14:17:15 2017
@@ -1,6 +1,6 @@
-/*	$NetBSD: pmap.c,v 1.245 2017/03/24 10:58:06 maxv Exp $	*/
+/*	$NetBSD: pmap.c,v 1.246 2017/06/14 14:17:15 maxv Exp $	*/
 
-/*-
+/*
  * Copyright (c) 2008, 2010, 2016, 2017 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
@@ -171,7 +171,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.245 2017/03/24 10:58:06 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.246 2017/06/14 14:17:15 maxv Exp $");
 
 #include "opt_user_ldt.h"
 #include "opt_lockdebug.h"
@@ -1443,11 +1443,13 @@ pmap_init_directmap(struct pmap *kpm)
 	pt_entry_t *pte;
 	pd_entry_t *pde;
 	phys_ram_seg_t *mc;
-	size_t nL3e;
+	size_t nL4e, nL3e;
 	int i;
 
 	const pd_entry_t pteflags = PG_V | PG_KW | pmap_pg_nx;
 
+	CTASSERT(NL4_SLOT_DIRECT * NBPD_L4 == MAXPHYSMEM);
+
 	/* Get the last physical address available */
 	lastpa = 0;
 	for (i = 0; i < mem_cluster_cnt; i++) {
@@ -1456,22 +1458,28 @@ pmap_init_directmap(struct pmap *kpm)
 	}
 
 	/*
-	 * We allocate only one L4 entry for the direct map (PDIR_SLOT_DIRECT),
-	 * so we cannot map more than 512GB.
+	 * x86_add_cluster should have truncated the memory to MAXPHYSMEM.
 	 */
-	if (lastpa > NBPD_L4) {
-		panic("RAM limit reached: > 512GB not supported");
+	if (lastpa > MAXPHYSMEM) {
+		panic("pmap_init_directmap: lastpa incorrect");
 	}
 
 	/* In locore.S, we allocated a tmp va. We will use it now. */
 	tmpva = (KERNBASE + NKL2_KIMG_ENTRIES * NBPD_L2);
 	pte = PTE_BASE + pl1_i(tmpva);
 
+	/* Number of L4 entries. */
+	nL4e = (lastpa + NBPD_L4 - 1) >> L4_SHIFT;
+	KASSERT(nL4e <= NL4_SLOT_DIRECT);
+
 	/* Allocate L3, and zero it out. */
-	L3page_pa = pmap_bootstrap_palloc(1);
-	*pte = L3page_pa | pteflags;
-	pmap_update_pg(tmpva);
-	memset((void *)tmpva, 0, PAGE_SIZE);
+	L3page_pa = pmap_bootstrap_palloc(nL4e);
+	for (i = 0; i < nL4e; i++) {
+		pdp = L3page_pa + i * PAGE_SIZE;
+		*pte = (pdp & PG_FRAME) | pteflags;
+		pmap_update_pg(tmpva);
+		memset((void *)tmpva, 0, PAGE_SIZE);
+	}
 
 	/* Number of L3 entries. */
 	nL3e = (lastpa + NBPD_L3 - 1) >> L3_SHIFT;
@@ -1528,7 +1536,11 @@ pmap_init_directmap(struct pmap *kpm)
 		}
 	}
 
-	kpm->pm_pdir[PDIR_SLOT_DIRECT] = L3page_pa | pteflags | PG_U;
+	/* Fill in the L4 entries, linked to L3. */
+	for (i = 0; i < nL4e; i++) {
+		kpm->pm_pdir[PDIR_SLOT_DIRECT + i] =
+		    (L3page_pa + (i << PAGE_SHIFT)) | pteflags | PG_U;
+	}
 
 	*pte = 0;
 	pmap_update_pg(tmpva);
@@ -2156,7 +2168,8 @@ pmap_pdp_ctor(void *arg, void *v, int fl
 	}
 
 #ifdef __HAVE_DIRECT_MAP
-	pdir[PDIR_SLOT_DIRECT] = PDP_BASE[PDIR_SLOT_DIRECT];
+	memcpy(&pdir[PDIR_SLOT_DIRECT], &PDP_BASE[PDIR_SLOT_DIRECT],
+	    NL4_SLOT_DIRECT * sizeof(pd_entry_t));
 #endif
 #endif /* XEN  && __x86_64__*/
 

Reply via email to