From ef2203c9b03a3a9a3e5bd1dc9e4408f62b718d73 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sun, 13 Sep 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-09-13 --- pc/devether.c | 39 +---------------------------- port/alloc.c | 3 +++ port/devbit.c | 7 ++++-- port/devlance.c | 27 ++++++++++++++------ port/page.c | 2 +- port/stip.c | 11 +++------ port/swap.c | 8 +++--- port/taslock.c | 2 ++ ss/faultsparc.c | 4 +-- ss/l.s | 30 ++++++++++++++++++++++ ss/main.c | 4 +-- ss/mmu.c | 66 ++++++++++++++++++++++++++++++++++++++++++++----- 12 files changed, 132 insertions(+), 71 deletions(-) diff --git a/pc/devether.c b/pc/devether.c index a727b770ebaac8b480c8109efcf8315dbdf863a3..64bfae1ad68baadcebfb896b4cd4b3ab31cf1e1a 100644 --- a/pc/devether.c +++ b/pc/devether.c @@ -20,7 +20,6 @@ struct Hw { void (*receive)(Ctlr*); void (*transmit)(Ctlr*); void (*intr)(Ureg*); - void (*tweek)(Ctlr*); int addr; /* interface address */ uchar *ram; /* interface shared memory address */ int bt16; /* true if a 16 bit interface */ @@ -465,8 +464,7 @@ etherkproc(void *arg) } cp->kproc = 1; for(;;){ - tsleep(&cp->rr, isinput, cp, 1000); - (*cp->hw->tweek)(cp); + sleep(&cp->rr, isinput, cp); /* * process any internal loopback packets @@ -712,40 +710,6 @@ print("ether width %d addr %lux size %d lvl %d\n", hw->bt16?16:8, setvec(Int0vec + hw->lvl, hw->intr); } -static void -wd8013tweek(Ctlr *cp) -{ - uchar laar, msr; - Hw *hw = cp->hw; - Buffer *tb; - int s; - - s = splhi(); - msr = IN(hw, msr); - if(msr & MENB){ - splx(s); - return; - } - print("TWEEK\n"); - delay(500); - - /* reset the hardware */ - OUT(hw, msr, MENB|msr); - laar = IN(hw, laar); - if(hw->bt16) - OUT(hw, laar, laar|L16EN); - (*hw->init)(cp); - (*cp->hw->online)(cp, 1); - - /* retransmit the current packet */ - tb = &cp->tb[cp->ti]; - if(tb->owner == Interface){ - tb->busy = 0; - (*cp->hw->transmit)(cp); - } - splx(s); -} - static void dp8390rinit(Ctlr *cp) { @@ -962,6 +926,5 @@ static Hw wd8013 = wd8013receive, wd8013transmit, wd8013intr, - wd8013tweek, 0x360, /* I/O base address */ }; diff --git a/port/alloc.c b/port/alloc.c index 9b6f96b24ab0406ae11bbfd1eb5e30935b8f6a86..1ee2e42ef5e31813d4db4cec80a8290e080eb439 100644 --- a/port/alloc.c +++ b/port/alloc.c @@ -5,6 +5,7 @@ #include "fns.h" #include "error.h" + /* * Plan 9 has two kernel allocators, the x... routines provide a first * fit hole allocator which should be used for permanent or large structures. @@ -313,6 +314,8 @@ good: bp = xalloc(size); if(bp == nil) return nil; + + arena.nbuck[pow]++; } bp->size = pow; diff --git a/port/devbit.c b/port/devbit.c index 1e19b96d794fd5728a55f9ce934f73238d30a263..98549596c56c8e379aff0d287c65514702ea628f 100644 --- a/port/devbit.c +++ b/port/devbit.c @@ -79,6 +79,7 @@ struct Arena *arena; /* array */ int narena; /* number allocated */ int mouseopen; /* flag: mouse open */ + int bitbltopen; /* flag: bitblt open */ int bid; /* last allocated bitmap id */ int subfid; /* last allocated subfont id */ int cacheid; /* last cached subfont id */ @@ -363,7 +364,7 @@ bitopen(Chan *c, int omode) break; case Qbitblt: lock(&bit); - if(bit.ref){ + if(bit.bitbltopen || bit.mouseopen){ unlock(&bit); error(Einuse); } @@ -381,7 +382,7 @@ bitopen(Chan *c, int omode) bit.rid = -1; bit.mid = -1; bit.init = 0; - bit.ref = 1; + bit.bitbltopen = 1; Cursortocursor(&arrow); unlock(&bit); break; @@ -434,6 +435,8 @@ bitclose(Chan *c) lock(&bit); if(c->qid.path == Qmouse) bit.mouseopen = 0; + if(c->qid.path == Qbitblt) + bit.bitbltopen = 0; if(--bit.ref == 0){ ebp = &bit.map[bit.nmap]; for(bp = bit.map; bpflags)&LANCEOWNER) == 0; + return l.wedged || (MPus(m->flags)&LANCEOWNER) == 0; } static void @@ -343,10 +343,20 @@ lanceoput(Queue *q, Block *bp) return; } + if(l.wedged) { + freeb(bp); + return; + } + /* * only one transmitter at a time */ qlock(&l.tlock); + if(l.wedged) { + qunlock(&l.tlock); + freeb(bp); + return; + } if(waserror()){ qunlock(&l.tlock); @@ -360,17 +370,18 @@ lanceoput(Queue *q, Block *bp) */ m = &(LANCEMEM->tmr[l.tc]); p = &l.tp[l.tc]; - if((MPus(m->flags)&LANCEOWNER) != 0) + while((MPus(m->flags)&LANCEOWNER) != 0) { tsleep(&l.tr, isobuf, m, 128); if(l.wedged || isobuf(m) == 0){ qunlock(&l.tlock); freeb(bp); poperror(); - l.wedged = 0; print("lance wedged, dumping block & restarting\n"); lancestart(0); + l.wedged = 0; return; } + } /* * copy message into lance RAM @@ -704,12 +715,12 @@ lanceintr(void) */ if(csr & (BABL|MISS|MERR)){ if(l.misses++ < 4) - print("lance err %ux\n", csr); + print("lance err #%ux\n", csr); else { + print("lance stopped\n"); l.wedged = 1; l.misses = 0; - *l.rap = 0; - *l.rdp = STOP; + lancereset(); wakeup(&l.rr); wakeup(&l.tr); return; @@ -789,7 +800,7 @@ isinput(void *arg) { Msg *m = arg; - return l.self.first || ((MPus(m->flags) & LANCEOWNER)==0); + return l.wedged || l.self.first || ((MPus(m->flags) & LANCEOWNER)==0); } static void @@ -854,9 +865,9 @@ lancekproc(void *arg) * if the lance is wedged, restart it */ if(l.wedged){ - l.wedged = 0; print("lance wedged, restarting\n"); lancestart(0); + l.wedged = 0; } /* diff --git a/port/page.c b/port/page.c index fe00591a512016847e8bf29d3b4c9d3aa3a2f58f..6948d518aa69dfe213fb092b6827d2b22856731a 100644 --- a/port/page.c +++ b/port/page.c @@ -55,7 +55,7 @@ pageinit(void) hw = swapalloc.highwater*BY2PG; hr = swapalloc.headroom*BY2PG; -/* print("%lud free pages, %dK bytes, swap %dK, highwater %dK, headroom %dK\n", + print("%lud free pages, %dK bytes, swap %dK, highwater %dK, headroom %dK\n", palloc.user, pmem, vmem, hw/1024, hr/1024);/**/ } diff --git a/port/stip.c b/port/stip.c index fb8111642dded9f8d96fad53a0eab32d7a01365b..bc9884f4327547e83494befb4f4c89e3d6ab2078 100644 --- a/port/stip.c +++ b/port/stip.c @@ -372,7 +372,7 @@ ip_reassemble(int offset, Block *bp, Etherhdr *ip) int ovlap, len, fragsize, pktposn; int end; - /* Check lance has handed us a contiguous buffer */ + /* Check ethrnet has handed us a contiguous buffer */ if(bp->next) panic("ip: reass ?"); @@ -384,12 +384,9 @@ ip_reassemble(int offset, Block *bp, Etherhdr *ip) * find a reassembly queue for this fragment */ qlock(&fraglock); - for(f = flisthead; f; f = f->next) { - if(f->src == src) - if(f->dst == dst) - if(f->id == id) + for(f = flisthead; f; f = f->next) + if(f->src == src && f->dst == dst && f->id == id) break; - } qunlock(&fraglock); /* @@ -402,7 +399,7 @@ ip_reassemble(int offset, Block *bp, Etherhdr *ip) qlock(f); ipfragfree(f, 1); } - return(bp); + return bp; } BLKFRAG(bp)->foff = offset<<3; diff --git a/port/swap.c b/port/swap.c index f84960d289d00771355991ba1e63c7a75f2e0145..e573bb3e2c78071f36cc3aed5e2c9c87a0a780ff 100644 --- a/port/swap.c +++ b/port/swap.c @@ -59,10 +59,11 @@ putswap(Page *p) lock(&swapalloc); idx = &swapalloc.swmap[((ulong)p)/BY2PG]; - if(--(*idx) == 0) + if(--(*idx) == 0) { swapalloc.free++; - if(idx < swapalloc.last) - swapalloc.last = idx; + if(idx < swapalloc.last) + swapalloc.last = idx; + } unlock(&swapalloc); } @@ -293,7 +294,6 @@ executeio(void) for(i = 0; i < ioptr; i++) { out = iolist[i]; - k = kmap(out); kaddr = (char*)VA(k); diff --git a/port/taslock.c b/port/taslock.c index 7d046fbce4b92856639e7cb2d36b6d81f7866500..31c25b562777ee6781db1b721866f9e95be6b0ea 100644 --- a/port/taslock.c +++ b/port/taslock.c @@ -42,6 +42,8 @@ canlock(Lock *l) void unlock(Lock *l) { + int s; + l->pc = 0; l->key = 0; if(u && u->p) diff --git a/ss/faultsparc.c b/ss/faultsparc.c index d7a17d42e7d9c77ee3f94df5ad571f7b1ab4a965..01c4deef19eba96f4e61d0d969ff2400d097f5b5 100644 --- a/ss/faultsparc.c +++ b/ss/faultsparc.c @@ -33,15 +33,13 @@ faultsparc(Ureg *ur) if(ser&(SE_WRITE|SE_PROT)) read = 0; } -/*if(u && strcmp(u->p->text, "rc") == 0) -print("fault pc=%lux addr=%lux %d\n", ur->pc, addr, read);/**/ + spllo(); if(u == 0){ dumpregs(ur); panic("fault u==0 pc=%lux addr=%lux", ur->pc, addr); } -/* addr &= VAMASK; /**/ badvaddr = addr; addr &= ~(BY2PG-1); user = !(ur->psr&PSRPSUPER); diff --git a/ss/l.s b/ss/l.s index 1bebc2e4805901eea66f28be3b3b0aefcf6d74b6..6f219ac0a2aced76dea0a17292bc4a7e83484883 100644 --- a/ss/l.s +++ b/ss/l.s @@ -82,6 +82,36 @@ TEXT tas(SB), $0 /* it seems we must be splhi */ NOOP RETURN +TEXT softtas(SB), $0 /* all software; avoid LDSTUB */ + + MOVW PSR, R8 + MOVW $SYSPSR, R9 + MOVW R9, PSR + NOOP + MOVB (R7), R10 + CMP R10, R0 + BE gotit +#ifdef asdf + ANDN $31, R7 /* flush cache line */ + MOVW $0, (R7, 0xD) +#endif + MOVW $0xFF, R7 + MOVW R8, PSR + NOOP + RETURN + +gotit: + MOVW $0xFF, R10 + MOVB R10, (R7) +#ifdef asdf + ANDN $31, R7 /* flush cache line */ + MOVW $0, (R7, 0xD) +#endif + MOVW $0, R7 + MOVW R8, PSR + NOOP + RETURN + TEXT spllo(SB), $0 MOVW PSR, R7 diff --git a/ss/main.c b/ss/main.c index f52b7eb0375c0d534500d8874d695604ca5569cb..f18a6d38f8ccfc610ca53ced85640f0f6c0e1c3b 100644 --- a/ss/main.c +++ b/ss/main.c @@ -415,8 +415,8 @@ confinit(void) conf.upages = (conf.npage*70)/100; if(cpuserver){ i = conf.npage-conf.upages; - if(i > (6*MB)/BY2PG) - conf.upages += i - ((6*MB)/BY2PG); + if(i > (12*MB)/BY2PG) + conf.upages += i - ((12*MB)/BY2PG); } romputcxsegm = *(ulong*)(rom+260); diff --git a/ss/mmu.c b/ss/mmu.c index 929eb8b93250c3aef4b8b5f28710e75a6879b0c1..055c37e25346160d170fbc391ab290f12e46e939 100644 --- a/ss/mmu.c +++ b/ss/mmu.c @@ -239,9 +239,8 @@ allocctx(Proc *proc) c = (Ctx*)m->clist; putctx(c); - if(c->proc){ + if(c->proc) freectx(c, 1); - } if(c->pmeg) panic("allocctx c->pmeg %lux\n", c->pmeg); @@ -377,9 +376,9 @@ mmuinit(void) compile(); /* - * map all of kernel region 0. + * map all of text image */ - ktop = PGROUND(conf.npage0); + ktop = PGROUND((ulong)end); i = 0; for(c = 0; c < conf.ncontext; c++){ i = 0; @@ -389,7 +388,7 @@ mmuinit(void) fp = i; /* - * Make sure cache is turned on for kernel region 0 + * Make sure cache is turned on for program and data */ pme = PTEVALID|PTEWRITE|PTEKERNEL|PTEMAINMEM; i = 0; @@ -412,6 +411,33 @@ mmuinit(void) putpmegspace(INVALIDSEGM+va, INVALIDPTE); } + if(conf.base0 < conf.npage0){ + /* + * map kernel region 0, this may overlap kernel text image + */ + ktop1 = PGROUND(conf.npage0); + kbot1 = conf.base0 & ~(BY2SEGM - 1); + if(kbot1 < ktop) + kbot1 = ktop; + for(c = 0; c < conf.ncontext; c++){ + i = fp; + putcontext(c); + for(va = kbot1; va < ktop1; va += BY2SEGM) + putsegspace(va, i++); + } + fp = i; + + /* + * Make sure cache is turned on for kernel region 0 + */ + kbot1 = conf.base0 & ~(BY2PG - 1); + pme = PTEVALID|PTEWRITE|PTEKERNEL|PTEMAINMEM; + i = PPN(kbot1 & ~KZERO); + for(va = kbot1; va < ktop1; va += BY2PG, i++) + putpme(va, pme+i, 1); + ktop = ktop1; + } + if(conf.base1 < conf.npage1){ /* * map kernel region 1, this may overlap kernel region 0's @@ -437,6 +463,7 @@ mmuinit(void) i = PPN(kbot1 & ~KZERO); for(va = kbot1; va < ktop1; va += BY2PG, i++) putpme(va, pme+i, 1); + ktop = ktop1; } /* @@ -626,11 +653,15 @@ kmappa(ulong pa, ulong flag) void kunmap(KMap *k) { + ulong pa; + + pa = k->pa; k->pa = 0; lock(&kmapalloc); k->next = kmapalloc.free; kmapalloc.free = k; - putpme(k->va, INVALIDPTE, 1); + if(pa != k->pa) + putpme(k->va, INVALIDPTE, 1); unlock(&kmapalloc); } @@ -658,6 +689,29 @@ kmapregion(ulong pa, ulong n, ulong flag) KMap* kmap(Page *pg) { + ulong va; + KMap *k; + + /* + * avoid an alias: if part of kernel memory, just return map + */ + va = pg->pa|KZERO; + if((KZERO<=va && va<(ulong)end) || + (conf.base0<=va && vanext; + unlock(&kmapalloc); + k->va = va; + k->pa = va; + return k; + } + /* * Cache is virtual and a pain to deal with. * Must avoid having the same entry in the cache twice, so