Browse Source

Plan 9 from Bell Labs 2005-11-09

David du Colombier 18 years ago
parent
commit
a96c5dfed5
5 changed files with 144 additions and 22 deletions
  1. 3 4
      dist/replica/_plan9.db
  2. 2 2
      dist/replica/plan9.db
  3. 2 0
      dist/replica/plan9.log
  4. 12 12
      sys/src/9/pc/memory.c
  5. 125 4
      sys/src/9/pc/mmu.c

+ 3 - 4
dist/replica/_plan9.db

@@ -148,7 +148,7 @@
 386/bin/aux/tr2post - 775 sys sys 1104121987 176578
 386/bin/aux/trampoline - 775 sys sys 1130594716 83677
 386/bin/aux/typepasswd - 775 sys sys 1130594716 69535
-386/bin/aux/vga - 775 sys sys 1131163701 333645
+386/bin/aux/vga - 775 sys sys 1131422827 333645
 386/bin/aux/vmmousepoll - 775 sys sys 1032480572 41434
 386/bin/aux/vmware - 775 sys sys 1049428256 453
 386/bin/aux/vmwarefs - 775 sys sys 1095563640 99117
@@ -7972,9 +7972,9 @@ sys/src/9/pc/kbd.c - 664 sys sys 1130848300 12362
 sys/src/9/pc/l.s - 664 sys sys 1131290403 28347
 sys/src/9/pc/main.c - 664 sys sys 1131290418 15224
 sys/src/9/pc/mem.h - 664 sys sys 1131290422 5209
-sys/src/9/pc/memory.c - 664 sys sys 1131290429 18222
+sys/src/9/pc/memory.c - 664 sys sys 1131461842 18127
 sys/src/9/pc/mkfile - 664 sys sys 1131294850 3580
-sys/src/9/pc/mmu.c - 664 sys sys 1131326224 19739
+sys/src/9/pc/mmu.c - 664 sys sys 1131497813 22628
 sys/src/9/pc/mouse.c - 664 sys sys 1098479254 7057
 sys/src/9/pc/mp.c - 664 sys sys 1131326235 17157
 sys/src/9/pc/mp.h - 664 sys sys 1131290475 6638
@@ -14973,4 +14973,3 @@ usr/glenda/lib/profile - 664 glenda glenda 1105128663 890
 usr/glenda/readme.acme - 664 glenda glenda 1019860628 4753
 usr/glenda/readme.rio - 664 glenda glenda 1019860628 6370
 usr/glenda/tmp - 20000000775 glenda glenda 1018802620 0
-386/bin/aux/vga - 775 sys sys 1131422827 333645

+ 2 - 2
dist/replica/plan9.db

@@ -7972,9 +7972,9 @@ sys/src/9/pc/kbd.c - 664 sys sys 1130848300 12362
 sys/src/9/pc/l.s - 664 sys sys 1131290403 28347
 sys/src/9/pc/main.c - 664 sys sys 1131290418 15224
 sys/src/9/pc/mem.h - 664 sys sys 1131290422 5209
-sys/src/9/pc/memory.c - 664 sys sys 1131290429 18222
+sys/src/9/pc/memory.c - 664 sys sys 1131461842 18127
 sys/src/9/pc/mkfile - 664 sys sys 1131294850 3580
-sys/src/9/pc/mmu.c - 664 sys sys 1131326224 19739
+sys/src/9/pc/mmu.c - 664 sys sys 1131497813 22628
 sys/src/9/pc/mouse.c - 664 sys sys 1098479254 7057
 sys/src/9/pc/mp.c - 664 sys sys 1131326235 17157
 sys/src/9/pc/mp.h - 664 sys sys 1131290475 6638

+ 2 - 0
dist/replica/plan9.log

@@ -22850,3 +22850,5 @@
 1131402435 0 c sys/src/9/pc/vgavesa.c - 664 sys sys 1131402428 2396
 1131422433 0 c sys/src/9/pc/vganeomagic.c - 664 sys sys 1131422294 10255
 1131424234 0 c 386/bin/aux/vga - 775 sys sys 1131422827 333645
+1131462044 0 c sys/src/9/pc/memory.c - 664 sys sys 1131461842 18127
+1131498052 0 c sys/src/9/pc/mmu.c - 664 sys sys 1131497813 22628

