From d126254a4f0f4d257ed191f9230352ce664f6015 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 12 Jan 1999 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1999-01-12 --- pc/archgeneric.c | 2 +- pc/ether79c970.c | 19 ++++++++++++++++--- port/fault.c | 26 ++++---------------------- port/swap.c | 4 ---- 4 files changed, 21 insertions(+), 30 deletions(-) diff --git a/pc/archgeneric.c b/pc/archgeneric.c index 1e4645c38f24ecca3d4436e51426f95274cd2a5d..6b9716ba81ebd3661c9911afcf5935cd5567b73e 100644 --- a/pc/archgeneric.c +++ b/pc/archgeneric.c @@ -201,7 +201,7 @@ archinit(void) if(X86FAMILY(m->cpuidax) == 3 || conf.nmach > 1) conf.copymode = 1; - if(X86FAMILY(m->cpuidax) == 6 /*&& conf.nmach > 1*/) + if(X86FAMILY(m->cpuidax) >= 5) coherence = wbflush; } diff --git a/pc/ether79c970.c b/pc/ether79c970.c index 741bfa8692010d355fe09edeb3a7fefb033d497c..761692edd7436bc27a4d2006696b0496fdb4859b 100644 --- a/pc/ether79c970.c +++ b/pc/ether79c970.c @@ -132,6 +132,10 @@ typedef struct Ctlr { ulong lcol; ulong uflo; ulong txbuff; + + ulong merr; /* bobf is such a whiner */ + ulong miss; + ulong babl; } Ctlr; #define csr32r(c, r) (inl((c)->port+(r))) @@ -179,7 +183,10 @@ ifstat(Ether* ether, void* a, long n, ulong offset) len += snprint(p+len, READSTR-len, "Lcar: %ld\n", ctlr->lcar); len += snprint(p+len, READSTR-len, "Lcol: %ld\n", ctlr->lcol); len += snprint(p+len, READSTR-len, "Uflo: %ld\n", ctlr->uflo); - snprint(p+len, READSTR-len, "Txbuff: %ld\n", ctlr->txbuff); + len += snprint(p+len, READSTR-len, "Txbuff: %ld\n", ctlr->txbuff); + len += snprint(p+len, READSTR-len, "Merr: %ld\n", ctlr->merr); + len += snprint(p+len, READSTR-len, "Miss: %ld\n", ctlr->miss); + snprint(p+len, READSTR-len, "Babl: %ld\n", ctlr->babl); n = readstr(offset, a, n, p); free(p); @@ -326,8 +333,14 @@ interrupt(Ureg*, void* arg) intrloop: csr0 = csr32r(ctlr, Rdp) & 0xFFFF; csr32w(ctlr, Rdp, Babl|Cerr|Miss|Merr|Rint|Tint|Iena); - if(csr0 & (Babl|Miss|Merr)) - print("#l%d: csr0 = 0x%uX\n", ether->ctlrno, csr0); + if(csr0 & Merr) + ctlr->merr++; + if(csr0 & Miss) + ctlr->miss++; + if(csr0 & Babl) + ctlr->babl++; + //if(csr0 & (Babl|Miss|Merr)) + // print("#l%d: csr0 = 0x%uX\n", ether->ctlrno, csr0); if(!(csr0 & (Rint|Tint))) return; diff --git a/port/fault.c b/port/fault.c index 1ed8c118cd75081e0cc69921575cf75d71f645e0..9b8b342ff29e3b43d70b3753bae2b52f4864b86e 100644 --- a/port/fault.c +++ b/port/fault.c @@ -87,21 +87,6 @@ fixfault(Segment *s, ulong addr, int read, int doputmmu) (*pg)->modref = PG_REF; break; - case SG_SHDATA: /* Shared data */ - shared: - if(pagedout(*pg)) - pio(s, addr, soff, pg); - - lkp = *pg; - lock(lkp); - - /* save a copy of the original for the image cache */ - if(lkp->image) - duppage(lkp); - - unlock(lkp); - goto done; - case SG_BSS: case SG_SHARED: /* Zero fill on demand */ case SG_STACK: @@ -117,13 +102,11 @@ fixfault(Segment *s, ulong addr, int read, int doputmmu) *pg = new; } - if(type == SG_SHARED) - goto shared; - - goto notshared; + goto common; case SG_DATA: - notshared: /* Demand load/pagein/copy on write */ + case SG_SHDATA: + common: /* Demand load/pagein/copy on write */ if(pagedout(*pg)) pio(s, addr, soff, pg); @@ -135,6 +118,7 @@ fixfault(Segment *s, ulong addr, int read, int doputmmu) lkp = *pg; lock(lkp); + if(lkp->image == &swapimage) ref = lkp->ref + swapcount(lkp->daddr); else @@ -155,7 +139,6 @@ fixfault(Segment *s, ulong addr, int read, int doputmmu) unlock(lkp); } - done: mmuphys = PPN((*pg)->pa) | PTEWRITE|PTEVALID; (*pg)->modref = PG_MOD|PG_REF; break; @@ -289,7 +272,6 @@ retry: putpage(new); goto done; } else { -print("!"); /* another process and the pager got in */ putpage(new); goto retry; diff --git a/port/swap.c b/port/swap.c index 4b7c7504fd698c3be5b55b65243166f06a7b1bbe..337bdf0788d471d0d16ad0ccaa19c43028c2d8f3 100644 --- a/port/swap.c +++ b/port/swap.c @@ -338,14 +338,12 @@ executeio(void) if(ioptr > conf.nswppo) panic("executeio: ioptr %d > %d\n", ioptr, conf.nswppo); out = iolist[i]; - up->psstate = "I/Okm"; k = kmap(out); kaddr = (char*)VA(k); if(waserror()) panic("executeio: page out I/O error"); - up->psstate = "I/Owr"; n = devtab[c->type]->write(c, kaddr, BY2PG, out->daddr); if(n != BY2PG) nexterror(); @@ -354,11 +352,9 @@ executeio(void) poperror(); /* Free up the page after I/O */ - up->psstate = "I/Odec"; lock(out); out->ref--; unlock(out); - up->psstate = "I/Oput"; putpage(out); } ioptr = 0;