From 2412f2817dde1e398af6640f472882438f8c502b Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 27 Aug 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-08-27 --- gnot/mmu.c | 7 +++++++ pc/fns.h | 2 +- pc/main.c | 16 ++++++++-------- pc/mmu.c | 2 +- pc/trap.c | 2 +- 5 files changed, 18 insertions(+), 11 deletions(-) diff --git a/gnot/mmu.c b/gnot/mmu.c index 7687323efbc3447318ce1ea17eb0e038aa2e3768..75067dfb42683c73f19fdb4c100cf420cca664bc 100644 --- a/gnot/mmu.c +++ b/gnot/mmu.c @@ -143,7 +143,9 @@ KMap* kmap(Page *pg) { KMap *k; + int s; + s = splhi(); lock(&kmapalloc); k = kmapalloc.free; if(k == 0){ @@ -152,6 +154,7 @@ kmap(Page *pg) } kmapalloc.free = k->next; unlock(&kmapalloc); + splx(s); k->pa = pg->pa; putkmmu(k->va, PPN(k->pa) | PTEVALID | PTEKERNEL); @@ -161,13 +164,17 @@ kmap(Page *pg) void kunmap(KMap *k) { + int s; + k->pa = 0; putkmmu(k->va, INVALIDPTE); + s = splhi(); lock(&kmapalloc); k->next = kmapalloc.free; kmapalloc.free = k; unlock(&kmapalloc); + splx(s); } void diff --git a/pc/fns.h b/pc/fns.h index 5241c1e7490ba6b771bbf49045a985375492620b..40c8b0bd1eb95c19d8870359c26bd5ded3db8ab2 100644 --- a/pc/fns.h +++ b/pc/fns.h @@ -1,6 +1,6 @@ #include "../port/portfns.h" -void a20enable(void); +void meminit(void); #define clearmmucache() /* 386 doesn't have one */ void clock(Ureg*); void clockinit(void); diff --git a/pc/main.c b/pc/main.c index 5b0f87c3212ea7a9d1aaf87e5b50959936130759..b994647c7eaa7e40e0026ae359dbe967a309e71f 100644 --- a/pc/main.c +++ b/pc/main.c @@ -13,12 +13,12 @@ extern long edata; void main(void) { - a20enable(); + meminit(); machinit(); confinit(); screeninit(); printinit(); - print("%lud K bytes of physical memory\n", 1024 + conf.npage1*BY2PG/1024); + print("%ludK bytes of physical memory\n", (conf.base1 + conf.npage1*BY2PG)/1024); mmuinit(); trapinit(); kbdinit(); @@ -174,14 +174,14 @@ confinit(void) break; x += 0x3141526; } - conf.npage1 = (i-2)*1024/4; - conf.base1 = 1024*1024; + conf.base1 = 0x100000; + conf.npage1 = ((i-1)*1024*1024 - conf.base1)/BY2PG; conf.npage = conf.npage0 + conf.npage1; conf.maxialloc = 2*1024*1024; mul = 1; - conf.nproc = 20 + 20*mul; + conf.nproc = 10 + 10*mul; conf.npgrp = conf.nproc/2; conf.nseg = conf.nproc*3; conf.npagetab = (conf.nseg*14)/10; @@ -198,7 +198,7 @@ confinit(void) conf.nmntbuf = conf.nmntdev+3; conf.nmnthdr = 2*conf.nmntdev; conf.nsrv = 16*mul; /* was 32 */ - conf.nbitmap = 512*mul; + conf.nbitmap = 256*mul; conf.nbitbyte = conf.nbitmap*1024*screenbits(); conf.nfont = 10*mul; conf.nnoifc = 1; @@ -296,9 +296,9 @@ enum * enable address bit 20 */ void -a20enable(void) +meminit(void) { - outb(Head, A20ena); + outb(Head, A20ena); /* enable memory address bit 20 */ } /* diff --git a/pc/mmu.c b/pc/mmu.c index 208fc5212d0e90accb6120a3a7bb7c6a47200d04..a770f37cb8ad8acef09ea6f5754e1d295feb9ad3 100644 --- a/pc/mmu.c +++ b/pc/mmu.c @@ -124,7 +124,7 @@ mmuinit(void) */ /* allocate and fill low level page tables for kernel mem */ - npage = (1024*1024)/BY2PG + conf.npage1; + npage = conf.base1/BY2PG + conf.npage1; nbytes = PGROUND(npage*BY2WD); /* words of page map */ nkpt = nbytes/BY2PG; /* pages of page map */ kpt = ialloc(nbytes, 1); diff --git a/pc/trap.c b/pc/trap.c index 6e0edc742f8f911dca7e5df684fee1f52ae2ab12..67a5ba150d50b871b14a6a5301154e76f8466792 100644 --- a/pc/trap.c +++ b/pc/trap.c @@ -174,7 +174,7 @@ trap(Ureg *ur) v = ur->trap; if(v>=256 || ivec[v] == 0){ - print("bad trap type %d %lux %lux %lux\n", v, ur->pc, int0mask, int1mask); + panic("bad trap type %d %lux %lux %lux\n", v, ur->pc, int0mask, int1mask); return; }