From ed9c354533985ee042cd567157da3dd3e240a6c8 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 25 Jan 2000 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2000-01-25 --- alphapc/ether2114x.c | 14 ++--- alphapc/fns.h | 1 - alphapc/l.s | 1 + alphapc/trap.c | 144 +++++++++++++++++++++++-------------------- 4 files changed, 85 insertions(+), 75 deletions(-) diff --git a/alphapc/ether2114x.c b/alphapc/ether2114x.c index ac97a589512556b9cf56bbb159908350c24cbd5d..290db548bf50c69f0dd3e8af317b1571e2e0bbb2 100644 --- a/alphapc/ether2114x.c +++ b/alphapc/ether2114x.c @@ -19,14 +19,14 @@ #include "etherif.h" -/* nasty PCI DMA hack... */ - #define DEBUG 0 #define debug if(DEBUG)print enum { Nrde = 64, Ntde = 64, + + Rxbufsz = ROUNDUP(sizeof(Etherpkt)+4, 4), }; enum { /* CRS0 - Bus Mode */ @@ -457,7 +457,7 @@ interrupt(Ureg*, void* arg) if(des->status & De) ctlr->de++; } - else if(bp = iallocb(sizeof(Etherpkt)+4)){ + else if(bp = iallocb(Rxbufsz)){ len = ((des->status & Fl)>>16)-4; des->bp->wp = des->bp->rp+len; etheriq(ether, des->bp, 1); @@ -466,7 +466,7 @@ interrupt(Ureg*, void* arg) } des->control &= Er; - des->control |= ROUNDUP(sizeof(Etherpkt)+4, 4); + des->control |= Rxbufsz; coherence(); des->status = Own; @@ -566,11 +566,11 @@ ctlrinit(Ether* ether) * create and post a setup packet to initialise * the physical ethernet address. */ - ctlr->rdr = malloc(ctlr->nrdr*sizeof(Des)); + ctlr->rdr = xspanalloc(ctlr->nrdr*sizeof(Des), 8*sizeof(ulong), 0); for(des = ctlr->rdr; des < &ctlr->rdr[ctlr->nrdr]; des++){ - des->bp = allocb(ROUNDUP(sizeof(Etherpkt)+4, 4)); + des->bp = allocb(Rxbufsz); des->status = Own; - des->control = ROUNDUP(sizeof(Etherpkt)+4, 4); + des->control = Rxbufsz; des->addr = PCIWADDR(des->bp->rp); } ctlr->rdr[ctlr->nrdr-1].control |= Er; diff --git a/alphapc/fns.h b/alphapc/fns.h index fe5ee2e96ae02fe6363d1e4c23bd9dbcb202e6e8..7e95c7ea930c8fdc8b617fe0c1ecdd71e43100a9 100644 --- a/alphapc/fns.h +++ b/alphapc/fns.h @@ -38,7 +38,6 @@ int i8259enable(int, int, Irqctl*); #define idlehands() /* nothing to do in the runproc */ void icflush(void); void illegal0(void); -void intr(Ureg*); void intr0(void); void intrenable(int, void (*)(Ureg*, void*), void*, int); int iprint(char*, ...); diff --git a/alphapc/l.s b/alphapc/l.s index 80d916c9410beab2e1e81d238c57533ee9ab9cd2..abc5ecce2b7dd8b68b9d96ba49bbaf9a1021b57b 100644 --- a/alphapc/l.s +++ b/alphapc/l.s @@ -11,6 +11,7 @@ TEXT _main(SB), $-8 MOVQ $mach0(SB), R(MACH) MOVQ $(BY2PG-8)(R(MACH)), R30 MOVQ R31, R(USER) + MOVQ R31, 0(R(MACH)) MOVQ $edata(SB), R1 MOVQ $end(SB), R2 diff --git a/alphapc/trap.c b/alphapc/trap.c index 877b309cbedb213e0089776d385f819e347f7c2f..63b4e560c001df28a1d1cdd4538f08fc8a526890 100644 --- a/alphapc/trap.c +++ b/alphapc/trap.c @@ -35,55 +35,6 @@ intrenable(int irq, void (*f)(Ureg*, void*), void* a, int tbdf) arch->intrenable(irq, f, a, tbdf); } -void -trap(Ureg *ur) -{ - char buf[ERRLEN]; - int user, x; - - m->intrts = fastticks(nil); - user = ur->status&UMODE; - - if(user){ - up = m->proc; - up->dbgreg = ur; - } - switch ((int)ur->type) { - case 1: /* arith */ - fptrap(ur); - break; - case 2: /* bad instr or FEN */ - illegal(ur); - break; - case 3: /* intr */ - intr(ur); - break; - case 4: /* memory fault */ - if(up == 0) - kernfault(ur, (ulong)ur->a1); - - x = up->insyscall; - up->insyscall = 1; - spllo(); - faultalpha(ur); - up->insyscall = x; - break; - case 6: /* alignment fault */ - ur->pc -= 4; - sprint(buf, "trap: unaligned addr 0x%lux", (ulong)ur->a0); - fataltrap(ur, buf); - break; - default: /* cannot happen */ - panic("bad trap type %d", (int)ur->type); - break; - } - - if(user && (up->procctl || up->nnote)){ - splhi(); - notify(ur); - } -} - typedef struct Mcheck Mcheck; struct Mcheck { @@ -149,33 +100,90 @@ mcheck(void *x) } void -intr(Ureg *ur) +trap(Ureg *ur) { - m->intr++; - switch ((int)ur->a0) { - case 0: /* interprocessor */ - panic("interprocessor intr"); + char buf[ERRLEN]; + int user, x; + + m->intrts = fastticks(nil); + user = ur->status&UMODE; + + if(user){ + up = m->proc; + up->dbgreg = ur; + } + switch ((int)ur->type) { + case 1: /* arith */ + fptrap(ur); break; - case 1: /* clock */ - clock(ur); + case 2: /* bad instr or FEN */ + illegal(ur); break; - case 2: /* machine check */ - mcheck((void*)(KZERO|(ulong)ur->a2)); + + case 3: /* intr */ + m->intr++; + switch ((int)ur->a0) { + case 0: /* interprocessor */ + panic("interprocessor intr"); + break; + case 1: /* clock */ + clock(ur); + break; + case 2: /* machine check */ + mcheck((void*)(KZERO|(ulong)ur->a2)); + break; + case 3: /* device */ + arch->intr(ur); + /* + * preemptive scheduling. to limit stack depth, + * make sure process has a chance to return from + * the current interrupt before being preempted a + * second time. + */ + if(up && up->state == Running) + if(anyhigher()) + if(up->preempted == 0) + if(!active.exiting){ + up->preempted = 1; + sched(); + splhi(); + up->preempted = 0; + return; + } + break; + case 4: /* perf counter */ + panic("perf count"); + break; + default: + panic("bad intr"); + break; + } break; - case 3: /* device */ - arch->intr(ur); + + case 4: /* memory fault */ + if(up == 0) + kernfault(ur, (ulong)ur->a1); + + x = up->insyscall; + up->insyscall = 1; + spllo(); + faultalpha(ur); + up->insyscall = x; break; - case 4: /* perf counter */ - panic("perf count"); + case 6: /* alignment fault */ + ur->pc -= 4; + sprint(buf, "trap: unaligned addr 0x%lux", (ulong)ur->a0); + fataltrap(ur, buf); break; - default: - panic("bad intr"); + default: /* cannot happen */ + panic("bad trap type %d", (int)ur->type); break; } - /* preemptive scheduling */ - if(up && up->state == Running && anyhigher()) - sched(); + if(user && (up->procctl || up->nnote)){ + splhi(); + notify(ur); + } } void @@ -250,6 +258,8 @@ dumpstack(void) el = sl + KSTACK; } if(l > el || l < sl){ + iprint("dumpstack: l %lux sl %lux el %lux m %lux up %lux\n", + l, sl, el, m, up); el = (ulong)m+BY2PG; sl = el-KSTACK; }