From ea0fbf112196ff58ed183e5a4ee08c372ac5ac66 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 3 Aug 2001 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2001-08-03 --- alphapc/trap.c | 9 ++++-- pc/sdata.c | 4 --- port/chan.c | 4 +-- port/devdup.c | 17 +++-------- port/devproc.c | 78 ++++++++++++++++++++++++++++++++++---------------- port/portfns.h | 1 + 6 files changed, 68 insertions(+), 45 deletions(-) diff --git a/alphapc/trap.c b/alphapc/trap.c index 7ba94e7c0cc4a42401e62f62f7b7a9a85e4fc02a..83dc0a604dc54bd4ce795caa0f709c01996160c6 100644 --- a/alphapc/trap.c +++ b/alphapc/trap.c @@ -157,7 +157,7 @@ smcheck(ulong code) } void -mcheck(void *x) +mcheck(Ureg *ur, void *x) { Mcheck *m; uvlong *data; @@ -173,6 +173,11 @@ mcheck(void *x) if (col++ == 2) col = 0; } + if(col != 2) + print("\n"); + print("\n"); + dumpregs(ur); + prflush(); firmware(); } @@ -280,7 +285,7 @@ trap(Ureg *ur) clock(ur); break; case 2: /* machine check */ - mcheck((void*)(KZERO|(ulong)ur->a2)); + mcheck(ur, (void*)(KZERO|(ulong)ur->a2)); break; case 3: /* device */ intr(ur); diff --git a/pc/sdata.c b/pc/sdata.c index f8ca71c64327baeb2a92f6bcbe1ccef6c52d7c01..d518e1d10d46946a9e502a43a789c334a1153511 100644 --- a/pc/sdata.c +++ b/pc/sdata.c @@ -1662,10 +1662,6 @@ atapnp(void) */ break; case (0x0646<<16)|0x1095: /* CMD 646 */ - /* - * Is this correct? - */ - pi |= 0x0f; //for(i = 0; i <= 4; i++) print("bar%d: addr %lux size %d\n", i, p->mem[i].bar, p->mem[i].size); break; case (0x0571<<16)|0x1106: /* VIA 82C686 */ diff --git a/port/chan.c b/port/chan.c index 3b9c9cd1369d4498f688dd9144c18df1a9c32635..2ca7c09d269f4edc9c69fea5243050a29abc3982 100644 --- a/port/chan.c +++ b/port/chan.c @@ -554,9 +554,9 @@ cunmount(Chan *mnt, Chan *mounted) Mount *f, **p; if(mnt->umh) /* should not happen */ - print("cmount newp extra umh\n"); + print("cunmount newp extra umh\n"); if(mounted && mounted->umh) - print("cmount old extra umh\n"); + print("cunmount old extra umh\n"); pg = up->pgrp; wlock(&pg->ns); diff --git a/port/devdup.c b/port/devdup.c index f991ab511bc2529e3edfa890aa68abf36df032ae..96b577a5545973bbb9a673afe34a92a2e370584e 100644 --- a/port/devdup.c +++ b/port/devdup.c @@ -28,7 +28,7 @@ dupgen(Chan *c, char *, Dirtab*, int, int s, Dir *dp) if((f=fgrp->fd[s/2]) == nil) return 0; if(s & 1){ - p = 0600; + p = 0400; sprint(up->genbuf, "%dctl", s/2); }else{ p = perm[f->mode&3]; @@ -101,7 +101,7 @@ dupread(Chan *c, void *va, long n, vlong offset) { char *a = va; char buf[256]; - int fd, twicefd; + int fd, twicefd, m; Fgrp *f; if(c->qid.type == QTDIR) @@ -113,7 +113,7 @@ dupread(Chan *c, void *va, long n, vlong offset) if(fd<0 || f->nfd<=fd) error(Ebadfd); c = fdtochan(fd, -1, 0, 0); - snprint(buf, sizeof buf, "%d %ld", fd, c->iounit); + procfdprint(c, fd, 0, buf, sizeof buf); return readstr((ulong)offset, va, n, buf); } panic("dupread"); @@ -121,17 +121,8 @@ dupread(Chan *c, void *va, long n, vlong offset) } static long -dupwrite(Chan *c, void*, long, vlong) +dupwrite(Chan*, void*, long, vlong) { - int fd, twicefd; - - twicefd = c->qid.path - 1; - fd = twicefd/2; - if(twicefd & 1){ -print("writing ctl file\n"); - print("do ctl write\n"); - return -1; - } panic("dupwrite"); return 0; /* not reached */ } diff --git a/port/devproc.c b/port/devproc.c index f5bc44332f57753b7d8e9f6dae48ef38c25f6b0d..0b5b54d4622ea12ae7625afd5b514a70f03aeaa0 100644 --- a/port/devproc.c +++ b/port/devproc.c @@ -340,13 +340,36 @@ procoffset(long offset, char *va, int *np) return offset; } +static int +procqidwidth(Chan *c) +{ + char buf[32]; + + return sprint(buf, "%lud", c->qid.vers); +} + +int +procfdprint(Chan *c, int fd, int w, char *s, int ns) +{ + int n; + + if(w == 0) + w = procqidwidth(c); + n = snprint(s, ns, "%3d %.2s %C %4ld (%.16llux %*lud %.2ux) %5ld %8lld %s\n", + fd, + &"r w rw"[(c->mode&3)<<1], + devtab[c->type]->dc, c->dev, + c->qid.path, w, c->qid.vers, c->qid.type, + c->iounit, c->offset, c->name->s); + return n; +} + static int procfds(Proc *p, char *va, int count, long offset) { Fgrp *f; Chan *c; int n, i, w, ww; - char buf[32]; qlock(&p->debug); f = p->fgrp; @@ -370,7 +393,7 @@ procfds(Proc *p, char *va, int count, long offset) c = f->fd[i]; if(c == nil) continue; - ww = sprint(buf, "%lud", c->qid.vers); + ww = procqidwidth(c); if(ww > w) w = ww; } @@ -378,14 +401,7 @@ procfds(Proc *p, char *va, int count, long offset) c = f->fd[i]; if(c == nil) continue; - n += snprint(va+n, count-n, "%3d %.2s %C %4ld (%.16llux %*lud %.2ux) %8lld ", - i, - &"r w rw"[(c->mode&3)<<1], - devtab[c->type]->dc, c->dev, - c->qid.path, w, c->qid.vers, c->qid.type, - c->offset); - n += readstr(0, va+n, count-n, c->name->s); - n += snprint(va+n, count-n, "\n"); + n += procfdprint(c, i, w, va+n, count-n); offset = procoffset(offset, va, &n); } unlock(f); @@ -945,11 +961,26 @@ procstopwait(Proc *p, int ctl) error(Eprocdied); } +static void +procctlcloseone(Proc *p, Fgrp *f, int fd) +{ + Chan *c; + + c = f->fd[fd]; + if(c == nil) + return; + f->fd[fd] = nil; + unlock(f); + qunlock(&p->debug); + cclose(c); + qlock(&p->debug); + lock(f); +} + void -procctlclosefiles(Proc *p) +procctlclosefiles(Proc *p, int all, int fd) { int i; - Chan *c; Fgrp *f; f = p->fgrp; @@ -958,17 +989,11 @@ procctlclosefiles(Proc *p) lock(f); f->ref++; - for(i = 0; i < f->maxfd; i++) { - c = f->fd[i]; - if(c != 0) { - f->fd[i] = 0; - unlock(f); - qunlock(&p->debug); - cclose(c); - qlock(&p->debug); - lock(f); - } - } + if(all) + for(i = 0; i < f->maxfd; i++) + procctlcloseone(p, f, i); + else + procctlcloseone(p, f, fd); unlock(f); closefgrp(f); } @@ -1028,8 +1053,13 @@ procctlreq(Proc *p, char *va, int n) } else if(strncmp(buf, "closefiles", 10) == 0) - procctlclosefiles(p); + procctlclosefiles(p, 1, 0); else + if(strncmp(buf, "close", 5) == 0){ + if(n < 6) + error(Ebadctl); + procctlclosefiles(p, 0, atoi(buf+6)); + }else if(strncmp(buf, "pri", 3) == 0) { if(n < 4) error(Ebadctl); diff --git a/port/portfns.h b/port/portfns.h index 2ed3ea753048704fc0ea3907f8acc6e9d169d5ff..d4e2eed19132e59a92ff9a9822e740956d4b9af5 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -203,6 +203,7 @@ ulong procalarm(ulong); int proccounter(char *name); void procctl(Proc*); void procdump(void); +int procfdprint(Chan*, int, int, char*, int); void procinit0(void); void procflushseg(Segment*); Proc* proctab(int);