M pc/archgeneric.c => pc/archgeneric.c +1 -1
@@ 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;
}
M pc/ether79c970.c => pc/ether79c970.c +16 -3
@@ 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;
M port/fault.c => port/fault.c +4 -22
@@ 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;
M port/swap.c => port/swap.c +0 -4
@@ 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;