+ 12 - 12
sys/src/9/pc/memory.c

@@ -586,21 +586,19 @@ map(ulong base, ulong len, int type)
 	switch(type){
 	case MemRAM:
 		mapfree(&rmapram, base, len);
-		flags = PTEWRITE;
+		flags = PTEWRITE|PTEVALID;
 		break;
 	case MemUMB:
 		mapfree(&rmapumb, base, len);
-		flags = PTEWRITE|PTEUNCACHED;
+		flags = PTEWRITE|PTEUNCACHED|PTEVALID;
 		break;
 	case MemUPA:
 		mapfree(&rmapupa, base, len);
-		/* don't need to map this but will anyway */
-		flags = PTEWRITE|PTEUNCACHED;
+		flags = 0;
 		break;
 	default:
 	case MemReserved:
-		/* don't put in any pools but still map it. */
-		flags = PTEWRITE|PTEUNCACHED;
+		flags = 0;
 		break;
 	}
 	
@@ -620,12 +618,14 @@ map(ulong base, ulong len, int type)
 	/*
 	 * Only map from KZERO to 2^32.
 	 */
-	maxkpa = -KZERO;
-	if(base >= maxkpa)
-		return;
-	if(len > maxkpa-base)
-		len = maxkpa - base;
-	pdbmap(m->pdb, base|flags, base+KZERO, len);
+	if(flags){
+		maxkpa = -KZERO;
+		if(base >= maxkpa)
+			return;
+		if(len > maxkpa-base)
+			len = maxkpa - base;
+		pdbmap(m->pdb, base|flags, base+KZERO, len);
+	}
 }
 
 static int

+ 125 - 4
sys/src/9/pc/mmu.c

@@ -317,14 +317,40 @@ mmuswitch(Proc* proc)
  *   if there's a pdb put it in the cache of pre-initialised pdb's
  *   for this processor (m->pdbpool) or on the process' free list;
  *   finally, place any pages freed back into the free pool (palloc).
