M alphapc/trap.c => alphapc/trap.c +7 -2
@@ 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);
M pc/sdata.c => pc/sdata.c +0 -4
@@ 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 */
M port/chan.c => port/chan.c +2 -2
@@ 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);
M port/devdup.c => port/devdup.c +4 -13
@@ 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 */
}
M port/devproc.c => port/devproc.c +54 -24
@@ 341,12 341,35 @@ procoffset(long offset, char *va, int *np)
}
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);
M port/portfns.h => port/portfns.h +1 -0
@@ 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);