ref: 25189924dbde3852b68adb9ce97cd5ff101ee3fb
parent: c6f6396faaf06122e2c242ca0006165fe0c59977
	author: cinap_lenrek <cinap_lenrek@felloff.net>
	date: Sat Feb 15 11:43:55 EST 2014
	
pc64: simplify mmuwalk by factoring out mmu page table creation into separate function
--- a/sys/src/9/pc64/mmu.c
+++ b/sys/src/9/pc64/mmu.c
@@ -205,12 +205,58 @@
return p;
}
+static uintptr*
+mmucreate(uintptr *table, uintptr va, int level, int index)
+{+ uintptr *page, flags;
+ MMU *p;
+
+ flags = PTEWRITE|PTEVALID;
+	if(va < VMAP){+ assert(up != nil);
+ assert((va < TSTKTOP) || (va >= KMAP && va < KMAP+KMAPSIZE));
+
+ p = mmualloc();
+ p->index = level;
+ p->level = index;
+		if(va < TSTKTOP){+ flags |= PTEUSER;
+			if(level == PML4E){+ if((p->next = up->mmuhead) == nil)
+ up->mmutail = p;
+ up->mmuhead = p;
+ m->mmumap[index/MAPBITS] |= 1ull<<(index%MAPBITS);
+			} else {+ up->mmutail->next = p;
+ up->mmutail = p;
+ }
+ up->mmucount++;
+		} else {+			if(level == PML4E){+ up->kmaptail = p;
+ up->kmaphead = p;
+			} else {+ up->kmaptail->next = p;
+ up->kmaptail = p;
+ }
+ up->kmapcount++;
+ }
+ page = p->page;
+	} else if(didmmuinit) {+ page = mallocalign(PTSZ, BY2PG, 0, 0);
+	} else {+ page = rampage();
+ }
+ memset(page, 0, PTSZ);
+ table[index] = PADDR(page) | flags;
+ return page;
+}
+
uintptr*
mmuwalk(uintptr* table, uintptr va, int level, int create)
 {- uintptr pte, *page;
+ uintptr pte;
int i, x;
- MMU *p;
x = PTLX(va, 3);
 	for(i = 2; i >= level; i--){@@ -219,49 +265,10 @@
if(pte & PTESIZE)
return 0;
table = KADDR(PPN(pte));
-		} else {			+		} else {if(!create)
return 0;
- pte = PTEWRITE|PTEVALID;
-			if(va < VMAP){-				if(va < TSTKTOP){- pte |= PTEUSER;
-
- p = mmualloc();
- p->index = x;
- p->level = i;
-					if(i == PML4E){- if((p->next = up->mmuhead) == nil)
- up->mmutail = p;
- up->mmuhead = p;
- m->mmumap[p->index/MAPBITS] |= 1ull<<(p->index%MAPBITS);
-					} else {- up->mmutail->next = p;
- up->mmutail = p;
- }
- up->mmucount++;
-				} else if(va >= KMAP && va < (KMAP+KMAPSIZE)) {- p = mmualloc();
- p->index = x;
- p->level = i;
-					if(i == PML4E){- up->kmaptail = p;
- up->kmaphead = p;
-					} else {- up->kmaptail->next = p;
- up->kmaptail = p;
- }
- up->kmapcount++;
- } else
- return 0;
- page = p->page;
-			} else if(didmmuinit) {- page = mallocalign(PTSZ, BY2PG, 0, 0);
- } else
- page = rampage();
- memset(page, 0, PTSZ);
- table[x] = PADDR(page) | pte;
- table = page;
+ table = mmucreate(table, va, i, x);
}
x = PTLX(va, i);
}
--
⑨