- * This routine is only called from sched() with palloc locked.
+ * This routine is only called from schedinit() with palloc locked.
  */
 void
 mmurelease(Proc* proc)
 {
+	int s;
 	Page *page, *next;
+	ulong *pdb;
 
 	taskswitch(PADDR(m->pdb), (ulong)m + BY2PG);
+	if(proc->kmaptable){
+		if(proc->mmupdb == nil)
+			panic("mmurelease: no mmupdb");
+		if(--proc->kmaptable->ref)
+			panic("mmurelease: kmap ref %d\n", proc->kmaptable->ref);
+		if(up->nkmap)
+			panic("mmurelease: nkmap %d\n", up->nkmap);
+		/*
+		 * remove kmaptable from pdb before putting pdb up for reuse.
+		 */
+		s = splhi();
+		pdb = tmpmap(proc->mmupdb);
+		if(PPN(pdb[PDX(KMAP)]) != proc->kmaptable->pa)
+			panic("mmurelease: bad kmap pde %#.8lux kmap %#.8lux",
+				pdb[PDX(KMAP)], proc->kmaptable->pa);
+		pdb[PDX(KMAP)] = 0;
+		tmpunmap(pdb);
+		splx(s);
+		/*
+		 * move kmaptable to free list.
+		 */
+		pagechainhead(proc->kmaptable);
+		proc->kmaptable = 0;
+	}
 	if(proc->mmupdb){
 		mmuptefree(proc);
 		mmupdbfree(proc, proc->mmupdb);
@@ -738,20 +764,22 @@ KMap*
 kmap(Page *page)
 {
 	int i, o, s;
-	Page *pdb;
 
 	if(up == nil)
 		panic("kmap: up=0 pc=%#.8lux", getcallerpc(&page));
 	if(up->mmupdb == nil)
 		upallocpdb();
+	up->nkmap++;
 	if(!(vpd[PDX(KMAP)]&PTEVALID)){
 		/* allocate page directory */
 		if(KMAPSIZE > BY2XPG)
 			panic("bad kmapsize");
+		if(up->kmaptable != nil)
+			panic("kmaptable");
 		s = spllo();
-		pdb = newpage(0, 0, 0);
+		up->kmaptable = newpage(0, 0, 0);
 		splx(s);
-		vpd[PDX(KMAP)] = pdb->pa|PTEWRITE|PTEVALID;
+		vpd[PDX(KMAP)] = up->kmaptable->pa|PTEWRITE|PTEVALID;
 		memset(kpt, 0, BY2PG);
 
 		/* might as well finish the job */
@@ -759,6 +787,8 @@ kmap(Page *page)
 		up->lastkmap = 0;
 		return (KMap*)KMAP;
 	}
+	if(up->kmaptable == nil)
+		panic("no kmaptable");
 	o = up->lastkmap+1;
 	for(i=0; i<NKPT; i++){
 		if(kpt[(i+o)%NKPT] == 0){
@@ -784,6 +814,7 @@ kunmap(KMap *k)
 		panic("kunmap: bad address %#.8lux pc=%#.8lux", va, getcallerpc(&k));
 	if(!(vpt[VPTX(va)]&PTEVALID))
 		panic("kunmap: not mapped %#.8lux pc=%#.8lux", va, getcallerpc(&k));
+	up->nkmap--;
 	vpt[VPTX(va)] = 0;
 	flushpg(va);
 }
@@ -868,3 +899,93 @@ paddr(void *v)
 		panic("paddr: va=%#.8lux", va);
 	return va-KZERO;
 }
+
+/*
+ * More debugging.
+ */
+void
+countpagerefs(ulong *ref, int print)
+{
+	int i, n;
+	Mach *mm;
+	Page *pg;
+	Proc *p;
+	
+	n = 0;
+	for(i=0; i<conf.nproc; i++){
+		p = proctab(i);
+		if(p->mmupdb){
+			if(print){
+				if(ref[pagenumber(p->mmupdb)])
+					iprint("page %#.8lux is proc %d (pid %lud) pdb\n",
+						p->mmupdb->pa, i, p->pid);
+				continue;
+			}
+			if(ref[pagenumber(p->mmupdb)]++ == 0)
+				n++;
+			else
+				iprint("page %#.8lux is proc %d (pid %lud) pdb but has other refs!\n",
+					p->mmupdb->pa, i, p->pid);
+		}
+		if(p->kmaptable){
+			if(print){
+				if(ref[pagenumber(p->kmaptable)])
+					iprint("page %#.8lux is proc %d (pid %lud) kmaptable\n",
+						p->kmaptable->pa, i, p->pid);
+				continue;
+			}
+			if(ref[pagenumber(p->kmaptable)]++ == 0)
+				n++;
+			else
+				iprint("page %#.8lux is proc %d (pid %lud) kmaptable but has other refs!\n",
+					p->kmaptable->pa, i, p->pid);
+		}
+		for(pg=p->mmuused; pg; pg=pg->next){
+			if(print){
+				if(ref[pagenumber(pg)])
+					iprint("page %#.8lux is on proc %d (pid %lud) mmuused\n",
+						pg->pa, i, p->pid);
+				continue;
+			}
+			if(ref[pagenumber(pg)]++ == 0)
+				n++;
+			else
+				iprint("page %#.8lux is on proc %d (pid %lud) mmuused but has other refs!\n",
+					pg->pa, i, p->pid);
+		}
+		for(pg=p->mmufree; pg; pg=pg->next){
+			if(print){
+				if(ref[pagenumber(pg)])
+					iprint("page %#.8lux is on proc %d (pid %lud) mmufree\n",
+						pg->pa, i, p->pid);
+				continue;
+			}
+			if(ref[pagenumber(pg)]++ == 0)
+				n++;
+			else
+				iprint("page %#.8lux is on proc %d (pid %lud) mmufree but has other refs!\n",
+					pg->pa, i, p->pid);
+		}
+	}
+	if(!print)
+		iprint("%d pages in proc mmu\n", n);
+	n = 0;
+	for(i=0; i<conf.nmach; i++){
+		mm = MACHP(i);
+		for(pg=mm->pdbpool; pg; pg=pg->next){
+			if(print){
+				if(ref[pagenumber(pg)])
+					iprint("page %#.8lux is in cpu%d pdbpool\n",
+						pg->pa, i);
+				continue;
+			}
+			if(ref[pagenumber(pg)]++ == 0)
+				n++;
+			else
+				iprint("page %#.8lux is in cpu%d pdbpool but has other refs!\n",
+					pg->pa, i);
+		}
+	}
+	if(!print)
+		iprint("%d pages in mach pdbpools\n", n);
+}