svn commit: r266956 - projects/arm64/sys/arm64/arm64

Andrew Turner andrew at FreeBSD.org
Sun Jun 1 21:30:46 UTC 2014


Author: andrew
Date: Sun Jun  1 21:30:45 2014
New Revision: 266956
URL: http://svnweb.freebsd.org/changeset/base/266956

Log:
  Add more of pmap. pmap_enter is only partially implemented however it is
  enough to get further through the boot process.

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

Modified: projects/arm64/sys/arm64/arm64/pmap.c
==============================================================================
--- projects/arm64/sys/arm64/arm64/pmap.c	Sun Jun  1 20:19:17 2014	(r266955)
+++ projects/arm64/sys/arm64/arm64/pmap.c	Sun Jun  1 21:30:45 2014	(r266956)
@@ -208,6 +208,7 @@ pmap_bootstrap(vm_offset_t l1pt, vm_padd
 	vm_paddr_t pa;
 
 	kern_delta = KERNBASE - kernstart;
+	physmem = 0;
 
 	printf("pmap_bootstrap %llx %llx %llx\n", l1pt, kernstart, kernlen);
 	printf("%llx\n", l1pt);
@@ -238,6 +239,8 @@ pmap_bootstrap(vm_offset_t l1pt, vm_padd
 
 		phys_avail[avail_slot] = physmap[map_slot];
 		phys_avail[avail_slot + 1] = physmap[map_slot + 1];
+		physmem += (phys_avail[avail_slot + 1] -
+		    phys_avail[avail_slot]) >> PAGE_SHIFT;
 		avail_slot += 2;
 	}
 
@@ -245,6 +248,8 @@ pmap_bootstrap(vm_offset_t l1pt, vm_padd
 	if (physmap[avail_slot] < pa) {
 		phys_avail[avail_slot] = physmap[map_slot];
 		phys_avail[avail_slot + 1] = pa;
+		physmem += (phys_avail[avail_slot + 1] -
+		    phys_avail[avail_slot]) >> PAGE_SHIFT;
 		avail_slot += 2;
 	}
 	used_map_slot = map_slot;
@@ -352,6 +357,8 @@ pmap_bootstrap(vm_offset_t l1pt, vm_padd
 			phys_avail[avail_slot] = physmap[map_slot];
 			phys_avail[avail_slot + 1] = physmap[map_slot + 1];
 		}
+		physmem += (phys_avail[avail_slot + 1] -
+		    phys_avail[avail_slot]) >> PAGE_SHIFT;
 
 		avail_slot += 2;
 	}
@@ -393,8 +400,35 @@ pmap_init(void)
 vm_paddr_t
 pmap_kextract(vm_offset_t va)
 {
+	pd_entry_t *l1, *l2;
+	pt_entry_t *l3;
+	pmap_t pmap;
+
+	pmap = pmap_kernel();
+
+	l1 = pmap_l1(pmap, va);
+	if ((*l1 & ATTR_DESCR_MASK) == L1_BLOCK)
+		return ((*l1 & ~ATTR_MASK) | (va & L1_OFFSET));
+
+	if ((*l1 & ATTR_DESCR_MASK) == L1_TABLE) {
+		l2 = pmap_l1_to_l2(l1, va);
+		if (l2 == NULL)
+			return (0);
+
+		if ((*l2 & ATTR_DESCR_MASK) == L2_BLOCK)
+			return ((*l2 & ~ATTR_MASK) | (va & L2_OFFSET));
+
+		if ((*l2 & ATTR_DESCR_MASK) == L2_TABLE) {
+			l3 = pmap_l2_to_l3(l2, va);
+			if (l3 == NULL)
+				return (0);
 
-	panic("pmap_kextract");
+			if ((*l3 & ATTR_DESCR_MASK) == L3_PAGE)
+				return ((*l3 & ~ATTR_MASK) | (va & L3_OFFSET));
+		}
+	}
+
+	return (0);
 }
 
 /*
@@ -457,8 +491,11 @@ pmap_kenter(vm_offset_t va, vm_paddr_t p
 PMAP_INLINE void
 pmap_kremove(vm_offset_t va)
 {
+	pt_entry_t *l3;
 
-	panic("pmap_kremove");
+	l3 = pmap_l3(kernel_pmap, va);
+	KASSERT(l3 != NULL, ("Invalid page table"));
+	*l3 = 0;
 }
 
 /*
@@ -510,8 +547,16 @@ pmap_qenter(vm_offset_t sva, vm_page_t *
 void
 pmap_qremove(vm_offset_t sva, int count)
 {
+	vm_offset_t va;
+	int i;
+
+	va = sva;
+	for (i = 0; i < count; i++) {
+		if (vtophys(va))
+			pmap_kremove(va);
 
-	panic("pmap_qremove");
+		va += PAGE_SIZE;
+	}
 }
 
 /***************************************************
@@ -525,7 +570,10 @@ void
 pmap_pinit0(pmap_t pmap)
 {
 
-	panic("pmap_pinit0");
+	printf("TODO: pmap_pinit0\n");
+	bcopy(kernel_pmap, pmap, sizeof(*pmap));
+	bzero(&pmap->pm_mtx, sizeof(pmap->pm_mtx));
+	PMAP_LOCK_INIT(pmap);
 }
 
 /*
@@ -682,8 +730,24 @@ 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;
+
+	printf("TODO: pmap_enter\n");
+
+	PMAP_LOCK(pmap);
+	pa = VM_PAGE_TO_PHYS(m);
+	printf("pmap_enter: %llx -> %llx (%x %x %u)\n", va, pa, access,
+	    prot, wired);
+	l3 = pmap_l3(pmap, va);
+	KASSERT(l3 != NULL, ("TODO: grow va"));
+	KASSERT(pmap == pmap_kernel(), ("Only kernel mappings for now"));
+
+	opte = *l3;
+	KASSERT(opte == 0, ("TODO: Update the entry"));
+	*l3 = (pa & ~L3_OFFSET) | ATTR_AF | L3_PAGE;
 
-	panic("pmap_enter");
+	PMAP_UNLOCK(pmap);
 }
 
 /*


More information about the svn-src-projects mailing list