From 169cd74d4cb93d140dc11ffba507182cab56d7aa Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sat, 5 Sep 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-09-05 --- pc/devether.c | 72 +++++++++++++++++++++++++++++++++++++++++--------- port/page.c | 13 +++++---- port/swap.c | 2 +- port/taslock.c | 13 +-------- ss/main.c | 1 - ss/screen.c | 14 +++------- 6 files changed, 73 insertions(+), 42 deletions(-) diff --git a/pc/devether.c b/pc/devether.c index 967b73086e58b6e613f078eb8b209516dc9482ea..25d87d7abe48383843b08af6ec8e14a72ddbfae0 100644 --- a/pc/devether.c +++ b/pc/devether.c @@ -600,6 +600,13 @@ typedef struct { }; } Wd8013; +enum { + MENB = 0x40, /* memory enable */ + + L16EN = 0x40, /* enable 16-bit LAN operation */ + M16EN = 0x80, /* enable 16-bit memory access */ +}; + #define IN(hw, m) inb((hw)->addr+OFFSETOF(Wd8013, m)) #define OUT(hw, m, x) outb((hw)->addr+OFFSETOF(Wd8013, m), (x)) @@ -611,6 +618,27 @@ typedef struct { uchar data[256-4]; } Ring; + +static void +wd8013dumpregs(Hw *hw) +{ + print("msr=#%2.2ux\n", IN(hw, msr)); + print("icr=#%2.2ux\n", IN(hw, icr)); + print("iar=#%2.2ux\n", IN(hw, iar)); + print("bio=#%2.2ux\n", IN(hw, bio)); + print("irr=#%2.2ux\n", IN(hw, irr)); + print("laar=#%2.2ux\n", IN(hw, laar)); + print("ijr=#%2.2ux\n", IN(hw, ijr)); + print("gp2=#%2.2ux\n", IN(hw, gp2)); + print("lan0=#%2.2ux\n", IN(hw, lan[0])); + print("lan1=#%2.2ux\n", IN(hw, lan[1])); + print("lan2=#%2.2ux\n", IN(hw, lan[2])); + print("lan3=#%2.2ux\n", IN(hw, lan[3])); + print("lan4=#%2.2ux\n", IN(hw, lan[4])); + print("lan5=#%2.2ux\n", IN(hw, lan[5])); + print("id=#%2.2ux\n", IN(hw, id)); +} + /* */ static void @@ -619,6 +647,7 @@ wd8013reset(Ctlr *cp) Hw *hw = cp->hw; int i; uchar msr; + ulong ram; cp->rb = xspanalloc(sizeof(Buffer)*Nrb, BY2PG, 0); cp->nrb = Nrb; @@ -626,11 +655,17 @@ wd8013reset(Ctlr *cp) cp->ntb = Ntb; msr = IN(hw, msr); - OUT(hw, msr, 0x40|msr); + OUT(hw, msr, MENB|msr); for(i = 0; i < sizeof(cp->ea); i++) cp->ea[i] = IN(hw, lan[i]); + /* get configuration info from card */ + ram = (IN(hw, msr) & 0x3f) << 13; + ram |= KZERO|0x80000; + hw->ram = (uchar*)ram; +print("ether ram is at %lux\n", ram); + (*hw->init)(cp); setvec(Ethervec, hw->intr); } @@ -703,6 +738,17 @@ wd8013online(Ctlr *cp, int on) OUT(cp->hw, w.tcr, 0); } +static void +bmemmove(void *a, void *b, int n) +{ + uchar *to, *from; + + to = a; + from = b; + while(n-- > 0) + *to++ = *from++; +} + static void wd8013receive(Ctlr *cp) { @@ -723,14 +769,18 @@ wd8013receive(Ctlr *cp) if(next == curr) break; cp->inpackets++; +print("*"); +OUT(hw, laar, 0xC1); +print("!"); p = &((Ring*)hw->ram)[next]; +{ int ii; for(ii = 0; ii < 30; ii++) print("%2.2ux ", p->data[ii]); for(;;); } len = ((p->len1<<8)|p->len0)-4; if(p->next < hw->pstart || p->next >= hw->pstop || len < 60){ print("%d/%d : #%2.2ux #%2.2ux #%2.2ux #%2.2ux\n", next, len, p->status, p->next, p->len0, p->len1); - panic("receive"); +OUT(hw, laar, 0x01); dp8390rinit(cp); - return; + break; } rb = &cp->rb[cp->ri]; @@ -738,22 +788,25 @@ wd8013receive(Ctlr *cp) rb->len = len; if((p->data+len) >= (hw->ram+hw->size)){ len = (hw->ram+hw->size) - p->data; - memmove(rb->pkt+len, + bmemmove(rb->pkt+len, &((Ring*)hw->ram)[hw->pstart], (p->data+rb->len) - (hw->ram+hw->size)); } - memmove(rb->pkt, p->data, len); + bmemmove(rb->pkt, p->data, len); rb->owner = Host; cp->ri = NEXT(cp->ri, cp->nrb); } p->status = 0; next = p->next; +OUT(hw, laar, 0x01); +print("?"); bnry = next-1; if(bnry < hw->pstart) bnry = hw->pstop-1; OUT(hw, w.bnry, bnry); } +print(">"); } static void @@ -767,7 +820,7 @@ wd8013transmit(Ctlr *cp) tb = &cp->tb[cp->ti]; if(tb->busy == 0 && tb->owner == Interface){ hw = cp->hw; - memmove(hw->ram, tb->pkt, tb->len); + bmemmove(hw->ram, tb->pkt, tb->len); OUT(hw, w.tbcr0, tb->len & 0xFF); OUT(hw, w.tbcr1, (tb->len>>8) & 0xFF); OUT(hw, w.cr, 0x26); /* Page0|RD2|TXP|STA */ @@ -823,7 +876,7 @@ wd8013intr(Ureg *ur) static Hw wd8013 = { 0x360, /* I/O base address */ - KZERO|0xC8000, /* shared memory address */ + KZERO|0xF0000, /* shared memory address */ 8*1024, 0, HOWMANY(sizeof(Etherpkt), 256), @@ -836,8 +889,3 @@ static Hw wd8013 = { wd8013transmit, wd8013intr, }; - -void -consdebug(void) -{ -} diff --git a/port/page.c b/port/page.c index 317b1d16e4a72379b855e18fd005628330a674c4..af326cbdebd105ff7e880bece5c61d6b256b4433 100644 --- a/port/page.c +++ b/port/page.c @@ -66,6 +66,7 @@ newpage(int clear, Segment **s, ulong va) KMap *k; int hw, i, dontalloc; +retry: lock(&palloc); hw = swapalloc.highwater; @@ -112,10 +113,10 @@ newpage(int clear, Segment **s, ulong va) unlock(&palloc); lock(p); - - if(p->ref != 0) - panic("newpage"); - + if(p->ref != 0) { /* lookpage has priority on steal */ + unlock(p); + goto retry; + } uncachepage(p); p->ref++; p->va = va; @@ -185,6 +186,8 @@ putpage(Page *p) void simpleputpage(Page *pg) /* Always call with palloc locked */ { + if(pg->ref != 1) + panic("simpleputpage"); pg->ref = 0; palloc.freecount++; if(palloc.head == 0) { @@ -237,7 +240,7 @@ duppage(Page *p) /* Always call with p locked */ unlock(&palloc); lock(np); /* Cache the new version */ - if(np->ref != 0) { /* Stolen by new page */ + if(np->ref != 0) { /* Stolen by lookpage */ uncachepage(p); unlock(np); return; diff --git a/port/swap.c b/port/swap.c index ad001b4165a82a897be9c337c86254813de06f0e..dee2f724507483488f127babeffa8f1c821bedc0 100644 --- a/port/swap.c +++ b/port/swap.c @@ -15,7 +15,7 @@ int canflush(Proc *p, Segment*); enum { - Maxpages = 500, /* Max number of pageouts per segment pass */ + Maxpages = 500, /* Max number of pageouts per segment pass */ }; Image swapimage; diff --git a/port/taslock.c b/port/taslock.c index d61a72302defbf0be59d0aa4c4b4d367d52e3de1..4fcb2ffdcc4a255adad3b4d2e97f01bc538bb79f 100644 --- a/port/taslock.c +++ b/port/taslock.c @@ -5,9 +5,6 @@ #include "fns.h" #include "../port/error.h" -ulong spinner; -ulong spinpc; - void lock(Lock *l) { @@ -16,21 +13,13 @@ lock(Lock *l) ulong pc; pc = getcallerpc(((uchar*)&l) - sizeof(l)); - if (tas(&ll->key) == 0){ - if(u) - u->p->hasspin = 1; - ll->pc = pc; - return; - } - for(i = 0; i < 1000000; i++){ + for(i = 0; i < 10000000; i++){ if (tas(&ll->key) == 0){ if(u) u->p->hasspin = 1; ll->pc = pc; return; } -spinner++; -spinpc = pc; } i = l->key; l->key = 0; diff --git a/ss/main.c b/ss/main.c index e06154af9a2626a3884790d665414276468757a3..82b831607895d0bd2826f45c646766f77c8cc96f 100644 --- a/ss/main.c +++ b/ss/main.c @@ -141,7 +141,6 @@ init0(void) print("bank 0: %dM 1: %dM\n", bank[0], bank[1]); print("frame buffer id %lux slot %ld %s\n", conf.monitor, fbslot, fbstr); print("NKLUDGE %d\n", NKLUDGE); -mapcrap(); if(conf.npage1 != conf.base1) print("kernel mem from second bank: reboot and fix!\n"); diff --git a/ss/screen.c b/ss/screen.c index 4077847c2363f8dd2303d9c7d2af44e65229114a..cfbb91207f685843bc84b3b07cf123d88d3d52d8 100644 --- a/ss/screen.c +++ b/ss/screen.c @@ -35,6 +35,7 @@ struct Video uchar pad2[3]; uchar ovrl; /* overlay palette */ uchar pad3[3]; +#ifdef notright /* Sun-4 video chip */ uchar mcr; /* master control register */ uchar sr; /* status register */ @@ -52,7 +53,8 @@ struct Video uchar vsc; /* vertical sync clear */ uchar xcs; /* transfer cycle hold off set */ uchar xcc; /* transfer cycle hold off clear */ -}*vid; +#endif +} *vid; GBitmap gscreen; @@ -143,16 +145,6 @@ screeninit(char *str, int slot) } } -void -mapcrap(void) -{ - uchar *v; - int i; - - v = &vid->mcr; - for(i=0; i<16; i++,v++) - print("%lux %.2ux\n", v, *v); -} void screenputnl(void)