Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 26 Feb 2016 14:04:00 +0000 (UTC)
From:      Ruslan Bukin <br@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r296094 - in head/sys/riscv: include riscv
Message-ID:  <201602261404.u1QE40pZ086404@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: br
Date: Fri Feb 26 14:04:00 2016
New Revision: 296094
URL: https://svnweb.freebsd.org/changeset/base/296094

Log:
  o Use uint64_t for page number as it doesn't fit uint32_t.
  o Implement growkernel bits for L1 level of pagetables.
  
  This allows us to boot with 128GB of physical memory.
  
  Sponsored by:	DARPA, AFRL
  Sponsored by:	HEIF5

Modified:
  head/sys/riscv/include/pte.h
  head/sys/riscv/riscv/pmap.c

Modified: head/sys/riscv/include/pte.h
==============================================================================
--- head/sys/riscv/include/pte.h	Fri Feb 26 13:53:09 2016	(r296093)
+++ head/sys/riscv/include/pte.h	Fri Feb 26 14:04:00 2016	(r296094)
@@ -41,6 +41,7 @@
 #ifndef LOCORE
 typedef	uint64_t	pd_entry_t;		/* page directory entry */
 typedef	uint64_t	pt_entry_t;		/* page table entry */
+typedef	uint64_t	pn_t;			/* page number */
 #endif
 
 /* Level 0 table, 512GiB per entry */

Modified: head/sys/riscv/riscv/pmap.c
==============================================================================
--- head/sys/riscv/riscv/pmap.c	Fri Feb 26 13:53:09 2016	(r296093)
+++ head/sys/riscv/riscv/pmap.c	Fri Feb 26 14:04:00 2016	(r296094)
@@ -450,7 +450,7 @@ pmap_bootstrap_dmap(vm_offset_t l1pt, vm
 	pd_entry_t *l1;
 	u_int l1_slot;
 	pt_entry_t entry;
-	u_int pn;
+	pn_t pn;
 
 	pa = kernstart & ~L1_OFFSET;
 	va = DMAP_MIN_ADDRESS;
@@ -924,7 +924,7 @@ pmap_qenter(vm_offset_t sva, vm_page_t *
 	vm_offset_t va;
 	vm_page_t m;
 	pt_entry_t entry;
-	u_int pn;
+	pn_t pn;
 	int i;
 
 	va = sva;
@@ -1143,7 +1143,7 @@ _pmap_alloc_l3(pmap_t pmap, vm_pindex_t 
 	vm_page_t m, /*pdppg, */pdpg;
 	pt_entry_t entry;
 	vm_paddr_t phys;
-	int pn;
+	pn_t pn;
 
 	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
 
@@ -1323,7 +1323,7 @@ pmap_growkernel(vm_offset_t addr)
 	vm_page_t nkpg;
 	pd_entry_t *l1, *l2;
 	pt_entry_t entry;
-	int pn;
+	pn_t pn;
 
 	mtx_assert(&kernel_map->system_mtx, MA_OWNED);
 
@@ -1343,10 +1343,11 @@ pmap_growkernel(vm_offset_t addr)
 				pmap_zero_page(nkpg);
 			paddr = VM_PAGE_TO_PHYS(nkpg);
 
-			panic("%s: implement grow l1\n", __func__);
-#if 0
-			pmap_load_store(l1, paddr | L1_TABLE);
-#endif
+			pn = (paddr / PAGE_SIZE);
+			entry = (PTE_VALID | (PTE_TYPE_PTR << PTE_TYPE_S));
+			entry |= (pn << PTE_PPN0_S);
+			pmap_load_store(l1, entry);
+
 			PTE_SYNC(l1);
 			continue; /* try again */
 		}
@@ -1933,9 +1934,9 @@ pmap_enter(pmap_t pmap, vm_offset_t va, 
 	vm_page_t mpte, om, l2_m, l3_m;
 	boolean_t nosleep;
 	pt_entry_t entry;
-	int l2_pn;
-	int l3_pn;
-	int pn;
+	pn_t l2_pn;
+	pn_t l3_pn;
+	pn_t pn;
 
 	va = trunc_page(va);
 	if ((m->oflags & VPO_UNMANAGED) == 0 && !vm_page_xbusied(m))
@@ -2211,7 +2212,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_
 	pt_entry_t *l3;
 	vm_paddr_t pa;
 	pt_entry_t entry;
-	int pn;
+	pn_t pn;
 
 	KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva ||
 	    (m->oflags & VPO_UNMANAGED) != 0,
@@ -3084,8 +3085,8 @@ pmap_mincore(pmap_t pmap, vm_offset_t ad
 void
 pmap_activate(struct thread *td)
 {
-	uint64_t entry;
-	uint64_t pn;
+	pt_entry_t entry;
+	pn_t pn;
 	pmap_t pmap;
 
 	critical_enter();



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201602261404.u1QE40pZ086404>