From d816200d503406772ac1b6901e3878c346a52ad1 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 24 Jan 2002 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2002-01-24 --- mtx/fns.h | 1 - mtx/l.s | 2 +- mtx/main.c | 6 ++---- mtx/mmu.c | 23 +++++++++++++++++------ mtx/trap.c | 37 +++++++++++++++++-------------------- pc/ether8139.c | 2 +- port/sysproc.c | 2 ++ 7 files changed, 40 insertions(+), 33 deletions(-) diff --git a/mtx/fns.h b/mtx/fns.h index a6b0613b497a866247f2b8a2f355c8faded3ca3d..34f5f34e8b28d32a7903773057df69742ea4b261 100644 --- a/mtx/fns.h +++ b/mtx/fns.h @@ -18,7 +18,6 @@ void evenaddr(ulong); void faultpower(Ureg*, ulong addr, int read); void firmware(void); void fpinit(void); -void fpoff(Proc*); void fprestore(FPsave*); void fpsave(FPsave*); void fptrap(Ureg*); diff --git a/mtx/l.s b/mtx/l.s index f934165c314ee15780d2a2a1b5025975c7637caf..9415ad95594f9b8a9fb964e494083e82451e90d6 100644 --- a/mtx/l.s +++ b/mtx/l.s @@ -416,7 +416,7 @@ TEXT trapvec(SB), $-4 ktrap: MOVW R1, CR MOVW SPR(SAVER1), R1 - RLWNM $0, R1, $~KZERO, R1 /* PADDR(m->proc->kstack) */ + RLWNM $0, R1, $~KZERO, R1 /* PADDR(R1) */ SUB $UREGSPACE, R1 BL saveureg(SB) BL trap(SB) diff --git a/mtx/main.c b/mtx/main.c index d209f6a65167cdbb9871b5781658ebc6e4d78b85..9772d8c23534069fdaf79e294f8012d52209fc46 100644 --- a/mtx/main.c +++ b/mtx/main.c @@ -55,9 +55,8 @@ machinit(void) */ m->loopconst = 100000; - /* turn on caches (instruction only for now) */ -// puthid0(gethid0() | BIT(16)); -puthid0(gethid0() | BIT(16) | BIT(17)); /* and data */ + /* turn on caches */ + puthid0(gethid0() | BIT(16) | BIT(17)); active.machs = 1; active.exiting = 0; @@ -262,7 +261,6 @@ procsave(Proc *p) if(p->fpstate == FPactive){ if(p->state != Moribund) fpsave(&up->fpsave); -// fpoff(p); p->fpstate = FPinactive; } } diff --git a/mtx/mmu.c b/mtx/mmu.c index a44e515d5a866a958349c00adde034e5d8906482..604ea2b6fa8a7219148d50dd7615e97e8696913a 100644 --- a/mtx/mmu.c +++ b/mtx/mmu.c @@ -20,6 +20,8 @@ static struct { ulong size; /* number of bytes in page table */ ulong mask; /* hash mask */ int slotgen; /* next pte (byte offset) when pteg is full */ + + int pidlock; int pidgen; /* next mmu pid to use */ } ptab; @@ -75,6 +77,12 @@ mmuswitch(Proc *p) { int i, mp; + if(p->kp) { + for(i = 0; i < 8; i++) + putsr(i<<28, 0); + return; + } + if(p->newtlb) { p->mmupid = 0; p->newtlb = 0; @@ -113,13 +121,13 @@ putmmu(ulong va, ulong pa, Page *pg) p = (ulong*)pteg; ep = (ulong*)(pteg+BY2PTEG); q = nil; - lock(&ptab); + ilock(&ptab); tlbflush(va); while(p < ep) { x = p[0]; if(x == ptehi) { q = p; -if(q[1] == pa) panic("putmmu already set pte"); +if(q[1] == pa) print("putmmu already set pte\n"); break; } if(q == nil && (x & BIT(0)) == 0) @@ -133,7 +141,7 @@ if(q[1] == pa) panic("putmmu already set pte"); q[0] = ptehi; q[1] = pa; sync(); - unlock(&ptab); + iunlock(&ptab); ctl = &pg->cachectl[m->machno]; switch(*ctl) { @@ -156,11 +164,14 @@ newmmupid(void) { int pid; - lock(&ptab); + /* can't use lock() here as we're called from within sched() */ + while(!tas(&ptab.pidlock)) + ; pid = ptab.pidgen++; - unlock(&ptab); if(pid > PIDMAX) - panic("newmmupid"); + pid = PIDBASE; + ptab.pidlock = 0; + coherence(); up->mmupid = pid; return pid; } diff --git a/mtx/trap.c b/mtx/trap.c index 3f351e1813bd872b3924aecfdc9ffc214aa4098c..867401e5c30c663beaef0210e3b0d232d83d2f10 100644 --- a/mtx/trap.c +++ b/mtx/trap.c @@ -313,12 +313,10 @@ faultpower(Ureg *ureg, ulong addr, int read) user = (ureg->srr1 & MSR_PR) != 0; insyscall = up->insyscall; up->insyscall = 1; - spllo(); n = fault(addr, read); if(n < 0){ if(!user){ dumpregs(ureg); -// _dumpstack(ureg); panic("fault: 0x%lux", addr); } sprint(buf, "sys: trap: fault %s addr=0x%lux", read? "read" : "write", addr); @@ -427,16 +425,6 @@ fpexcname(Ureg *ur, ulong fpscr, char *buf) return buf; } -void -fpoff(Proc *p) -{ - Ureg *ur; - - ur = p->dbgreg; - if(ur != nil) - ur->srr1 &= ~MSR_FP; -} - /* * Fill in enough of Ureg to get a stack trace, and call a function. * Used by debugging interface rdb. @@ -462,19 +450,30 @@ callwithureg(void (*fn)(Ureg*)) static void _dumpstack(Ureg *ureg) { - ulong l, v; + ulong l, sl, el, v; int i; - if(up == 0) + l = (ulong)&l; + if(up == 0){ + el = (ulong)m+BY2PG; + sl = el-KSTACK; + } + else{ + sl = (ulong)up->kstack; + el = sl + KSTACK; + } + if(l > el || l < sl){ + el = (ulong)m+BY2PG; + sl = el-KSTACK; + } + if(l > el || l < sl) return; - print("ktrace /kernel/path %.8lux %.8lux %.8lux\n", ureg->pc, ureg->sp, ureg->lr); i = 0; - for(l=(ulong)&l; l<(ulong)(up->kstack+KSTACK); l+=4){ + for(; l < el; l += 4){ v = *(ulong*)l; if(KTZERO < v && v < (ulong)etext){ print("%.8lux=%.8lux ", l, v); -//delay(1); if(i++ == 4){ print("\n"); i = 0; @@ -494,9 +493,9 @@ dumpregs(Ureg *ur) { int i; ulong *l; + if(up) { print("registers for %s %ld\n", up->text, up->pid); -print("ur %lux\n", ur); if(ur->srr1 & MSR_PR == 0) if(ur->usp < (ulong)up->kstack || ur->usp > (ulong)up->kstack+KSTACK) print("invalid stack ptr\n"); @@ -741,7 +740,6 @@ notify(Ureg* ur) qunlock(&up->debug); pexit(n->msg, n->flag!=NDebug); } -print("notify: old usp %lux\n", ur->usp); sp = ur->usp & ~(BY2V-1); sp -= sizeof(Ureg); @@ -768,7 +766,6 @@ print("notify: old usp %lux\n", ur->usp); up->nnote--; memmove(&up->lastnote, &up->note[0], sizeof(Note)); memmove(&up->note[0], &up->note[1], up->nnote*sizeof(Note)); -print("notify: usp %lux\n", ur->usp); qunlock(&up->debug); splx(s); diff --git a/pc/ether8139.c b/pc/ether8139.c index b9a4a261e50f25a40f734e261a7388869231b9b9..2c5bdbef621e9832cc659128e8c2394bb4e62783 100644 --- a/pc/ether8139.c +++ b/pc/ether8139.c @@ -169,7 +169,7 @@ enum { /* Tsd0 */ }; enum { - Rblen = Rblen64K, /* Receive BUffer Length */ + Rblen = Rblen64K, /* Receive Buffer Length */ Ntd = 4, /* Number of Transmit Descriptors */ Tdbsz = ROUNDUP(sizeof(Etherpkt), 4), }; diff --git a/port/sysproc.c b/port/sysproc.c index f1a53910612643fcf004a3e44b64c57b81e1bc80..867991070e14464a6225fb5d6e0f08bdb78dc350 100644 --- a/port/sysproc.c +++ b/port/sysproc.c @@ -640,6 +640,8 @@ generrstr(char *buf, uint nbuf) { char tmp[ERRMAX]; + if(nbuf == 0) + error(Ebadarg); validaddr((ulong)buf, nbuf, 1); if(nbuf > sizeof tmp) nbuf = sizeof tmp;