Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 20 Aug 2014 15:57:52 +0000 (UTC)
From:      Andrew Turner <andrew@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r270220 - projects/arm64/sys/arm64/arm64
Message-ID:  <201408201557.s7KFvqCm074982@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: andrew
Date: Wed Aug 20 15:57:52 2014
New Revision: 270220
URL: http://svnweb.freebsd.org/changeset/base/270220

Log:
  Update pmap_enter to allocate l2 and l3 tables as needed.

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

Modified: projects/arm64/sys/arm64/arm64/pmap.c
==============================================================================
--- projects/arm64/sys/arm64/arm64/pmap.c	Wed Aug 20 15:56:18 2014	(r270219)
+++ projects/arm64/sys/arm64/arm64/pmap.c	Wed Aug 20 15:57:52 2014	(r270220)
@@ -843,17 +843,50 @@ void
 pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m,
     vm_prot_t prot, boolean_t wired)
 {
-	vm_paddr_t pa;
-	pt_entry_t *l3, opte;
+	pt_entry_t *l1, *l2, *l3, opte;
+	vm_paddr_t pa, pte_pa;
+	vm_page_t pte_m;
 
 	PMAP_LOCK(pmap);
-	pa = VM_PAGE_TO_PHYS(m);
 	l3 = pmap_l3(pmap, va);
-	KASSERT(l3 != NULL, ("TODO: grow va"));
-	KASSERT(pmap == pmap_kernel(), ("Only kernel mappings for now"));
+
+	/* TODO: This is not optimal, but should mostly work */
+	if (l3 == NULL) {
+		l2 = pmap_l2(pmap, va);
+
+		if (l2 == NULL) {
+			pte_m = vm_page_alloc(NULL, 0, VM_ALLOC_NORMAL |
+			    VM_ALLOC_NOOBJ | VM_ALLOC_WIRED | VM_ALLOC_ZERO);
+			if (pte_m == NULL)
+				panic("pmap_enter: l2 pte_m == NULL");
+			if ((pte_m->flags & PG_ZERO) == 0)
+				pmap_zero_page(pte_m);
+
+			pte_pa = VM_PAGE_TO_PHYS(pte_m);
+			l1 = pmap_l1(pmap, va);
+			*l1 = pte_pa | ATTR_AF | L1_TABLE;
+			l2 = pmap_l2(pmap, va);
+		}
+		KASSERT(l2 != NULL, ("TODO: grow l2 va"));
+
+		pte_m = vm_page_alloc(NULL, 0, VM_ALLOC_NORMAL |
+		    VM_ALLOC_NOOBJ | VM_ALLOC_WIRED | VM_ALLOC_ZERO);
+		if (pte_m == NULL)
+			panic("pmap_enter: l3 pte_m == NULL");
+		if ((pte_m->flags & PG_ZERO) == 0)
+			pmap_zero_page(pte_m);
+
+		pte_pa = VM_PAGE_TO_PHYS(pte_m);
+		*l2 = pte_pa | ATTR_AF | L2_TABLE;
+		l3 = pmap_l3(pmap, va);
+	}
+
+	KASSERT(l3 != NULL, ("TODO: grow l3 va"));
 
 	opte = *l3;
+	if (opte != 0) printf("%llx\n", opte);
 	KASSERT(opte == 0, ("TODO: Update the entry"));
+	pa = VM_PAGE_TO_PHYS(m);
 	*l3 = (pa & ~L3_OFFSET) | ATTR_AF | L3_PAGE;
 
 	PMAP_UNLOCK(pmap);



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