## diffname port/devproc.c 1990/0227 ## diff -e /dev/null /n/bootesdump/1990/0227/sys/src/9/mips/devproc.c 0a #include "u.h" #include "lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "errno.h" #include "devtab.h" enum{ Qdir, Qctl, Qmem, Qnote, Qproc, Qstatus, Qtext, }; Dirtab procdir[]={ "ctl", Qctl, 0, 0600, "mem", Qmem, 0, 0600, "note", Qnote, 0, 0600, "proc", Qproc, sizeof(Proc), 0600, "status", Qstatus, NAMELEN+12+6*12, 0600, "text", Qtext, 0, 0600, }; /* * Qids are, from bottom to top: * 4 bits of file type (qids above) * 12 bits of process slot number + 1 * 15 bits of pid, for consistency checking */ #define NPROC (sizeof procdir/sizeof(Dirtab)) #define QSHIFT 4 /* location in qid of proc slot # */ #define PIDSHIFT 16 /* location in qid of pid */ #define PIDMASK 0x7FFF /* low bits of pid used in qid */ #define QID(q) (((q)&0x0000000F)>>0) #define SLOT(q) ((((q)&0x0000FFF0)>>QSHIFT)-1) #define PID(q) (((q)&0x7FFF0000)>>PIDSHIFT) int procgen(Chan *c, Dirtab *tab, int ntab, int s, Dir *dp) { Proc *p; char buf[NAMELEN]; ulong pid; if(c->qid == CHDIR){ if(s >= conf.nproc) return -1; p = proctab(s); pid = p->pid; if(pid == 0) return 0; sprint(buf, "%d", pid); devdir(c, CHDIR|(pid<= NPROC) return -1; if(tab) panic("procgen"); tab = &procdir[s]; devdir(c, (~CHDIR)&(c->qid|tab->qid), tab->name, tab->length, tab->perm, dp); return 1; } void procinit(void) { if(conf.nproc >= (1<<(16-QSHIFT))-1) print("warning: too many procs for devproc\n"); } void procreset(void) { } Chan* procattach(char *spec) { return devattach('p', spec); } Chan* procclone(Chan *c, Chan *nc) { return devclone(c, nc); } int procwalk(Chan *c, char *name) { return devwalk(c, name, 0, 0, procgen); } void procstat(Chan *c, char *db) { devstat(c, db, 0, 0, procgen); } Chan * procopen(Chan *c, int omode) { Proc *p; Orig *o; Chan *tc; p = proctab(SLOT(c->qid)); if((p->pid&PIDMASK) != PID(c->qid)) Died: error(0, Eprocdied); omode = openmode(omode); switch(QID(c->qid)){ case Qtext: o = p->seg[TSEG].o; if(o==0 || p->state==Dead) goto Died; tc = o->chan; if(tc == 0) goto Died; if(incref(tc) == 0){ Close: close(tc); goto Died; } if(!(tc->flag&COPEN) || tc->mode!=OREAD) goto Close; if((p->pid&PIDMASK) != PID(c->qid)) goto Close; qlock(tc); tc->offset = 0; qunlock(tc); return tc; case Qctl: case Qnote: break; case Qdir: case Qmem: case Qproc: case Qstatus: if(omode!=OREAD) error(0, Eperm); break; default: pprint("unknown qid in devopen\n"); error(0, Egreg); } /* * Affix pid to qid */ if(p->state != Dead) c->qid |= (p->pid&PIDMASK)<mode = omode; c->flag |= COPEN; c->offset = 0; return c; } void proccreate(Chan *c, char *name, int omode, ulong perm) { error(0, Eperm); } void procremove(Chan *c) { error(0, Eperm); } void procwstat(Chan *c, char *db) { error(0, Eperm); } void procclose(Chan * c) { } long procread(Chan *c, void *va, long n) { char *a = va, *b; char statbuf[2*NAMELEN+12+6*12]; Proc *p; Seg *s; Orig *o; Page *pg; int i; long l; long pid; User *up; if(c->qid & CHDIR) return devdirread(c, a, n, 0, 0, procgen); /* * BUG: should lock(&p->debug)? */ p = proctab(SLOT(c->qid)); if((p->pid&PIDMASK) != PID(c->qid)) error(0, Eprocdied); switch(QID(c->qid)){ case Qmem: /* * One page at a time */ if(((c->offset+n)&~(BY2PG-1)) != (c->offset&~(BY2PG-1))) n = BY2PG - (c->offset&(BY2PG-1)); s = seg(p, c->offset); if(s){ o = s->o; if(o == 0) error(0, Eprocdied); lock(o); if(s->o!=o || (p->pid&PIDMASK)!=PID(c->qid)){ unlock(o); error(0, Eprocdied); } if(seg(p, c->offset) != s){ unlock(o); error(0, Egreg); } pg = o->pte[(c->offset-o->va)>>PGSHIFT].page; unlock(o); if(pg == 0){ pprint("nonresident page (complain to rob)\n"); memset(a, 0, n); }else{ b = (char*)(pg->pa|KZERO); memcpy(a, b+(c->offset&(BY2PG-1)), n); } return n; } /* u area */ if(c->offset>=USERADDR && c->offset<=USERADDR+BY2PG){ if(c->offset+n > USERADDR+BY2PG) n = USERADDR+BY2PG - c->offset; pg = p->upage; if(pg==0 || (p->pid&PIDMASK)!=PID(c->qid)) error(0, Eprocdied); b = (char*)(pg->pa|KZERO); memcpy(a, b+(c->offset-USERADDR), n); return n; } /* kernel memory. BUG: shouldn't be so easygoing. BUG: mem mapping? */ if(c->offset>=KZERO && c->offsetoffset+n > KZERO+conf.npage*BY2PG) n = KZERO+conf.npage*BY2PG - c->offset; memcpy(a, (char*)c->offset, n); return n; } return 0; break; case Qnote: lock(&p->debug); if(waserror()){ unlock(&p->debug); nexterror(); } if((p->pid&PIDMASK) != PID(c->qid)) error(0, Eprocdied); up = (User*)(p->upage->pa|KZERO); if(up->p != p){ pprint("note read u/p mismatch"); error(0, Egreg); } if(n < ERRLEN) error(0, Etoosmall); if(up->nnote == 0) n = 0; else{ memcpy(va, up->note[0].msg, ERRLEN); up->nnote--; memcpy(&up->note[0], &up->note[1], up->nnote*sizeof(Note)); n = ERRLEN; } unlock(&p->debug); return n; case Qproc: if(c->offset >= sizeof(Proc)) return 0; if(c->offset+n > sizeof(Proc)) n = sizeof(Proc) - c->offset; memcpy(a, ((char*)p)+c->offset, n); return n; case Qstatus: if(c->offset >= sizeof statbuf) return 0; if(c->offset+n > sizeof statbuf) n = sizeof statbuf - c->offset; sprint(statbuf, "%-27s %-27s %-11s ", p->text, p->pgrp->user, statename[p->state]); for(i=0; i<6; i++){ l = p->time[i]; if(i == TReal) l = MACHP(0)->ticks - l; l *= MS2HZ; readnum(0, statbuf+2*NAMELEN+12+NUMSIZE*i, NUMSIZE, l, NUMSIZE); } memcpy(a, statbuf+c->offset, n); return n; } error(0, Egreg); } long procwrite(Chan *c, void *va, long n) { Proc *p; User *up; char buf[ERRLEN]; if(c->qid & CHDIR) error(0, Eisdir); p = proctab(SLOT(c->qid)); lock(&p->debug); if(waserror()){ unlock(&p->debug); nexterror(); } if((p->pid&PIDMASK) != PID(c->qid)) Died: error(0, Eprocdied); switch(QID(c->qid)){ case Qctl: if(p->state==Broken && n>=4 && strncmp(va, "exit", 4)==0) ready(p); else error(0, Ebadctl); break; case Qnote: up = (User*)(p->upage->pa|KZERO); if(up->p != p){ pprint("note write u/p mismatch"); error(0, Egreg); } if(n >= ERRLEN-1) error(0, Etoobig); if(n>=4 && strncmp(va, "sys:", 4)==0) error(0, Ebadarg); memcpy(buf, va, n); buf[n] = 0; if(!postnote(p, 0, buf, NUser)) error(0, Enonote); break; default: pprint("unknown qid in procwrite\n"); error(0, Egreg); } unlock(&p->debug); return n; } void procuserstr(Error *e, char *buf) { consuserstr(e, buf); } void procerrstr(Error *e, char *buf) { rooterrstr(e, buf); } . ## diffname port/devproc.c 1990/03081 ## diff -e /n/bootesdump/1990/0227/sys/src/9/mips/devproc.c /n/bootesdump/1990/03081/sys/src/9/mips/devproc.c 158a done: . 112a if(c->qid == CHDIR){ if(omode != OREAD) error(0, Eperm); goto done; } . 84a Chan *c; . ## diffname port/devproc.c 1990/0424 ## diff -e /n/bootesdump/1990/03081/sys/src/9/mips/devproc.c /n/bootesdump/1990/0424/sys/src/9/mips/devproc.c 152a if(omode!=OREAD) error(0, Eperm); break; case Qmem: . 150d ## diffname port/devproc.c 1990/0614 ## diff -e /n/bootesdump/1990/0424/sys/src/9/mips/devproc.c /n/bootesdump/1990/0614/sys/src/9/mips/devproc.c 362a kunmap(k); . 359a kunmap(k); . 358c k = kmap(p->upage); up = (User*)VA(k); . 335a KMap *k; . 321c l = TK2MS(l); . 299a kunmap(k); . 286a kunmap(k); . 285c k = kmap(p->upage); up = (User*)VA(k); . 268,270c if(c->offset>=KZERO && c->offsetoffset+n > KZERO+conf.npage0*BY2PG) n = KZERO+conf.npage0*BY2PG - c->offset; . 263a kunmap(k); . 262c k = kmap(pg); b = (char*)VA(k); . 250a kunmap(k); . 249c k = kmap(pg); b = (char*)VA(k); . 246c pprint("nonresident page addr %lux (complain to rob)\n", c->offset); . 243c pte = &o->pte[(c->offset-o->va)>>PGSHIFT]; if(s->mod){ opte = pte; while(pte = pte->nextmod) /* assign = */ if(pte->proc == p) break; if(pte == 0) pte = opte; } pg = pte->page; . 206a KMap *k; PTE *pte, *opte; . 155,158d 149a case Qmem: . ## diffname port/devproc.c 1990/0914 ## diff -e /n/bootesdump/1990/0614/sys/src/9/mips/devproc.c /n/bootesdump/1990/0914/sys/src/9/mips/devproc.c 282a memcpy(a, (char*)c->offset, n); return n; } else if(c->offset>=UNCACHED && c->offsetoffset+n > UNCACHED+conf.npage0*BY2PG) n = UNCACHED+conf.npage0*BY2PG - c->offset; . 6a #include "io.h" . ## diffname port/devproc.c 1990/1110 ## diff -e /n/bootesdump/1990/0914/sys/src/9/mips/devproc.c /n/bootesdump/1990/1110/sys/src/9/mips/devproc.c 361a /* * Special case: don't worry about process, just use remembered group */ if(QID(c->qid) == Qnotepg){ pg = pgrptab(SLOT(c->pgrpid)); lock(&pg->debug); if(waserror()){ unlock(&pg->debug); nexterror(); } if((pg->pgrpid&PIDMASK) != PID(c->pgrpid)){ unlock(&pg->debug); goto Died; } pgrpnote(pg, va, n, NUser); unlock(&pg->debug); return n; } . 355a Pgrp *pg; . 286c }else if(c->offset>=UNCACHED && c->offsetoffset>=USERADDR && c->offsetpgrpid = (pg->pgrpid<index+1)<pgrp; . 111a Pgrp *pg; . 24a "notepg", Qnotepg, 0, 0200, . 15a Qnotepg, . 8a /* BUG mips only TAKE IT OUT */ #include "io.h" . 7d ## diffname port/devproc.c 1990/1115 ## diff -e /n/bootesdump/1990/1110/sys/src/9/mips/devproc.c /n/bootesdump/1990/1115/sys/src/9/mips/devproc.c 158c if(omode!=OWRITE || pg->pgrpid==1) /* easy to do by mistake */ . ## diffname port/devproc.c 1990/11211 ## diff -e /n/bootesdump/1990/1115/sys/src/9/mips/devproc.c /n/bootesdump/1990/11211/sys/src/9/mips/devproc.c 438,449d 434c error(Egreg); . 430c error(Enonote); . 426c error(Ebadarg); . 424c error(Etoobig); . 420c error(Egreg); . 412c error(Ebadctl); . 405c error(Eprocdied); . 403c if(p->pid != PID(c->qid)) . 388c if(pg->pgrpid != c->pgrpid.vers){ . 382c pg = pgrptab(c->pgrpid.path-1); . 375,376c if(c->qid.path & CHDIR) error(Eisdir); . 362c error(Egreg); . 325c error(Etoosmall); . 322c error(Egreg); . 315,316c if(p->pid != PID(c->qid)) error(Eprocdied); . 299,304d 284,285c if(pg==0 || p->pid!=PID(c->qid)) error(Eprocdied); . 254c error(Egreg); . 250c error(Eprocdied); . 248c if(s->o!=o || p->pid!=PID(c->qid)){ . 246c error(Eprocdied); . 232,233c if(p->pid != PID(c->qid)) error(Eprocdied); . 225c if(c->qid.path & CHDIR) . 201c error(Eperm); . 195c error(Eperm); . 189c error(Eperm); . 178c c->qid.vers = p->pid; . 172c error(Egreg); . 168c error(Eperm); . 159,160c error(Eperm); c->pgrpid.path = pg->index+1; c->pgrpid.vers = pg->pgrpid; . 147c if(p->pid != PID(c->qid)) . 129c error(Eprocdied); . 127c if(p->pid != PID(c->qid)) . 122c error(Eperm); . 120c if(c->qid.path == CHDIR){ . 71c devdir(c, (Qid){(~CHDIR)&(c->qid.path|tab->qid.path), c->qid.vers}, tab->name, tab->length, tab->perm, dp); . 63c devdir(c, (Qid){CHDIR|((s+1)<qid.path == CHDIR){ . 42,46c #define QID(q) (((q).path&0x0000000F)>>0) #define SLOT(q) ((((q).path&0x0FFFFFFF0)>>QSHIFT)-1) #define PID(q) ((q).vers) . 37,38c * 24 bits of process slot number + 1 * in vers, * 32 bits of pid, for consistency checking * If notepg, c->pgrpid.path is pgrp slot, .vers is pgrpid. . 35c * Qids are, in path: . 25,31c "ctl", {Qctl}, 0, 0600, "mem", {Qmem}, 0, 0600, "note", {Qnote}, 0, 0600, "notepg", {Qnotepg}, 0, 0200, "proc", {Qproc}, sizeof(Proc), 0600, "status", {Qstatus}, NAMELEN+12+6*12, 0600, "text", {Qtext}, 0, 0600, . ## diffname port/devproc.c 1990/1126 ## diff -e /n/bootesdump/1990/11211/sys/src/9/mips/devproc.c /n/bootesdump/1990/1126/sys/src/9/mips/devproc.c 393d 373a p = proctab(SLOT(c->qid)); . ## diffname port/devproc.c 1990/1128 ## diff -e /n/bootesdump/1990/1126/sys/src/9/mips/devproc.c /n/bootesdump/1990/1128/sys/src/9/mips/devproc.c 45c #define SLOT(q) ((((q).path&0x07FFFFFF0)>>QSHIFT)-1) . 37c * 23 bits of process slot number + 1 . 8,10d ## diffname port/devproc.c 1991/0212 ## diff -e /n/bootesdump/1990/1210/sys/src/9/mips/devproc.c /n/bootesdump/1991/0212/sys/src/9/port/devproc.c 387c qunlock(&pg->debug); . 383c qunlock(&pg->debug); . 379c qunlock(&pg->debug); . 377c qlock(&pg->debug); . ## diffname port/devproc.c 1991/0318 ## diff -e /n/bootesdump/1991/0212/sys/src/9/port/devproc.c /n/bootesdump/1991/0318/sys/src/9/port/devproc.c 420c memmove(buf, va, n); . 352c memmove(a, statbuf+c->offset, n); . 336c memmove(a, ((char*)p)+c->offset, n); . 324c memmove(&up->note[0], &up->note[1], up->nnote*sizeof(Note)); . 322c memmove(va, up->note[0].msg, ERRLEN); . 296c memmove(a, (char*)c->offset, n); . 287c memmove(a, b+(c->offset-USERADDR), n); . 277d 272c memmove(a, b+(c->offset&(BY2PG-1)), n); . ## diffname port/devproc.c 1991/0411 ## diff -e /n/bootesdump/1991/0318/sys/src/9/port/devproc.c /n/bootesdump/1991/0411/sys/src/9/port/devproc.c 359c procwrite(Chan *c, void *va, long n, ulong offset) . 351c memmove(a, statbuf+offset, n); . 341,342c if(offset+n > sizeof statbuf) n = sizeof statbuf - offset; . 339c if(offset >= sizeof statbuf) . 333,335c if(offset+n > sizeof(Proc)) n = sizeof(Proc) - offset; memmove(a, ((char*)p)+offset, n); . 331c if(offset >= sizeof(Proc)) . 292,295c if(offset>=KZERO && offset KZERO+conf.npage0*BY2PG) n = KZERO+conf.npage0*BY2PG - offset; memmove(a, (char*)offset, n); . 286c memmove(a, b+(offset-USERADDR), n); . 278,280c if(offset>=USERADDR && offset USERADDR+BY2PG) n = USERADDR+BY2PG - offset; . 272c memmove(a, b+(offset&(BY2PG-1)), n); . 267c pprint("nonresident page addr %lux (complain to rob)\n", offset); . 255c pte = &o->pte[(offset-o->va)>>PGSHIFT]; . 251c if(seg(p, offset) != s){ . 239,241c if(((offset+n)&~(BY2PG-1)) != (offset&~(BY2PG-1))) n = BY2PG - (offset&(BY2PG-1)); s = seg(p, offset); . 209c procread(Chan *c, void *va, long n, ulong offset) . 149c qunlock(&tc->rdl); . 147c qlock(&tc->rdl); . ## diffname port/devproc.c 1991/0419 ## diff -e /n/bootesdump/1991/0411/sys/src/9/port/devproc.c /n/bootesdump/1991/0419/sys/src/9/port/devproc.c 103a Chan* procclwalk(Chan *c, char *name) { return devclwalk(c, name); } . ## diffname port/devproc.c 1991/0427 ## diff -e /n/bootesdump/1991/0419/sys/src/9/port/devproc.c /n/bootesdump/1991/0427/sys/src/9/port/devproc.c 104,109d ## diffname port/devproc.c 1991/0605 ## diff -e /n/bootesdump/1991/0427/sys/src/9/port/devproc.c /n/bootesdump/1991/0605/sys/src/9/port/devproc.c 146a . 144a . 137a . 134a . 133c if(o==0 || p->state==Dead) . ## diffname port/devproc.c 1991/0614 ## diff -e /n/bootesdump/1991/0605/sys/src/9/port/devproc.c /n/bootesdump/1991/0614/sys/src/9/port/devproc.c 431a poperror(); . 389a poperror(); . 330a poperror(); . ## diffname port/devproc.c 1991/0705 ## diff -e /n/bootesdump/1991/0614/sys/src/9/port/devproc.c /n/bootesdump/1991/0705/sys/src/9/port/devproc.c 410,411c if(n >= 4 && strncmp(va, "stop", 4) == 0) { p->procctl = Proc_stopme; break; } else if(n >= 5 && strncmp(va, "start", 5) == 0) { if(p->state == Stopped) { ready(p); break; } errors("not stopped"); } else if(n >= 4 && strncmp(va, "kill", 4) == 0) { p->procctl = Proc_exitme; break; } error(Ebadctl); . 407,408c if(n >= 4 && strncmp(va, "exit", 4) == 0) { if(p->state == Broken) { ready(p); break; } } . 357a case Qsegment: j = 0; for(i = 0; i < NSEG; i++) if(sg = p->seg[i]) j += sprint(&statbuf[j], "%-6s %c %.8lux %.8lux %4d\n", sname[sg->type&SG_TYPE], sg->type&SG_RONLY ? 'R' : ' ', sg->base, sg->top, sg->ref); if(offset >= j) return 0; if(offset+n > j) n = j-offset; memmove(a, &statbuf[offset], n); return n; . 278a qlock(&s->lk); s->steal--; qunlock(&s->lk); . 255,270c soff = offset-s->base; pte = s->map[soff/PTEMAPMEM]; pg = 0; if(pte) pg = pte->pages[(soff&(PTEMAPMEM-1))/BY2PG]; s->steal++; qunlock(&s->lk); if(pagedout(pg)){ . 250,253d 247,248c if(p->pid!=PID(c->qid)){ qunlock(&s->lk); . 245c s = seg(p, offset, 1); . 226a ulong soff; Segment *sg; . 222,223c int i, j; . 218,219c Pte *pte; Segment *s; . 216c char statbuf[NSEG*32]; . 156a case Qsegment: . 136c tc = s->image->c; . 132,133c s = p->seg[TSEG]; if(s==0 || p->state==Dead || s->image==0) . 115c Segment *s; . 68c path = c->qid.path&~(CHDIR|((1<qid.path, c->qid.vers}, . 50c ulong pid, path; . 30a char *sname[]={ /* Segment type from portdat.h */ "Text", "Data", "Bss", "Stack", "Shared", "Phys", }; . 26a "segment", {Qsegment}, 0, 0400, . 16a Qsegment, . ## diffname port/devproc.c 1991/0712 ## diff -e /n/bootesdump/1991/0705/sys/src/9/port/devproc.c /n/bootesdump/1991/0712/sys/src/9/port/devproc.c 361c readnum(0, statbuf+j+NUMSIZE*i, NUMSIZE, l, NUMSIZE); . 353,355c if(offset+n > STATSIZE) n = STATSIZE - offset; j = sprint(statbuf, "%-27s %-27s %-11s ", p->text, p->pgrp->user, statename[p->state]); . 351c if(offset >= STATSIZE) . 29c "status", {Qstatus}, STATSIZE, 0600, . 21a #define STATSIZE (2*NAMELEN+12+6*12) . ## diffname port/devproc.c 1991/0724 ## diff -e /n/bootesdump/1991/0712/sys/src/9/port/devproc.c /n/bootesdump/1991/0724/sys/src/9/port/devproc.c 276c pprint("nonresident page addr %lux (complain to philw)\n", offset); . ## diffname port/devproc.c 1991/0807 ## diff -e /n/bootesdump/1991/0724/sys/src/9/port/devproc.c /n/bootesdump/1991/0807/sys/src/9/port/devproc.c 30c "status", {Qstatus}, STATSIZE, 0400, . ## diffname port/devproc.c 1991/0926 ## diff -e /n/bootesdump/1991/0807/sys/src/9/port/devproc.c /n/bootesdump/1991/0926/sys/src/9/port/devproc.c 357c p->text, p->pgrp->user, p->psstate ? p->psstate : statename[p->state]); . ## diffname port/devproc.c 1991/1011 ## diff -e /n/bootesdump/1991/0926/sys/src/9/port/devproc.c /n/bootesdump/1991/1011/sys/src/9/port/devproc.c 113a if(name[0] == '.' && name[1] == '.' && name[2] == '\0') { c->qid.path = Qdir|CHDIR; return 1; } . ## diffname port/devproc.c 1991/1025 ## diff -e /n/bootesdump/1991/1011/sys/src/9/port/devproc.c /n/bootesdump/1991/1025/sys/src/9/port/devproc.c 315a if(offset>=KZERO && offset KZERO+conf.base1+conf.npage1*BY2PG) n = KZERO+conf.base1+conf.npage1*BY2PG - offset; memmove(a, (char*)offset, n); return n; } . ## diffname port/devproc.c 1991/1105 ## diff -e /n/bootesdump/1991/1025/sys/src/9/port/devproc.c /n/bootesdump/1991/1105/sys/src/9/port/devproc.c 369c p->text, p->user, p->psstate ? p->psstate : statename[p->state]); . ## diffname port/devproc.c 1991/1106 ## diff -e /n/bootesdump/1991/1105/sys/src/9/port/devproc.c /n/bootesdump/1991/1106/sys/src/9/port/devproc.c 114,115c if(strcmp(name, "..") == 0) { . ## diffname port/devproc.c 1991/1107 ## diff -e /n/bootesdump/1991/1106/sys/src/9/port/devproc.c /n/bootesdump/1991/1107/sys/src/9/port/devproc.c 171d 169d ## diffname port/devproc.c 1991/1108 ## diff -e /n/bootesdump/1991/1107/sys/src/9/port/devproc.c /n/bootesdump/1991/1108/sys/src/9/port/devproc.c 458a postnote(p, 0, "sys: killed", NExit); . ## diffname port/devproc.c 1991/1109 ## diff -e /n/bootesdump/1991/1108/sys/src/9/port/devproc.c /n/bootesdump/1991/1109/sys/src/9/port/devproc.c 487a return n; } Chan * procctlnotepg(Chan *c, void *va, int n) { Pgrp *pg; pg = pgrptab(c->pgrpid.path-1); qlock(&pg->debug); if(waserror()){ qunlock(&pg->debug); nexterror(); } if(pg->pgrpid != c->pgrpid.vers){ qunlock(&pg->debug); error(Eprocdied); } pgrpnote(pg, va, n, NUser); poperror(); qunlock(&pg->debug); } void procctlreq(Proc *p, char *va, int n) { if(n >= 4) { if(strncmp(va, "exit", 4) == 0) { if(p->state == Broken) ready(p); return; } if(strncmp(va, "stop", 4) == 0) { p->procctl = Proc_stopme; return; } if(strncmp(va, "kill", 4) == 0) { postnote(p, 0, "sys: killed", NExit); p->procctl = Proc_exitme; return; } } if(n >= 5 && strncmp(va, "start", 5) == 0) { if(p->state != Stopped) errors("not stopped"); ready(p); return; } error(Ebadctl); } int procctlmemio(Proc *p, ulong offset, int n, void *va, int read) { Pte **pte; Page *pg; KMap *k; Segment *ps, *s; ulong soff; int i; char *a = va, *b; s = seg(p, offset, 1); if(s == 0) errors("not in address space"); /* Revert a text segment to data */ if(read == 0 && (s->type&SG_TYPE) == SG_TEXT) { ps = newseg(SG_DATA, s->base, s->size); ps->image = s->image; incref(ps->image); ps->fstart = s->fstart; ps->flen = s->flen; for(i = 0; i < NSEG; i++) if(p->seg[i] == s) break; if(p->seg[i] != s) panic("segment gone"); qunlock(&s->lk); putseg(s); p->seg[i] = ps; } else qunlock(&s->lk); Again: s = seg(p, offset, 1); if(s == 0) errors("not in address space"); s->steal++; soff = offset-s->base; pte = &s->map[soff/PTEMAPMEM]; if(*pte == 0) { if(waserror()) { s->steal--; nexterror(); } if(fixfault(s, offset, read, 0) != 0) { s->steal--; poperror(); goto Again; } poperror(); if(*pte == 0) panic("procctlmemio"); } pg = (*pte)->pages[(soff&(PTEMAPMEM-1))/BY2PG]; if(pagedout(pg)) { if(waserror()) { s->steal--; nexterror(); } if(fixfault(s, offset, read, 0) != 0) { s->steal--; poperror(); goto Again; } poperror(); pg = (*pte)->pages[(soff&(PTEMAPMEM-1))/BY2PG]; if(pg == 0) panic("procctlmemio1"); } k = kmap(pg); b = (char*)VA(k); memmove(a, b+(offset&(BY2PG-1)), n); kunmap(k); s->steal--; qunlock(&s->lk); . 438,463c procctlreq(p, va, n); return n; . 436a case Qmem: return procctlmemio(p, offset, n, va, 0); . 433d 411,423c procctlnotepg(c, va, n); . 407,409c /* Use the remembered pgrp id in the channel rather than the process pgrpid */ . 398d 321a return procctlmemio(p, offset, n, va, 1); . 319,320d 313c if(offset >= KZERO && offset < KZERO+conf.base1+conf.npage1*BY2PG){ . 306,307c if(offset >= KZERO && offset < KZERO+conf.npage0*BY2PG){ . 270,293c if(offset >= USERADDR && offset < USERADDR+BY2PG) { . 263,268d 249,251d 243d 235,236d 221c Proc *p; Dir d; convM2D(db, &d); p = proctab(SLOT(c->qid)); if(p->pid != PID(c->qid)) error(Eprocdied); if(strcmp(u->p->user, p->user) != 0 && strcmp(u->p->user, eve) != 0) error(Eperm); p->procmode = d.mode&0777; . 81,82c p = proctab(SLOT(c->qid)); perm = tab->perm; if(perm == 0) perm = p->procmode; devdir(c, (Qid){path|tab->qid.path, c->qid.vers}, tab->name, tab->length, p->user, perm, dp); . 72c devdir(c, (Qid){CHDIR|((s+1)<user, CHDIR|0500, dp); . 62c ulong pid, path, perm; . 56a void procctlreq(Proc*, char*, int); int procctlmemio(Proc*, ulong, int, void*, int); Chan *procctlnotepg(Chan*, void *va, int n); . 34,41c /* Segment type from portdat.h */ char *sname[]={ "Text", "Data", "Bss", "Stack", "Shared", "Phys" }; . 31c "text", {Qtext}, 0, 0000, . 28c "proc", {Qproc}, sizeof(Proc), 0000, . 24,26c "ctl", {Qctl}, 0, 0000, "mem", {Qmem}, 0, 0000, "note", {Qnote}, 0, 0000, . 6a #include "fcall.h" . ## diffname port/devproc.c 1991/1110 ## diff -e /n/bootesdump/1991/1109/sys/src/9/port/devproc.c /n/bootesdump/1991/1110/sys/src/9/port/devproc.c 565a } Segment * txt2data(Proc *p, Segment *s) { Segment *ps; int i; ps = newseg(SG_DATA, s->base, s->size); ps->image = s->image; incref(ps->image); ps->fstart = s->fstart; ps->flen = s->flen; ps->flushme = 1; for(i = 0; i < NSEG; i++) if(p->seg[i] == s) break; if(p->seg[i] != s) panic("segment gone"); qunlock(&s->lk); putseg(s); qlock(&ps->lk); p->seg[i] = ps; return ps; . 564a if(read == 0) p->newtlb = 1; . 560c if(read == 1) memmove(a, b+(offset&(BY2PG-1)), n); else memmove(b+(offset&(BY2PG-1)), a, n); . 512,523d 506,510c if(read == 0 && (s->type&SG_TYPE) == SG_TEXT) s = txt2data(p, s); . 498,504c if(offset+n >= s->top) n = s->top-offset; . 493a Again: . 491d 489c Segment *s; . 483a procstopped(void *a) { Proc *p = a; return p->state == Stopped; } int . 479a . 473a if(n >= 8 && strncmp(va, "waitstop", 8) == 0) { procstopwait(p, 0); return; } if(n >= 9 && strncmp(va, "startstop", 9) == 0) { if(p->state != Stopped) errors("not stopped"); p->procctl = Proc_traceme; ready(p); procstopwait(p, Proc_traceme); return; } . 471a if(strncmp(va, "hang", 4) == 0) { p->hang = 1; return; } . 464c procstopwait(p, Proc_stopme); . 454a procstopwait(Proc *p, int ctl) { int pid; if(p->pdbg) errors("debugged already"); if(procstopped(p)) return; if(ctl != 0) p->procctl = ctl; p->pdbg = u->p; pid = p->pid; unlock(&p->debug); u->p->psstate = "Stopwait"; if(waserror()) { p->pdbg = 0; lock(&p->debug); nexterror(); } sleep(&u->p->sleep, procstopped, p); poperror(); lock(&p->debug); if(p->pid != pid) error(Eprocdied); } void . 434a proctext(Chan *c, Proc *p) { Chan *tc; Image *i; Segment *s; s = p->seg[TSEG]; if(s==0 || p->state==Dead) error(Eprocdied); lock(s); i = s->image; if(i == 0) { unlock(s); error(Eprocdied); } unlock(s); lock(i); if(waserror()) { unlock(i); nexterror(); } tc = i->c; if(tc == 0) error(Eprocdied); if(incref(tc) == 1 || (tc->flag&COPEN) == 0 || tc->mode!=OREAD) { close(tc); error(Eprocdied); } if(p->pid != PID(c->qid)) error(Eprocdied); unlock(i); poperror(); return tc; } Chan * . 424a . 406c break; . 403c if(p->state != Stopped) errors("not stopped"); if(offset >= USERADDR && offset < USERADDR+BY2PG) { pg = p->upage; if(pg==0 || p->pid!=PID(c->qid)) error(Eprocdied); k = kmap(pg); b = (char*)VA(k); pxu = (User*)b; if(offset < (ulong)pxu->dbgreg || offset+n >= (ulong)pxu->dbgreg+sizeof(Ureg)) { kunmap(k); errors("bad u-area address"); } ur = (Ureg*)(b+((ulong)pxu->dbgreg-USERADDR)); setregisters(ur, (char*)pxu+(offset-USERADDR), a, n); kunmap(k); } else n = procctlmemio(p, offset, n, va, 0); break; . 380a Ureg *ur; User *pxu; Page *pg; char *a = va, *b; . 355a . 293,299d 286,290c if(offset >= KZERO) { if(offset < KZERO+conf.npage0*BY2PG){ if(offset+n > KZERO+conf.npage0*BY2PG) n = KZERO+conf.npage0*BY2PG - offset; memmove(a, (char*)offset, n); return n; } if(offset < KZERO+conf.base1+conf.npage1*BY2PG){ if(offset+n > KZERO+conf.base1+conf.npage1*BY2PG) n = KZERO+conf.base1+conf.npage1*BY2PG - offset; memmove(a, (char*)offset, n); return n; } . 267,272d 198,200c /* Affix pid to qid */ . 188d 176a case Qmem: . 174a . 173a . 154,172c tc = proctext(c, p); . 149a . 148d 54c Chan *procctlnotepg(Chan*, void*, int); Chan *proctext(Chan*, Proc*); Segment *txt2data(Proc*, Segment*); int procstopped(void*); . 7a #include "ureg.h" . ## diffname port/devproc.c 1991/1111 ## diff -e /n/bootesdump/1991/1110/sys/src/9/port/devproc.c /n/bootesdump/1991/1111/sys/src/9/port/devproc.c 408c else /* Try user memory segments */ . 404,405c ur = (Ureg*)(b+((ulong)ur-USERADDR)); setregisters(ur, b+(offset-USERADDR), a, n); . 400c hi = offset+n; /* Check for floating point registers */ if(offset >= (ulong)&u->fpsave && hi <= (ulong)&u->fpsave+sizeof(FPsave)){ memmove(b+(offset-USERADDR), a, n); break; } /* Check user register set for process at kernel entry */ ur = pxu->dbgreg; if(offset < (ulong)ur || hi > (ulong)ur+sizeof(Ureg)) { . 367a ulong hi; . 308a if(up->nnote == 0) p->notepending = 0; . ## diffname port/devproc.c 1991/1112 ## diff -e /n/bootesdump/1991/1111/sys/src/9/port/devproc.c /n/bootesdump/1991/1112/sys/src/9/port/devproc.c 589,590c else error(Ebadctl); . 587d 583c else if(strncmp(buf, "start", 5) == 0) { . 581d 574,575c else if(strncmp(buf, "stop", 4) == 0) procstopwait(p, Proc_stopme); else if(strncmp(buf, "kill", 4) == 0) { if(p->state == Stopped) ready(p); postnote(p, 0, "sys: killed", NExit); p->procctl = Proc_exitme; } else if(strncmp(buf, "hang", 4) == 0) p->hang = 1; else if(strncmp(buf, "waitstop", 8) == 0) procstopwait(p, 0); else if(strncmp(buf, "startstop", 9) == 0) { . 570,572c if(n > NAMELEN) n = NAMELEN; strncpy(buf, va, n); if(strncmp(buf, "exit", 4) == 0) { if(p->state == Broken) ready(p); . 549,568c char buf[NAMELEN]; . 463c if(s == 0) errors("no text segment"); if(p->state==Dead) . 427a if(p->kp) errors("can' t note kproc"); . 351a if(n == 0 && offset == 0) errors("no segments"); . 214a if(c->qid.path&CHDIR) error(Eperm); . 190,194c return devopen(c, omode, 0, 0, procgen); ; . 175,181d 166a case Qproc: case Qstatus: . 157a if(omode != OREAD) error(Eperm); . 144,148c if(c->qid.path & CHDIR) return devopen(c, omode, 0, 0, procgen); . 75c devdir(c, (Qid){CHDIR|((s+1)<user, CHDIR|0555, dp); . 31,32c "segment", {Qsegment}, 0, 0444, "status", {Qstatus}, STATSIZE, 0444, . 29c "notepg", {Qnotepg}, 0, 0000, . ## diffname port/devproc.c 1991/1113 ## diff -e /n/bootesdump/1991/1112/sys/src/9/port/devproc.c /n/bootesdump/1991/1113/sys/src/9/port/devproc.c 634,650c poperror(); pte = s->map[soff/PTEMAPMEM]; if(pte == 0) panic("procctlmemio"); pg = pte->pages[(soff&(PTEMAPMEM-1))/BY2PG]; if(pagedout(pg)) panic("procctlmemio1"); . 631,632c s->steal--; . 625,629c if(fixfault(s, offset, read, 0) == 0) break; . 617,620c s->steal++; soff = offset-s->base; . 614,615c if((s->type&SG_TYPE) == SG_TEXT) s = txt2data(p, s); . 611,612c if(offset+n >= s->top) n = s->top-offset; . 606,609c for(;;) { s = seg(p, offset, 1); if(s == 0) errors("not in address space"); . 599c Pte *pte; . 109d ## diffname port/devproc.c 1991/1115 ## diff -e /n/bootesdump/1991/1113/sys/src/9/port/devproc.c /n/bootesdump/1991/1115/sys/src/9/port/devproc.c 223a USED(c); . 197a USED(c); . 191a USED(c, name, omode, perm); . ## diffname port/devproc.c 1991/1116 ## diff -e /n/bootesdump/1991/1115/sys/src/9/port/devproc.c /n/bootesdump/1991/1116/sys/src/9/port/devproc.c 429c errors("can't note kproc"); . ## diffname port/devproc.c 1991/1117 ## diff -e /n/bootesdump/1991/1116/sys/src/9/port/devproc.c /n/bootesdump/1991/1117/sys/src/9/port/devproc.c 568,569c else{ if(p->state == Stopped) ready(p); postnote(p, 0, "sys: killed", NExit); p->procctl = Proc_exitme; } . 566c if(p->state == Broken) . 559,563c if(strncmp(buf, "stop", 4) == 0) . ## diffname port/devproc.c 1991/1124 ## diff -e /n/bootesdump/1991/1117/sys/src/9/port/devproc.c /n/bootesdump/1991/1124/sys/src/9/port/devproc.c 396c if(offset >= USERADDR && offset <= USERADDR+BY2PG-1) { . 252,253c /* ugly math: USERADDR+BY2PG may be == 0 */ if(offset >= USERADDR && offset <= USERADDR+BY2PG-1) { if(offset+n >= USERADDR+BY2PG-1) . ## diffname port/devproc.c 1991/1216 ## diff -e /n/bootesdump/1991/1124/sys/src/9/port/devproc.c /n/bootesdump/1991/1216/sys/src/9/port/devproc.c 546c qlock(&p->debug); . 541c qlock(&p->debug); . 537c qunlock(&p->debug); . 454c qunlock(&p->debug); . 386c qunlock(&p->debug); . 384c qlock(&p->debug); . 312c qunlock(&p->debug); . 286c qunlock(&p->debug); . 284c qlock(&p->debug); . ## diffname port/devproc.c 1991/1231 ## diff -e /n/bootesdump/1991/1216/sys/src/9/port/devproc.c /n/bootesdump/1991/1231/sys/src/9/port/devproc.c 441,442d ## diffname port/devproc.c 1992/0111 ## diff -e /n/bootesdump/1991/1231/sys/src/9/port/devproc.c /n/bootesdump/1992/0111/sys/src/9/port/devproc.c 6c #include "../port/error.h" . ## diffname port/devproc.c 1992/0114 ## diff -e /n/bootesdump/1992/0111/sys/src/9/port/devproc.c /n/bootesdump/1992/0114/sys/src/9/port/devproc.c 610c error(Ebadarg); . 583c error(Ebadctl); . 576c error(Ebadctl); . 527c error(Einuse); . 465c error(Enonexist); . 444c exhausted("notes"); . 430c error(Eperm); . 414c error(Ebadarg); . 395c error(Ebadctl); . 352c exhausted("segments"); . 177c pprint("procopen %lux\n", c->qid); . ## diffname port/devproc.c 1992/0128 ## diff -e /n/bootesdump/1992/0114/sys/src/9/port/devproc.c /n/bootesdump/1992/0128/sys/src/9/port/devproc.c 266a /* prevent users reading authentication crypt keys */ if(offset >= pgrpalloc.cryptbase) if(offset < pgrpalloc.crypttop) error(Eperm); /* validate physical kernel addresses */ . ## diffname port/devproc.c 1992/0321 ## diff -e /n/bootesdump/1992/0128/sys/src/9/port/devproc.c /n/bootesdump/1992/0321/sys/src/9/port/devproc.c 2c #include "../port/lib.h" . ## diffname port/devproc.c 1992/0328 ## diff -e /n/bootesdump/1992/0321/sys/src/9/port/devproc.c /n/bootesdump/1992/0328/sys/src/9/port/devproc.c 332a if((p->state < Dead) || (p->state > Rendezvous)) panic("p->state=#%lux, p->psstate=#%lux\n", p->state, p->psstate); . ## diffname port/devproc.c 1992/0423 ## diff -e /n/bootesdump/1992/0328/sys/src/9/port/devproc.c /n/bootesdump/1992/0423/sys/src/9/port/devproc.c 643c l = BY2PG - (offset&(BY2PG-1)); if(n > l) n = l; . 611c ulong soff, l; . 334c panic("p->state=#%lux, p->psstate=#%lux\n", p->state, p->psstate); . 332a /* Assertion for deref of psstate which causes faults */ . ## diffname port/devproc.c 1992/0428 ## diff -e /n/bootesdump/1992/0423/sys/src/9/port/devproc.c /n/bootesdump/1992/0428/sys/src/9/port/devproc.c 510,529d 389,391c /* Use the remembered noteid in the channel rather than the process pgrpid */ if(QID(c->qid) == Qnotepg) { pgrpnote(NOTEID(c->pgrpid), va, n, NUser); . 174c c->pgrpid.vers = p->noteid; . 55d 52a #define QID(q) (((q).path&0x0000000F)>>0) #define SLOT(q) ((((q).path&0x07FFFFFF0)>>QSHIFT)-1) #define PID(q) ((q).vers) #define NOTEID(q) ((q).vers) . 49,51d 45c * If notepg, c->pgrpid.path is pgrp slot, .vers is noteid. . ## diffname port/devproc.c 1992/0430 ## diff -e /n/bootesdump/1992/0428/sys/src/9/port/devproc.c /n/bootesdump/1992/0430/sys/src/9/port/devproc.c 37c char *sname[]={ "Text", "Data", "Bss", "Stack", "Shared", "Phys", "Shdata" }; . ## diffname port/devproc.c 1992/0520 ## diff -e /n/bootesdump/1992/0430/sys/src/9/port/devproc.c /n/bootesdump/1992/0520/sys/src/9/port/devproc.c 368a return 0; /* not reached */ . ## diffname port/devproc.c 1992/0527 ## diff -e /n/bootesdump/1992/0520/sys/src/9/port/devproc.c /n/bootesdump/1992/0527/sys/src/9/port/devproc.c 457c error("note not posted"); . ## diffname port/devproc.c 1992/0611 ## diff -e /n/bootesdump/1992/0527/sys/src/9/port/devproc.c /n/bootesdump/1992/0611/sys/src/9/port/devproc.c 187d ## diffname port/devproc.c 1992/0619 ## diff -e /n/bootesdump/1992/0611/sys/src/9/port/devproc.c /n/bootesdump/1992/0619/sys/src/9/port/devproc.c 267,270d 7d ## diffname port/devproc.c 1992/0628 ## diff -e /n/bootesdump/1992/0619/sys/src/9/port/devproc.c /n/bootesdump/1992/0628/sys/src/9/port/devproc.c 273,275c if(offset >= conf.base0 && offset < conf.npage0){ if(offset+n > conf.npage0) n = conf.npage0 - offset; memmove(a, (char*)offset, n); return n; } if(offset >= conf.base1 && offset < conf.npage1){ if(offset+n > conf.npage1) n = conf.npage1 - offset; . 267,269c if(offset < (ulong)end) { if(offset+n > (ulong)end) n = (ulong)end - offset; . ## diffname port/devproc.c 1992/0711 ## diff -e /n/bootesdump/1992/0628/sys/src/9/port/devproc.c /n/bootesdump/1992/0711/sys/src/9/port/devproc.c 238d 140d 66a USED(ntab); . ## diffname port/devproc.c 1992/0814 ## diff -e /n/bootesdump/1992/0711/sys/src/9/port/devproc.c /n/bootesdump/1992/0814/sys/src/9/port/devproc.c 347a /* ignore stack, which is mostly non-existent */ l = 0; for(i=1; iseg[i]; if(s) l += s->top - s->base; } readnum(0, statbuf+j+NUMSIZE*6, NUMSIZE, l>>10, NUMSIZE); . 235a Segment *s; . 23c #define STATSIZE (2*NAMELEN+12+7*12) . ## diffname port/devproc.c 1992/0824 ## diff -e /n/bootesdump/1992/0814/sys/src/9/port/devproc.c /n/bootesdump/1992/0824/sys/src/9/port/devproc.c 664a Segment *ps; . 663d 603d 600a KMap *k; . 427c if(offset >= (ulong)&u->fpsave && hi <= (ulong)&u->fpsave+sizeof(FPsave)){ . 335,339d 265a /* Protect crypt key memory */ if(offset >= palloc.cmembase && offset < palloc.cmemtop) error(Eperm); . 175a . 173c c->pgrpid.path = pg->pgrpid+1; . 171c if(omode!=OWRITE || pg->pgrpid == 1) . 159d 91c qid = (Qid){path|tab->qid.path, c->qid.vers}; devdir(c, qid, tab->name, tab->length, p->user, perm, dp); . 82a . 76c qid = (Qid){CHDIR|((s+1)<user, CHDIR|0555, dp); . 62a Qid qid; . 56,57c Chan* proctext(Chan*, Proc*); Segment* txt2data(Proc*, Segment*); . 24c Dirtab procdir[] = { . ## diffname port/devproc.c 1992/0907 ## diff -e /n/bootesdump/1992/0824/sys/src/9/port/devproc.c /n/bootesdump/1992/0907/sys/src/9/port/devproc.c 344,346c sps = p->psstate; if(sps == 0) sps = statename[p->state]; j = sprint(statbuf, "%-27s %-27s %-11s ", p->text, p->user, sps); for(i = 0; i < 6; i++) { . 236c char *a = va, *b, *sps; . ## diffname port/devproc.c 1992/1103 ## diff -e /n/bootesdump/1992/0907/sys/src/9/port/devproc.c /n/bootesdump/1992/1103/sys/src/9/port/devproc.c 347c memset(statbuf, ' ', sizeof statbuf); memmove(statbuf+0*NAMELEN, p->text, strlen(p->text)); memmove(statbuf+1*NAMELEN, p->user, strlen(p->user)); memmove(statbuf+2*NAMELEN, sps, strlen(sps)); j = 2*NAMELEN + 12; . ## diffname port/devproc.c 1992/1104 ## diff -e /n/bootesdump/1992/1103/sys/src/9/port/devproc.c /n/bootesdump/1992/1104/sys/src/9/port/devproc.c 694a return ps; } Segment* data2txt(Segment *s) { Segment *ps; ps = newseg(SG_TEXT, s->base, s->size); ps->image = s->image; incref(ps->image); ps->fstart = s->fstart; ps->flen = s->flen; ps->flushme = 1; . 672c Segment* . ## diffname port/devproc.c 1992/1118 ## diff -e /n/bootesdump/1992/1104/sys/src/9/port/devproc.c /n/bootesdump/1992/1118/sys/src/9/port/devproc.c 576c else { . ## diffname port/devproc.c 1992/1206 ## diff -e /n/bootesdump/1992/1118/sys/src/9/port/devproc.c /n/bootesdump/1992/1206/sys/src/9/port/devproc.c 576,578c break; default: . 574c switch(p->state) { case Broken: unbreak(p); break; case Stopped: postnote(p, 0, "sys: killed", NExit); p->procctl = Proc_exitme; . ## diffname port/devproc.c 1993/0122 ## diff -e /n/bootesdump/1992/1206/sys/src/9/port/devproc.c /n/bootesdump/1993/0122/sys/src/9/port/devproc.c 272c if(offset < palloc.cmemtop && offset+n > palloc.cmembase) . ## diffname port/devproc.c 1993/0309 ## diff -e /n/bootesdump/1993/0122/sys/src/9/port/devproc.c /n/bootesdump/1993/0309/sys/src/9/port/devproc.c 385a case Qwait: if(n < sizeof(Waitmsg)) error(Etoosmall); if(!canqlock(&p->qwaitr)) error(Einuse); if(waserror()) { qunlock(&p->qwaitr); nexterror(); } lock(&p->exl); while(p->waitq == 0) { unlock(&p->exl); sleep(&p->waitr, haswaitq, p); lock(&p->exl); } wq = p->waitq; p->waitq = wq->next; p->nwait--; unlock(&p->exl); qunlock(&p->qwaitr); poperror(); memmove(a, &wq->w, sizeof(Waitmsg)); free(wq); return sizeof(Waitmsg); . 245a Waitq *wq; . 171a case Qwait: . 160,161d 33a "wait", {Qwait}, 0, 0400, . 20a Qwait, . ## diffname port/devproc.c 1993/0311 ## diff -e /n/bootesdump/1993/0309/sys/src/9/port/devproc.c /n/bootesdump/1993/0311/sys/src/9/port/devproc.c 401a if(u->p == p && p->nchild == 0 && p->waitq == 0) { unlock(&p->exl); error(Enochild); } . 98c devdir(c, qid, tab->name, len, p->user, perm, dp); . 96a len = tab->length; if(QID(c->qid) == Qwait) len = p->nwait * sizeof(Waitmsg); . 69c ulong pid, path, perm, len; . ## diffname port/devproc.c 1993/0318 ## diff -e /n/bootesdump/1993/0311/sys/src/9/port/devproc.c /n/bootesdump/1993/0318/sys/src/9/port/devproc.c 628a else if(strncmp(buf, "nohang", 6) == 0) p->hang = 0; . ## diffname port/devproc.c 1993/0404 ## diff -e /n/bootesdump/1993/0318/sys/src/9/port/devproc.c /n/bootesdump/1993/0404/sys/src/9/port/devproc.c 674c if(read == 0 && (s->type&SG_TYPE) == SG_TEXT) . ## diffname port/devproc.c 1993/0501 ## diff -e /n/bootesdump/1993/0404/sys/src/9/port/devproc.c /n/fornaxdump/1993/0501/sys/src/brazil/port/devproc.c 674c if((s->type&SG_TYPE) == SG_TEXT) . 640c else if(strncmp(buf, "start", 5) == 0) { . 633c else if(strncmp(buf, "startstop", 9) == 0) { . 631c else if(strncmp(buf, "waitstop", 8) == 0) . 629c else if(strncmp(buf, "nohang", 6) == 0) . 627c else if(strncmp(buf, "hang", 4) == 0) . 612c else if(strncmp(buf, "kill", 4) == 0) { . 594c sleep(&up->sleep, procstopped, p); . 588c up->psstate = "Stopwait"; . 585c p->pdbg = up; . 503,510d 468,493c n = procctlmemio(p, offset, n, va, 0); . 449c /* Use the remembered noteid in the channel rather * than the process pgrpid */ . 438,442d 435,436d 430a pg = up->pgrp; rlock(&pg->ns); nxt = 0; last = 0; bestmid = ~0; if(mw->mh) last = mw->cm->mountid; he = &pg->mnthash[MNTHASH]; for(h = pg->mnthash; h < he; h++) { for(f = *h; f; f = f->hash) { for(t = f->mount; t; t = t->next) { if(mw->mh == 0 || (t->mountid > last && t->mountid < bestmid)) { mw->cm = t; mw->mh = f; bestmid = mw->cm->mountid; nxt = 1; } } } } if(nxt == 0) mw->mh = 0; runlock(&pg->ns); } . 429a void mntscan(Mntwalk *mw) { Pgrp *pg; Mount *t; int nxt; ulong last, bestmid; Mhead **h, **he, *f; . 424a case Qns: mw = c->aux; mntscan(mw); if(mw->mh == 0) return 0; if(n < NAMELEN+11) error(Etoosmall); i = sprint(a, "%s %d ", mw->cm->spec, mw->cm->flag); n -= i; a += i; i = ptpath(mw->mh->from->path, a, n); n -= i; a += i; if(n > 0) { *a++ = ' '; n--; } a += ptpath(mw->cm->to->path, a, n); return a - (char*)va; . 406c if(up == p && p->nchild == 0 && p->waitq == 0) { . 331d 329c if(p->nnote == 0) . 323,326c else { memmove(va, p->note[0].msg, ERRLEN); p->nnote--; memmove(p->note, p->note+1, p->nnote*sizeof(Note)); . 321c if(p->nnote == 0) . 312,318d 278c if(offset >= palloc.cmembase&&offset < palloc.cmemtop) . 262,275d 251a Mntwalk *mw; Segment *sg, *s; char *a = va, *sps; char statbuf[NSEG*32]; . 248,250d 244,246d 241,242c long l; . 235c if(QID(c->qid) == Qns) free(c->aux); . 226c if(strcmp(up->user, p->user) != 0 && strcmp(up->user, eve) != 0) . 178a case Qns: c->aux = malloc(sizeof(Mntwalk)); break; . 165a if(omode != OREAD) error(Eperm); . 61a void mntscan(Mntwalk*); . 35a "ns", {Qns}, 0, 0400, . 21a Qns, . 11c enum { . ## diffname port/devproc.c 1993/0818 ## diff -e /n/fornaxdump/1993/0501/sys/src/brazil/port/devproc.c /n/fornaxdump/1993/0818/sys/src/brazil/port/devproc.c 506a break; case Qregs: if(offset >= sizeof(Ureg)) return 0; if(offset+n > sizeof(Ureg)) n = sizeof(Ureg) - offset; setregisters(p->dbgreg, (char*)(p->dbgreg)+offset, va, n); break; case Qfpregs: if(offset >= sizeof(FPsave)) return 0; if(offset+n > sizeof(FPsave)) n = sizeof(FPsave) - offset; memmove((uchar*)&p->fpsave+offset, va, n); . 369a } . 365,368c for(i = 0; i < NSEG; i++) { sg = p->seg[i]; if(sg == 0) continue; j += sprint(&statbuf[j], "%-6s %c %.8lux %.8lux %4d\n", sname[sg->type&SG_TYPE], sg->type&SG_RONLY ? 'R' : ' ', . 325,327c if(offset+n > rsize) n = rsize - offset; memmove(a, rptr+offset, n); . 322,323c case Qregs: rptr = (uchar*)p->dbgreg; rsize = sizeof(Ureg); goto regread; case Qkregs: memset(&kur, 0, sizeof(Ureg)); kur.pc = p->sched.pc; kur.sp = p->sched.sp; rptr = (uchar*)&kur; rsize = sizeof(Ureg); goto regread; case Qfpregs: rptr = (uchar*)&p->fpsave; rsize = sizeof(FPsave); regread: if(offset >= rsize) . 296,297d 294a if(offset >= conf.base0 && offset < conf.npage0){ if(offset+n > conf.npage0) n = conf.npage0 - offset; memmove(a, (char*)offset, n); break; } if(offset >= conf.base1 && offset < conf.npage1){ if(offset+n > conf.npage1) n = conf.npage1 - offset; memmove(a, (char*)offset, n); break; } error(Ebadarg); . 275,293c /* Protect crypt key memory */ if(offset >= palloc.cmembase&&offset < palloc.cmemtop) error(Eperm); /* validate physical kernel addresses */ if(offset < (ulong)end) { if(offset+n > (ulong)end) n = (ulong)end - offset; memmove(a, (char*)offset, n); break; . 270,273c if(offset < KZERO) return procctlmemio(p, offset, n, va, 1); . 256a int i, j, rsize; . 255a Ureg kur; uchar *rptr; . 254d 185a if(omode != OREAD) error(Eperm); . 182a case Qregs: case Qfpregs: . 179,180d 175a case Qkregs: case Qsegment: if(omode != OREAD) error(Eperm); break; . 38d 33c "ns", {Qns}, 0, 0400, "regs", {Qregs}, sizeof(Ureg), 0000, . 29a "fpregs", {Qfpregs}, sizeof(FPsave), 0000, "kregs", {Qkregs}, sizeof(Ureg), 0000, . 23d 18c Qns, Qregs, . 14a Qdir, Qfpregs, Qkregs, . 13d ## diffname port/devproc.c 1993/0828 ## diff -e /n/fornaxdump/1993/0818/sys/src/brazil/port/devproc.c /n/fornaxdump/1993/0828/sys/src/brazil/port/devproc.c 334a case Qproc: return readnum(offset, va, n, (ulong)p, NUMSIZE); . 179a case Qproc: { Segment *sg; int i, j; Page **src; Pte *old; for(i = 0; i < MAXMACH; i++) print("%d ", p->pidonmach[i]); print("\n"); for(i = 0; i < NSEG; i++) { sg = p->seg[i]; if(sg == 0) continue; print("%-6s %c %.8lux %.8lux %4d\n", sname[sg->type&SG_TYPE], sg->type&SG_RONLY ? 'R' : ' ', sg->base, sg->top, sg->ref); for(j = 0; j < SEGMAPSIZE; j++) { old = sg->map[j]; if(old == 0) continue; print("\t%d: %lux\n", j, old); for(src = old->first; src <= old->last; src++) { if(*src == 0) continue; print("\t\t%lux %lux\n", (*src)->va, (*src)->pa); } prflush(); } } } . 37a "proc", {Qproc}, 0, 0400, . 20a Qproc, . ## diffname port/devproc.c 1993/0902 ## diff -e /n/fornaxdump/1993/0828/sys/src/brazil/port/devproc.c /n/fornaxdump/1993/0902/sys/src/brazil/port/devproc.c 183,214d ## diffname port/devproc.c 1993/0908 ## diff -e /n/fornaxdump/1993/0902/sys/src/brazil/port/devproc.c /n/fornaxdump/1993/0908/sys/src/brazil/port/devproc.c 351a kur.r31 = (ulong)sched; . 311c return n; . 305c return n; . 299c return n; . ## diffname port/devproc.c 1993/1013 ## diff -e /n/fornaxdump/1993/0908/sys/src/brazil/port/devproc.c /n/fornaxdump/1993/1013/sys/src/brazil/port/devproc.c 260c if(QID(c->qid) == Qns && c->aux != 0) . 253a convM2D(db, &d); . 246d ## diffname port/devproc.c 1993/1018 ## diff -e /n/fornaxdump/1993/1013/sys/src/brazil/port/devproc.c /n/fornaxdump/1993/1018/sys/src/brazil/port/devproc.c 581c case Qnoteid: id = atoi((char*)va); if(id == p->pid) { p->noteid = id; break; } t = proctab(0); for(et = t+conf.nproc; t < et; t++) { if(id == t->noteid) { if(strcmp(p->user, t->user) != 0) error(Eperm); p->noteid = id; break; } } if(p->noteid != id) error(Ebadarg); break; . 519c int id; Proc *p, *t, *et; . 472a case Qnoteid: return readnum(offset, va, n, p->noteid, NUMSIZE); . 190a case Qnoteid: . 36a "noteid", {Qnoteid}, 0, 0666, . 18a Qnoteid, . ## diffname port/devproc.c 1993/1022 ## diff -e /n/fornaxdump/1993/1018/sys/src/brazil/port/devproc.c /n/fornaxdump/1993/1022/sys/src/brazil/port/devproc.c 353,355c setkernur(&kur, p); . ## diffname port/devproc.c 1993/1031 ## diff -e /n/fornaxdump/1993/1022/sys/src/brazil/port/devproc.c /n/fornaxdump/1993/1031/sys/src/brazil/port/devproc.c 586c id = atoi(a); . 525a a = va; . 524c char *a, buf[ERRLEN]; . 1c #include "u.h" . ## diffname port/devproc.c 1993/1201 ## diff -e /n/fornaxdump/1993/1031/sys/src/brazil/port/devproc.c /n/fornaxdump/1993/1201/sys/src/brazil/port/devproc.c 848a } static char *counter[Pcounter]; int ncounter; int proccounter(char *name) { if(ncounter >= Pcounter) panic("too many process counters"); counter[ncounter] = name; return ncounter++; } ulong readcounters(Proc *p, ulong offset, void *va, int n) { char *bp; int i, j, m; extern char *sysctab[]; bp = smalloc((NSYSCALL+ncounter)*(NAMELEN+8)); m = 0; for(i = 0; i < Pcounter; i++) if(counter[i]) m += sprint(bp+m, "%s\t%8d\n", counter[i], p->counter[i]); j = 0; for(i = 0; i < NSYSCALL; i++) j += p->syscall[i]; m += sprint(bp+m, "syscall\t%8d\n", j); for(i = 0; i < NSYSCALL; i++) if(p->syscall[i]) m += sprint(bp+m, "%s\t%8d\n", sysctab[i], p->syscall[i]); n = readstr(offset, va, n, bp); free(bp); memset(p->counter, 0, sizeof(p->counter)); memset(p->syscall, 0, sizeof(p->syscall)); return n; . 368a case Qcounters: return readcounters(p, offset, va, n); . 343d 190a case Qcounters: . 120a /* standard counters - this ordering is important */ proccounter("sched"); proccounter("fault"); proccounter("tlbmiss"); . 73a ulong readcounters(Proc*, ulong, void*, int); . 32a "counters", {Qcounters}, 0, 0444, . 25a Qcounters, . ## diffname port/devproc.c 1993/1202 ## diff -e /n/fornaxdump/1993/1201/sys/src/brazil/port/devproc.c /n/fornaxdump/1993/1202/sys/src/brazil/port/devproc.c 154c c->qid.path = CHDIR; . ## diffname port/devproc.c 1993/1204 ## diff -e /n/fornaxdump/1993/1202/sys/src/brazil/port/devproc.c /n/fornaxdump/1993/1204/sys/src/brazil/port/devproc.c 745a } else if(strncmp(buf, "cpu ", 4) == 0) { i = strtoul(buf+4, 0, 0); if(i < 0 || i >= conf.nmach) error(Ebadctl); p->mp = MACHP(i); . 699a int i; . ## diffname port/devproc.c 1993/1212 ## diff -e /n/fornaxdump/1993/1204/sys/src/brazil/port/devproc.c /n/fornaxdump/1993/1212/sys/src/brazil/port/devproc.c 747,753d 701a extern int pfthreshold; . 700d ## diffname port/devproc.c 1993/1218 ## diff -e /n/fornaxdump/1993/1212/sys/src/brazil/port/devproc.c /n/fornaxdump/1993/1218/sys/src/brazil/port/devproc.c 816a qunlock(&s->lk); . 813d 811a /* Ensure the process sees text page changes */ if(s->flushme) memset(pg->cachectl, PG_TXTFLUSH, sizeof(pg->cachectl)); . ## diffname port/devproc.c 1994/0101 ## diff -e /n/fornaxdump/1993/1218/sys/src/brazil/port/devproc.c /n/fornaxdump/1994/0101/sys/src/brazil/port/devproc.c 821,822d ## diffname port/devproc.c 1994/0107 ## diff -e /n/fornaxdump/1994/0101/sys/src/brazil/port/devproc.c /n/fornaxdump/1994/0107/sys/src/brazil/port/devproc.c 1c #include "u.h" . ## diffname port/devproc.c 1994/0215 ## diff -e /n/fornaxdump/1994/0107/sys/src/brazil/port/devproc.c /n/fornaxdump/1994/0215/sys/src/brazil/port/devproc.c 37c "kregs", {Qkregs}, sizeof(Ureg), 0400, . ## diffname port/devproc.c 1994/0219 ## diff -e /n/fornaxdump/1994/0215/sys/src/brazil/port/devproc.c /n/fornaxdump/1994/0219/sys/src/brazil/port/devproc.c 299c if(offset < KZERO || (offset >= USTKTOP-USTKSIZE && offset < USTKTOP)) . ## diffname port/devproc.c 1994/0331 ## diff -e /n/fornaxdump/1994/0219/sys/src/brazil/port/devproc.c /n/fornaxdump/1994/0331/sys/src/brazil/port/devproc.c 37c "kregs", {Qkregs}, sizeof(Ureg), 0000, . ## diffname port/devproc.c 1994/0407 ## diff -e /n/fornaxdump/1994/0331/sys/src/brazil/port/devproc.c /n/fornaxdump/1994/0407/sys/src/brazil/port/devproc.c 895c for(i = 0; i < nsyscall; i++) . 892c for(i = 0; i < nsyscall; i++) . 886c bp = smalloc((nsyscall+ncounter)*(NAMELEN+8)); . ## diffname port/devproc.c 1994/0409 ## diff -e /n/fornaxdump/1994/0407/sys/src/brazil/port/devproc.c /n/fornaxdump/1994/0409/sys/src/brazil/port/devproc.c 778c if(!read && (s->type&SG_TYPE) == SG_TEXT) . ## diffname port/devproc.c 1994/0612 ## diff -e /n/fornaxdump/1994/0409/sys/src/brazil/port/devproc.c /n/fornaxdump/1994/0612/sys/src/brazil/port/devproc.c 865,902d 378,380d 199d 124,128d 76d 34d 26d ## diffname port/devproc.c 1994/0613 ## diff -e /n/fornaxdump/1994/0612/sys/src/brazil/port/devproc.c /n/fornaxdump/1994/0613/sys/src/brazil/port/devproc.c 499,501c for(i = 0; i < MNTHASH; i++) { for(f = pg->mnthash[i]; f; f = f->hash) { . 495a last = 0; . 494d 488d 486c Mhead *f; int nxt, i; . ## diffname port/devproc.c 1994/0814 ## diff -e /n/fornaxdump/1994/0613/sys/src/brazil/port/devproc.c /n/fornaxdump/1994/0814/sys/src/brazil/port/devproc.c 313a memmove(a, (char*)offset, n); return n; } if(offset >= crasharea && offset < crashend){ if(offset+n > crashend) n = crashend - offset; . 51a /* where to put crash information when memory isn't wiped */ ulong crasharea; ulong crashend; . ## diffname port/devproc.c 1994/0816 ## diff -e /n/fornaxdump/1994/0814/sys/src/brazil/port/devproc.c /n/fornaxdump/1994/0816/sys/src/brazil/port/devproc.c 700d ## diffname port/devproc.c 1994/0817 ## diff -e /n/fornaxdump/1994/0816/sys/src/brazil/port/devproc.c /n/fornaxdump/1994/0817/sys/src/brazil/port/devproc.c 744a } else if(strncmp(buf, "pri", 3) == 0){ if(n < 4) error(Ebadarg); i = atoi(buf+4); if(i < 0 || i >= Nrq) error(Ebadarg); p->basepri = i; . 699a int i; . 321,326d 52,55d ## diffname port/devproc.c 1994/0914 ## diff -e /n/fornaxdump/1994/0817/sys/src/brazil/port/devproc.c /n/fornaxdump/1994/0914/sys/src/brazil/port/devproc.c 743c error(Ebadctl); . 740c error(Ebadctl); . ## diffname port/devproc.c 1994/0915 ## diff -e /n/fornaxdump/1994/0914/sys/src/brazil/port/devproc.c /n/fornaxdump/1994/0915/sys/src/brazil/port/devproc.c 742,743c if(i < 0) i = 0; if(i >= Nrq) i = Nrq - 1; if(i < p->basepri && !iseve()) error(Eperm); . 398a readnum(0, statbuf+j+NUMSIZE*7, NUMSIZE, p->basepri, NUMSIZE); readnum(0, statbuf+j+NUMSIZE*8, NUMSIZE, p->priority, NUMSIZE); . 30c #define STATSIZE (2*NAMELEN+12+9*12) . ## diffname port/devproc.c 1995/0102 ## diff -e /n/fornaxdump/1994/0915/sys/src/brazil/port/devproc.c /n/fornaxdump/1995/0102/sys/src/brazil/port/devproc.c 746,750c if(i >= NiceMax) i = NiceMax - 1; p->nice = i; } else if(strncmp(buf, "wired", 5) == 0){ if(n < 6) error(Ebadctl); i = atoi(buf+6); if(i) procwired(p); . 743c i = NiceNormal+atoi(buf+4); . 399,400c readnum(0, statbuf+j+NUMSIZE*7, NUMSIZE, p->nice, NUMSIZE); readnum(0, statbuf+j+NUMSIZE*8, NUMSIZE, p->pri, NUMSIZE); . ## diffname port/devproc.c 1995/0103 ## diff -e /n/fornaxdump/1995/0102/sys/src/brazil/port/devproc.c /n/fornaxdump/1995/0103/sys/src/brazil/port/devproc.c 743c i = NiceNormal+atoi(buf+5); . 740,741c if(strncmp(buf, "nice", 4) == 0){ if(n < 5) . ## diffname port/devproc.c 1995/0105 ## diff -e /n/fornaxdump/1995/0103/sys/src/brazil/port/devproc.c /n/fornaxdump/1995/0105/sys/src/brazil/port/devproc.c 816,819c memmove(a, b, n); else { memmove(b, a, n); dcflush(b, n); } . 814a b += offset&(BY2PG-1); . ## diffname port/devproc.c 1995/0106 ## diff -e /n/fornaxdump/1995/0105/sys/src/brazil/port/devproc.c /n/fornaxdump/1995/0106/sys/src/brazil/port/devproc.c 820,821d 818c else . ## diffname port/devproc.c 1995/0108 ## diff -e /n/fornaxdump/1995/0106/sys/src/brazil/port/devproc.c /n/fornaxdump/1995/0108/sys/src/brazil/port/devproc.c 612a } long procbwrite(Chan *c, Block *bp, ulong offset) { return devbwrite(c, bp, offset); . 482a Block* procbread(Chan *c, long n, ulong offset) { return devbread(c, n, offset); } . ## diffname port/devproc.c 1995/0110 ## diff -e /n/fornaxdump/1995/0108/sys/src/brazil/port/devproc.c /n/fornaxdump/1995/0110/sys/src/brazil/port/devproc.c 758,760c if(i >= Nrq) i = Nrq - 1; if(i < p->basepri && !iseve()) error(Eperm); p->basepri = i; . 755c i = atoi(buf+4); . 752,753c if(strncmp(buf, "pri", 3) == 0){ if(n < 4) . 399,400c readnum(0, statbuf+j+NUMSIZE*7, NUMSIZE, p->basepri, NUMSIZE); readnum(0, statbuf+j+NUMSIZE*8, NUMSIZE, p->priority, NUMSIZE); . ## diffname port/devproc.c 1995/0212 ## diff -e /n/fornaxdump/1995/0110/sys/src/brazil/port/devproc.c /n/fornaxdump/1995/0212/sys/src/brazil/port/devproc.c 344c if(offset >= sizeof(Proc)) return 0; if(offset+n > sizeof(Proc)) n = sizeof(Proc) - offset; memmove(a, ((char*)p)+offset, n); return n; . ## diffname port/devproc.c 1995/0319 ## diff -e /n/fornaxdump/1995/0212/sys/src/brazil/port/devproc.c /n/fornaxdump/1995/0319/sys/src/brazil/port/devproc.c 755a else if(strncmp(buf, "closefgrp", 9) == 0) procctlfgrp(p->fgrp); . 709a char buf[NAMELEN]; . 708d 705a procctlfgrp(Fgrp *f) { int i; Chan *c; lock(f); f->ref++; for(i = 0; i < f->maxfd; i++) { c = f->fd[i]; if(c != 0) { f->fd[i] = 0; unlock(f); close(c); lock(f); } } unlock(f); closefgrp(f); } void . ## diffname port/devproc.c 1995/0804 ## diff -e /n/fornaxdump/1995/0319/sys/src/brazil/port/devproc.c /n/fornaxdump/1995/0804/sys/src/brazil/port/devproc.c 236d 234c procremove(Chan*) . 229d 227c proccreate(Chan*, char*, int, ulong) . 83d 76c procgen(Chan *c, Dirtab *tab, int, int s, Dir *dp) . ## diffname port/devproc.c 1996/0121 ## diff -e /n/fornaxdump/1995/0804/sys/src/brazil/port/devproc.c /n/fornaxdump/1996/0121/sys/src/brazil/port/devproc.c 445a if(p->pid != pid) error(Eprocdied); . 442a pid = p->pid; . 275a int i, j, rsize, pid; . 273d ## diffname port/devproc.c 1996/0223 ## diff -e /n/fornaxdump/1996/0121/sys/src/brazil/port/devproc.c /n/fornaxdump/1996/0223/sys/src/brazil/port/devproc.c 9d ## diffname port/devproc.c 1996/0303 ## diff -e /n/fornaxdump/1996/0223/sys/src/brazil/port/devproc.c /n/fornaxdump/1996/0303/sys/src/brazil/port/devproc.c 799a } else if(strncmp(buf, "profile", 7) == 0) { s = p->seg[TSEG]; if(s == 0 || (s->type&SG_TYPE) != SG_TEXT) error(Ebadctl); if(s->profile != 0) free(s->profile); npc = (s->top-s->base)>>LRESPROF; s->profile = malloc(npc*sizeof(*s->profile)); if(s->profile == 0) error(Enomem); . 794c if(strncmp(buf, "wired", 5) == 0) { . 781c if(strncmp(buf, "pri", 3) == 0) { . 729c Segment *s; int i, npc; . 413a sg->profile ? 'P' : ' ', . 411c j += sprint(statbuf+j, "%-6s %c%c %.8lux %.8lux %4d\n", . 313a case Qprofile: s = p->seg[TSEG]; if(s == 0 || s->profile == 0) error("profile is off"); i = (s->top-s->base)>>LRESPROF; i *= sizeof(*s->profile); if(offset >= i) return 0; if(offset+n > i) n = i - offset; memmove(a, ((char*)s->profile)+offset, n); return n; . 184a case Qprofile: . 109a break; case Qprofile: q = p->seg[TSEG]; if(q && q->profile) { len = (q->top-q->base)>>LRESPROF; len *= sizeof(*q->profile); } break; } . 108c switch(QID(c->qid)) { case Qwait: . 78a Segment *q; . 45a "profile", {Qprofile}, 0, 0400, . 26a Qprofile, . 9d ## diffname port/devproc.c 1997/0327 ## diff -e /n/fornaxdump/1996/0303/sys/src/brazil/port/devproc.c /n/emeliedump/1997/0327/sys/src/brazil/port/devproc.c 743c cclose(c); . 689c cclose(tc); . 657c Chan* . 651,655c Dev procdevtab = { devreset, procinit, procattach, devclone, procwalk, procstat, procopen, devcreate, procclose, procread, devbread, procwrite, devbwrite, devremove, procwstat, }; . 557c static long . 513,518d 276c static long . 269c static void . 237,249c static void . 169c static Chan* . 163c static void . 146,152c static int . 135,140c static Chan* . 128c static void . 96c if(s >= nelem(procdir)) . 75c static int . 60d ## diffname port/devproc.c 1997/0408 ## diff -e /n/emeliedump/1997/0327/sys/src/brazil/port/devproc.c /n/emeliedump/1997/0408/sys/src/brazil/port/devproc.c 621a 'p', "proc", . ## diffname port/devproc.c 1997/0516 ## diff -e /n/emeliedump/1997/0408/sys/src/brazil/port/devproc.c /n/emeliedump/1997/0516/sys/src/brazil/port/devproc.c 50c char *sname[]={ "Text", "Data", "Bss", "Stack", "Shared", "Phys", "Shdata", "Map" }; . ## diffname port/devproc.c 1997/1203 ## diff -e /n/emeliedump/1997/0516/sys/src/brazil/port/devproc.c /n/emeliedump/1997/1203/sys/src/brazil/port/devproc.c 470c i = sprint(a, "%.*s %d ", NAMELEN, mw->cm->spec, mw->cm->flag); . ## diffname port/devproc.c 1997/1206 ## diff -e /n/emeliedump/1997/1203/sys/src/brazil/port/devproc.c /n/emeliedump/1997/1206/sys/src/brazil/port/devproc.c 568a if(p->dbgreg == 0) error(Enoreg); . 363a if(rptr == 0) error(Enoreg); . ## diffname port/devproc.c 1997/1208 ## diff -e /n/emeliedump/1997/1206/sys/src/brazil/port/devproc.c /n/emeliedump/1997/1208/sys/src/brazil/port/devproc.c 891a poperror(); . 888c memmove(a, b, n); /* This can fault */ . 884a if(waserror()) { s->steal--; kunmap(k); nexterror(); } . ## diffname port/devproc.c 1998/0310 ## diff -e /n/emeliedump/1997/1208/sys/src/brazil/port/devproc.c /n/emeliedump/1998/0310/sys/src/brazil/port/devproc.c 485a case Qfd: return procfds(p->fgrp, va, n, offset); . 244a static int procfds(Fgrp *f, char *va, int count, long offset) { Chan *c; int n, i; n = 0; for(i = 0; i <= f->maxfd; i++) { c = f->fd[i]; if(c == nil) continue; n += snprint(va+n, count-n, "%3d %.2s %.8lux.%.8d %8d ", i, &"r w rw"[(c->mode&3)<<1], c->qid.path, c->qid.vers, c->offset); n += ptpath(c->path, va+n, count-n); n += snprint(va+n, count-n, "\n"); if(offset > 0) { offset -= n; if(offset < 0) { memmove(va, va+n+offset, -offset); n = -offset; } else n = 0; } } return n; } . 185a case Qfd: . 62,63c #define QID(q) (((q).path&0x0000001F)>>0) #define SLOT(q) ((((q).path&0x07FFFFFE0)>>QSHIFT)-1) . 60c #define QSHIFT 5 /* location in qid of proc slot # */ . 32a "fd", {Qfd}, 0, 0000, . 26a Qfd, . ## diffname port/devproc.c 1998/0319 ## diff -e /n/emeliedump/1998/0310/sys/src/brazil/port/devproc.c /n/emeliedump/1998/0319/sys/src/brazil/port/devproc.c 570a ulong offset = off; . 566c procwrite(Chan *c, void *va, long n, vlong off) . 298a ulong offset = off; . 287c procread(Chan *c, void *va, long n, vlong off) . ## diffname port/devproc.c 1998/0425 ## diff -e /n/emeliedump/1998/0319/sys/src/brazil/port/devproc.c /n/emeliedump/1998/0425/sys/src/brazil/port/devproc.c 522c return procfds(p, va, n, offset); . 275a unlock(f); qunlock(&p->debug); poperror(); . 253a f = p->fgrp; if(f == nil) return 0; if(waserror()){ unlock(f); qunlock(&p->debug); nexterror(); } qlock(&p->debug); lock(f); . 250a Fgrp *f; . 249c procfds(Proc *p, char *va, int count, long offset) . ## diffname port/devproc.c 1998/0512 ## diff -e /n/emeliedump/1998/0425/sys/src/brazil/port/devproc.c /n/emeliedump/1998/0512/sys/src/brazil/port/devproc.c 932c panic("procctlmemio1"); . 929c panic("procctlmemio"); . ## diffname port/devproc.c 1998/0825 ## diff -e /n/emeliedump/1998/0512/sys/src/brazil/port/devproc.c /n/emeliedump/1998/0825/sys/src/brazil/port/devproc.c 465c j += sprint(statbuf+j, "%-6s %c%c %.8lux %.8lux %4ld\n", . 271c n += snprint(va+n, count-n, "%3d %.2s %.8lux.%.8lud %8lld ", . 92c sprint(buf, "%lud", pid); . ## diffname port/devproc.c 1998/1130 ## diff -e /n/emeliedump/1998/0825/sys/src/brazil/port/devproc.c /n/emeliedump/1998/1130/sys/src/brazil/port/devproc.c 553c pg = p->pgrp; . 545c mntscan(Mntwalk *mw, Proc *p) . 518c mntscan(mw, p); . 74c void mntscan(Mntwalk*, Proc*); . 41c "ns", {Qns}, 0, 0444, . ## diffname port/devproc.c 1999/0108 ## diff -e /n/emeliedump/1998/1130/sys/src/brazil/port/devproc.c /n/emeliedump/1999/0108/sys/src/brazil/port/devproc.c 987a qunlock(&p->seglock); . 977a qlock(&p->seglock); . ## diffname port/devproc.c 1999/0224 ## diff -e /n/emeliedump/1999/0108/sys/src/brazil/port/devproc.c /n/emeliedump/1999/0224/sys/src/brazil/port/devproc.c 859c if(i > p->basepri && !iseve()) . ## diffname port/devproc.c 1999/0629 ## diff -e /n/emeliedump/1999/0224/sys/src/brazil/port/devproc.c /n/emeliedump/1999/0629/sys/src/brazil/port/devproc.c 533,534c int2flag(mw->cm->flag, flag); if(strcmp(mw->cm->to->name->s, "#M") == 0){ srv = srvname(mw->cm->to->mchan); i = snprint(a, n, "mount %s %s %s %.*s\n", flag, srv==nil? mw->cm->to->mchan->name->s : srv, mw->mh->from->name->s, NAMELEN, mw->cm->spec); free(srv); }else i = snprint(a, n, "bind %s %s %s\n", flag, mw->cm->to->name->s, mw->mh->from->name->s); return i; . 521,531c mntscan(mw, p); if(mw->mh == 0){ mw->cddone = 1; i = snprint(a, n, "cd %s\n", p->dot->name->s); return i; . 518,519c if(mw->cddone) . 314c char statbuf[NSEG*32], *srv, flag[10]; . 301a static void int2flag(int flag, char *s) { if(flag == 0){ *s = '\0'; return; } *s++ = '-'; if(flag & MAFTER) *s++ = 'a'; if(flag & MBEFORE) *s++ = 'b'; if(flag & MCREATE) *s++ = 'c'; if(flag & MCACHE) *s++ = 'C'; if(flag & MRECOV) *s++ = 'r'; *s = '\0'; } . 276c n += readstr(0, va+n, count-n, c->name->s); . 273a devtab[c->type]->dc, c->dev, . 271c n += snprint(va+n, count-n, "%3d %.2s %C %4ld %.8lux.%.8lud %8lld ", . 266c n = readstr(0, va, count, p->dot->name->s); n += snprint(va+n, count-n, "\n"); . 27d 12a Qfd, . ## diffname port/devproc.c 1999/0709 ## diff -e /n/emeliedump/1999/0629/sys/src/brazil/port/devproc.c /n/emeliedump/1999/0709/sys/src/brazil/port/devproc.c 245a poperror(); qunlock(&p->debug); . 237a if(waserror()){ qunlock(&p->debug); nexterror(); } qlock(&p->debug); . 224a /* make sure the process slot didn't get reallocated while we were playing */ coherence(); if(p->pid != pid) error(Eprocdied); . 171c pid = PID(c->qid); if(p->pid != pid) . 164a int pid; . ## diffname port/devproc.c 1999/0711 ## diff -e /n/emeliedump/1999/0709/sys/src/brazil/port/devproc.c /n/emeliedump/1999/0711/sys/src/brazil/port/devproc.c 910,911c procwired(p, i); . ## diffname port/devproc.c 1999/0724 ## diff -e /n/emeliedump/1999/0711/sys/src/brazil/port/devproc.c /n/emeliedump/1999/0724/sys/src/brazil/port/devproc.c 257a if(strcmp(d.uid, p->user) != 0){ if(strcmp(up->user, eve) != 0) error(Eperm); else { strncpy(p->user, d.uid, sizeof(p->user)); p->user[sizeof(p->user)-1] = 0; } } . ## diffname port/devproc.c 1999/1104 ## diff -e /n/emeliedump/1999/0724/sys/src/brazil/port/devproc.c /n/emeliedump/1999/1104/sys/src/9/port/devproc.c 898c if(strncmp(buf, "closefiles", 10) == 0) . 844d 36c "kregs", {Qkregs}, sizeof(Ureg), 0400, . ## diffname port/devproc.c 1999/1105 ## diff -e /n/emeliedump/1999/1104/sys/src/9/port/devproc.c /n/emeliedump/1999/1105/sys/src/9/port/devproc.c 344,345d ## diffname port/devproc.c 1999/1230 ## diff -e /n/emeliedump/1999/1105/sys/src/9/port/devproc.c /n/emeliedump/1999/1230/sys/src/9/port/devproc.c 145,149d 84a if(s == DEVDOTDOT){ c->qid.path = CHDIR; devdir(c, c->qid, "#p", 0, eve, 0555, dp); return 1; } . ## diffname port/devproc.c 2000/0107 ## diff -e /n/emeliedump/1999/1230/sys/src/9/port/devproc.c /n/emeliedump/2000/0107/sys/src/9/port/devproc.c 36c "kregs", {Qkregs}, sizeof(Ureg), 0440, . ## diffname port/devproc.c 2000/0108 ## diff -e /n/emeliedump/2000/0107/sys/src/9/port/devproc.c /n/emeliedump/2000/0108/sys/src/9/port/devproc.c 377c if(offset+n >= palloc.cmembase && offset < palloc.cmemtop) . ## diffname port/devproc.c 2000/0325 ## diff -e /n/emeliedump/2000/0108/sys/src/9/port/devproc.c /n/emeliedump/2000/0325/sys/src/9/port/devproc.c 586a if(p->fgrp == nil) error(Ebadusefd); . 562a if(p->pgrp == nil) error(Ebadusefd); . ## diffname port/devproc.c 2000/0331 ## diff -e /n/emeliedump/2000/0325/sys/src/9/port/devproc.c /n/emeliedump/2000/0331/sys/src/9/port/devproc.c 901a qunlock(&p->debug); poperror(); } . 900c if(strncmp(buf, "closefiles", 10) == 0){ qlock(&p->debug); if(waserror()){ qunlock(&p->debug); nexterror(); } if(p->fgrp == nil) error(Eprocdied); . 589,590d 583a qunlock(&p->debug); poperror(); . 571a qunlock(&p->debug); poperror(); . 567a } . 566c if(mw->cddone){ qunlock(&p->debug); poperror(); . 563,564c qlock(&p->debug); if(waserror()){ qunlock(&p->debug); nexterror(); } if(p->pgrp == nil || p->pid != PID(c->qid)) error(Eprocdied); . 289,290d 282a } lock(f); . 281c if(f == nil){ qunlock(&p->debug); . 279a qlock(&p->debug); . 233c tc = devopen(c, omode, 0, 0, procgen); qunlock(&p->debug); poperror(); return tc; . 212a pg = p->pgrp; if(pg == nil) error(Eprocdied); . 184a qunlock(&p->debug); poperror(); . 172c qlock(&p->debug); if(waserror()){ qunlock(&p->debug); nexterror(); } . ## diffname port/devproc.c 2000/0815 ## diff -e /n/emeliedump/2000/0331/sys/src/9/port/devproc.c /n/emeliedump/2000/0815/sys/src/9/port/devproc.c 114a else /* just copy read bits */ perm |= p->procmode & 0444; . 39c "noteid", {Qnoteid}, 0, 0664, . ## diffname port/devproc.c 2001/0315 ## diff -e /n/emeliedump/2000/0815/sys/src/9/port/devproc.c /n/emeliedump/2001/0315/sys/src/9/port/devproc.c 950a p->fixedpri = 0; } else if(strncmp(buf, "fixedpri", 8) == 0) { if(n < 9) error(Ebadctl); i = atoi(buf+9); if(i < 0) i = 0; if(i >= Nrq) i = Nrq - 1; if(i > p->basepri && !iseve()) error(Eperm); p->basepri = i; p->fixedpri = 1; . ## diffname port/devproc.c 2001/0317 ## diff -e /n/emeliedump/2001/0315/sys/src/9/port/devproc.c /n/emeliedump/2001/0317/sys/src/9/port/devproc.c 927,938c if(strncmp(buf, "closefiles", 10) == 0) procctlclosefiles(p); . 871a qunlock(&p->debug); . 866a qlock(&p->debug); . 865a qunlock(&p->debug); . 858a qlock(&p->debug); f = p->fgrp; if(f == nil){ qunlock(&p->debug); error(Eprocdied); } . 857a Fgrp *f; . 854c procctlclosefiles(Proc *p) . ## diffname port/devproc.c 2001/0319 ## diff -e /n/emeliedump/2001/0317/sys/src/9/port/devproc.c /n/emeliedump/2001/0319/sys/src/9/port/devproc.c 882,883d 865d 862,863c if(f == nil) . 860d ## diffname port/devproc.c 2001/0320 ## diff -e /n/emeliedump/2001/0319/sys/src/9/port/devproc.c /n/emeliedump/2001/0320/sys/src/9/port/devproc.c 322,330c offset = procoffset(offset, va, &n); . 309a offset = procoffset(offset, va, &n); . 287a static long procoffset(long offset, char *va, int *np) { if(offset > 0) { offset -= *np; if(offset < 0) { memmove(va, va+*np+offset, -offset); *np = -offset; } else *np = 0; } return offset; } . ## diffname port/devproc.c 2001/0408 ## diff -e /n/emeliedump/2001/0320/sys/src/9/port/devproc.c /n/emeliedump/2001/0408/sys/src/9/port/devproc.c 260a nonone(p); . 220a nonone(p); . 211a nonone(p); . 161a /* * none can't read or write state on other * processes. This is to contain access of * servers running as none should they be * subverted by, for example, a stack attack. */ static void nonone(Proc *p) { if(p == up) return; if(strcmp(up->user, "none") != 0) return; if(iseve()) return; error(Eperm); } . ## diffname port/devproc.c 2001/0424 ## diff -e /n/emeliedump/2001/0408/sys/src/9/port/devproc.c /n/emeliedump/2001/0424/sys/src/9/port/devproc.c 52c char *sname[]={ "Text", "Data", "Bss", "Stack", "Shared", "Phys", "Shdata" }; . ## diffname port/devproc.c 2001/0425 ## diff -e /n/emeliedump/2001/0424/sys/src/9/port/devproc.c /n/emeliedump/2001/0425/sys/src/9/port/devproc.c 52c char *sname[]={ "Text", "Data", "Bss", "Stack", "Shared", "Phys" }; . ## diffname port/devproc.c 2001/0503 ## diff -e /n/emeliedump/2001/0425/sys/src/9/port/devproc.c /n/emeliedump/2001/0503/sys/src/9/port/devproc.c 52c static char *sname[]={ "Text", "Data", "Bss", "Stack", "Shared", "Phys" }; . ## diffname port/devproc.c 2001/0510 ## diff -e /n/emeliedump/2001/0503/sys/src/9/port/devproc.c /n/emeliedump/2001/0510/sys/src/9/port/devproc.c 153c int s; int pid; if(c->qid.path == CHDIR && name[0] != '.'){ /* this is a hack to speed walks through a large directory */ pid = strtol(name, &name, 0); if(pid < 0 || *name != 0) return 0; s = procindex(pid); if(s < 0) return 0; c->qid = (Qid){CHDIR|((s+1)<= j) return 0; if(offset+n > j) n = j-offset; memmove(a, &statbuf[offset], n); return n; . 407a static int procargs(Proc *p, char *buf, int nbuf) { int j, k, m; char *a; int n; a = p->args; n = p->nargs; for(j = 0; j < nbuf - 1; j += m){ if(n == 0) break; if(j != 0) buf[j++] = ' '; m = snprint(buf+j, nbuf-j, "%q", a); k = strlen(a) + 1; a += k; n -= k; } return j; } . 235a case Qargs: . 32a "args", {Qargs}, 0, 0440, . 11a Qargs, . ## diffname port/devproc.c 2001/0522 ## diff -e /n/emeliedump/2001/0511/sys/src/9/port/devproc.c /n/emeliedump/2001/0522/sys/src/9/port/devproc.c 161c if(pid <= 0 || *name != 0) . 13a Qargs, . 12d ## diffname port/devproc.c 2001/0527 ## diff -e /n/emeliedump/2001/0522/sys/src/9/port/devproc.c /n/emeliedump/2001/0527/sys/src/9/port/devproc.c 965,967c kstrcpy(buf, va, sizeof buf); . 963c char buf[64]; . 843d 802c if(n >= ERRMAX-1) . 748c if(c->qid.type & QTDIR) . 744c char *a, buf[ERRMAX]; . 683c mw->mh->from->name->s, mw->cm->spec? mw->cm->spec : ""); . 681c i = snprint(a, n, "mount %s %s %s %s\n", flag, . 678c int2flag(mw->cm->mflag, flag); . 574,577c memmove(statbuf+0*KNAMELEN, p->text, strlen(p->text)); memmove(statbuf+1*KNAMELEN, p->user, strlen(p->user)); memmove(statbuf+2*KNAMELEN, sps, strlen(sps)); j = 2*KNAMELEN + 12; . 523c n = m; . 520c m = strlen(p->note[0].msg) + 1; if(m > n) m = n; memmove(va, p->note[0].msg, m); ((char*)va)[m-1] = '\0'; . 515c if(n < 1) /* must accept at least the '\0' */ . 493a . 462c memmove(a, &p->genbuf[offset], n); . 457c j = procargs(p, p->genbuf, sizeof p->genbuf); . 448c if(c->qid.type & QTDIR) . 435a int m; . 372c c->qid.path, w, c->qid.vers, c->qid.type, . 368c ww = sprint(buf, "%lud", c->qid.vers); if(ww > w) w = ww; } for(i = 0; i <= f->maxfd; i++) { c = f->fd[i]; if(c == nil) continue; n += snprint(va+n, count-n, "%3d %.2s %C %4ld (%.16llux %*lud %.2ux) %8lld ", . 363a /* compute width of qid.path */ w = 0; . 346c int n, i, w, ww; char buf[32]; . 325a . 323a return n; . 320d 318a p->procmode = d->mode&0777; . 311,317c d = smalloc(sizeof(Dir)+n); n = convM2D(db, n, &d[0], (char*)&d[1]); if(n > 0){ if(strcmp(d->uid, "") != 0 && strcmp(d->uid, p->user) != 0){ if(strcmp(up->user, eve) != 0) error(Eperm); else kstrdup(&p->user, d->uid); . 294c if(c->qid.type&QTDIR) . 292c Dir *d; . 288,289c static int procwstat(Chan *c, uchar *db, int n) . 204c if(c->qid.type & QTDIR) . 175c return devstat(c, db, n, 0, 0, procgen); . 172,173c static int procstat(Chan *c, uchar *db, int n) . 155,169c return devwalk(c, nc, name, nname, 0, 0, procgen); . 152,153c static Walkqid* procwalk(Chan *c, Chan *nc, char **name, int nname) . 134c mkqid(&qid, path|tab->qid.path, c->qid.vers, QTFILE); . 111c path = c->qid.path&~(((1<genbuf, "%lud", pid); mkqid(&qid, (s+1)<genbuf, 0, p->user, DMDIR|0555, dp); . 93,95c if(c->qid.path == Qdir){ if(name != nil){ /* ignore s and use name to find pid */ pid = strtol(name, &name, 0); if(pid==0 || name[0]!='\0') return -1; s = procindex(pid); if(s < 0) return -1; }else if(s >= conf.nproc) return -1; . 88,89c mkqid(&qid, Qdir, 0, QTDIR); devdir(c, qid, "#p", 0, eve, 0555, dp); . 84d 79c procgen(Chan *c, char *name, Dirtab *tab, int, int s, Dir *dp) . 66,67c #define QID(q) ((((ulong)(q).path)&0x0000001F)>>0) #define SLOT(q) (((((ulong)(q).path)&0x07FFFFFE0)>>QSHIFT)-1) . 54c static char *sname[]={ "Text", "Data", "Bss", "Stack", "Shared", "Phys", }; . 38c "kregs", {Qkregs}, sizeof(Ureg), 0400, . 36c "fd", {Qfd}, 0, 0444, . 31c #define STATSIZE (2*KNAMELEN+12+9*12) /* * Status, fd, and ns are left fully readable (0444) because of their use in debugging, * particularly on shared servers. * Arguably, ns and fd shouldn't be readable; if you'd prefer, change them to 0000 */ . 13a Qctl, . 11d ## diffname port/devproc.c 2001/0717 ## diff -e /n/emeliedump/2001/0527/sys/src/9/port/devproc.c /n/emeliedump/2001/0717/sys/src/9/port/devproc.c 982a if(p->kp) /* no ctl requests to kprocs */ error(Eperm); . ## diffname port/devproc.c 2001/0803 ## diff -e /n/emeliedump/2001/0717/sys/src/9/port/devproc.c /n/emeliedump/2001/0803/sys/src/9/port/devproc.c 1032a if(strncmp(buf, "close", 5) == 0){ if(n < 6) error(Ebadctl); procctlclosefiles(p, 0, atoi(buf+6)); }else . 1031c procctlclosefiles(p, 1, 0); . 961,971c if(all) for(i = 0; i < f->maxfd; i++) procctlcloseone(p, f, i); else procctlcloseone(p, f, fd); . 952d 949c procctlclosefiles(Proc *p, int all, int fd) . 947a 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); } . 381,388c n += procfdprint(c, i, w, va+n, count-n); . 373c ww = procqidwidth(c); . 349d 343a 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 . ## diffname port/devproc.c 2001/0819 ## diff -e /n/emeliedump/2001/0803/sys/src/9/port/devproc.c /n/emeliedump/2001/0819/sys/src/9/port/devproc.c 689c return n; . 687c n = snprint(a, n, "%d %lud %lud %lud %q", wq->w.pid, wq->w.time[TUser], wq->w.time[TSys], wq->w.time[TReal], wq->w.msg); . 656,658d 136c len = p->nwait; /* incorrect size, but >0 means there's something to read */ . ## diffname port/devproc.c 2001/0831 ## diff -e /n/emeliedump/2001/0819/sys/src/9/port/devproc.c /n/emeliedump/2001/0831/sys/src/9/port/devproc.c 322a free(d); . 298a free(d); . 297a d = nil; . ## diffname port/devproc.c 2001/1003 ## diff -e /n/emeliedump/2001/0831/sys/src/9/port/devproc.c /n/emeliedump/2001/1003/sys/src/9/port/devproc.c 946c if(procstopped(p) || p->state == Broken) . ## diffname port/devproc.c 2001/1017 ## diff -e /n/emeliedump/2001/1003/sys/src/9/port/devproc.c /n/emeliedump/2001/1017/sys/src/9/port/devproc.c 113a /* * String comparison is done in devwalk so name must match its formatted pid */ if(name != nil && strcmp(name, up->genbuf) != 0) return -1; . 100,101c pid = strtol(name, &ename, 10); if(pid==0 || ename[0]!='\0') . 87a char *ename; . ## diffname port/devproc.c 2001/1106 ## diff -e /n/emeliedump/2001/1017/sys/src/9/port/devproc.c /n/emeliedump/2001/1106/sys/src/9/port/devproc.c 328a if(d->mode != ~0UL) p->procmode = d->mode&0777; . 320,327c if(n == 0) error(Eshortstat); if(!emptystr(d->uid) && strcmp(d->uid, p->user) != 0){ if(strcmp(up->user, eve) != 0) error(Eperm); else kstrdup(&p->user, d->uid); . ## diffname port/devproc.c 2001/1117 ## diff -e /n/emeliedump/2001/1106/sys/src/9/port/devproc.c /n/emeliedump/2001/1117/sys/src/9/port/devproc.c 1072a if(strncmp(buf, "private", 7) == 0) p->privatemem = 1; else . 520a /* conf.base* and conf.npage* are set by xinit to refer to kernel allocation, not user pages */ . 510,514c /* validate kernel addresses */ . 247d 242a case Qmem: if(p->privatemem) error(Eperm); /* fall through */ . ## diffname port/devproc.c 2001/1118 ## diff -e /n/emeliedump/2001/1117/sys/src/9/port/devproc.c /n/emeliedump/2001/1118/sys/src/9/port/devproc.c 1122,1123c poperror(); free(cb); . 1120a break; case PCstart: if(p->state != Stopped) error(Ebadctl); ready(p); break; case PCstartstop: if(p->state != Stopped) error(Ebadctl); p->procctl = Proc_traceme; ready(p); procstopwait(p, Proc_traceme); break; case PCstop: procstopwait(p, Proc_stopme); break; case PCwaitstop: procstopwait(p, 0); break; case PCwired: procwired(p, atoi(cb->f[1])); break; . 1088,1111c break; case PCprivate: p->privatemem = 1; break; case PCprofile: . 1047,1079c break; case PCpri: i = atoi(cb->f[1]); . 1040,1045c break; case PCnohang: . 1023,1026c if(cb->nf <= 0) error(Ebadctl); ct = lookupcmd(cb, proccmd, nelem(proccmd)); switch(ct->index){ case PCclose: procctlclosefiles(p, 0, atoi(cb->f[1])); break; case PCclosefiles: procctlclosefiles(p, 1, 0); break; case PCfixedpri: i = atoi(cb->f[1]); if(i < 0) i = 0; if(i >= Nrq) i = Nrq - 1; if(i > p->basepri && !iseve()) error(Eperm); p->basepri = i; p->fixedpri = 1; break; case PChang: p->hang = 1; break; case PCkill: . 1021c cb = parsecmd(va, n); if(waserror()){ free(cb); nexterror(); } . 1016c Cmdbuf *cb; Cmdtab *ct; . 57a Cmdtab proccmd[] = { PCclose, "close", 2, PCclosefiles, "closefiles", 1, PCfixedpri, "fixedpri", 2, PChang, "hang", 1, PCnohang, "nohang", 1, PCkill, "kill", 1, PCpri, "pri", 2, PCprivate, "private", 1, PCprofile, "profile", 1, PCstart, "start", 1, PCstartstop, "startstop", 1, PCstop, "stop", 1, PCwaitstop, "waitstop", 1, PCwired, "wired", 2, }; . 30a enum { PCclose, PCclosefiles, PCfixedpri, PChang, PCkill, PCnohang, PCpri, PCprivate, PCprofile, PCstart, PCstartstop, PCstop, PCwaitstop, PCwired, }; . ## diffname port/devproc.c 2001/1119 ## diff -e /n/emeliedump/2001/1118/sys/src/9/port/devproc.c /n/emeliedump/2001/1119/sys/src/9/port/devproc.c 1150c case CMwired: . 1147c case CMwaitstop: . 1144c case CMstop: . 1137c case CMstartstop: . 1132c case CMstart: . 1121c case CMprofile: . 1118c case CMprivate: . 1107c case CMpri: . 1104c case CMnohang: . 1089c case CMkill: . 1086c case CMhang: . 1075c case CMfixedpri: . 1072c case CMclosefiles: . 1069c case CMclose: . 77,90c CMclose, "close", 2, CMclosefiles, "closefiles", 1, CMfixedpri, "fixedpri", 2, CMhang, "hang", 1, CMnohang, "nohang", 1, CMkill, "kill", 1, CMpri, "pri", 2, CMprivate, "private", 1, CMprofile, "profile", 1, CMstart, "start", 1, CMstartstop, "startstop", 1, CMstop, "stop", 1, CMwaitstop, "waitstop", 1, CMwired, "wired", 2, . 33,46c CMclose, CMclosefiles, CMfixedpri, CMhang, CMkill, CMnohang, CMpri, CMprivate, CMprofile, CMstart, CMstartstop, CMstop, CMwaitstop, CMwired, . ## diffname port/devproc.c 2001/1120 ## diff -e /n/emeliedump/2001/1119/sys/src/9/port/devproc.c /n/emeliedump/2001/1120/sys/src/9/port/devproc.c 1062,1064d 75a static . ## diffname port/devproc.c 2002/0109 ## diff -e /n/emeliedump/2001/1120/sys/src/9/port/devproc.c /n/emeliedump/2002/0109/sys/src/9/port/devproc.c 922a devshutdown, . ## diffname port/devproc.c 2002/0201 ## diff -e /n/emeliedump/2002/0109/sys/src/9/port/devproc.c /n/emeliedump/2002/0201/sys/src/9/port/devproc.c 284,285d 279a case Qnote: case Qctl: . ## diffname port/devproc.c 2002/0421 ## diff -e /n/emeliedump/2002/0201/sys/src/9/port/devproc.c /n/emeliedump/2002/0421/sys/src/9/port/devproc.c 458a /* copy result to user space, now that locks are released */ memmove(va, buf, n); . 453,454c n += procfdprint(c, i, w, a+n, count-n); offset = procoffset(offset, a, &n); . 436,438c n = readstr(0, a, count, p->dot->name->s); n += snprint(a+n, count-n, "\n"); offset = procoffset(offset, a, &n); . 422a /* print to buf to avoid holding fgrp lock while writing to user space */ if(count > sizeof buf) count = sizeof buf; a = buf; . 421a char *a; . 420a char buf[256]; . ## diffname port/devproc.c 2002/0430 ## diff -e /n/emeliedump/2002/0421/sys/src/9/port/devproc.c /n/emeliedump/2002/0430/sys/src/9/port/devproc.c 558a if(!iseve()) error(Eperm); . ## diffname port/devproc.c 2002/0502 ## diff -e /n/emeliedump/2002/0430/sys/src/9/port/devproc.c /n/emeliedump/2002/0502/sys/src/9/port/devproc.c 1117a break; case CMnoswap: p->noswap = 1; . 82a CMnoswap, "noswap", 1, . 38a CMnoswap, . ## diffname port/devproc.c 2002/1025 ## diff -e /n/emeliedump/2002/0502/sys/src/9/port/devproc.c /n/emeliedump/2002/1025/sys/src/9/port/devproc.c 93c CMwired, "wired", 2, . 86,89c CMpri, "pri", 2, CMprivate, "private", 1, CMprofile, "profile", 1, CMstart, "start", 1, . 83,84c CMnohang, "nohang", 1, CMnoswap, "noswap", 1, . 81c CMfixedpri, "fixedpri", 2, . 79c CMclose, "close", 2, . 58c "args", {Qargs}, 0, 0440, . ## diffname port/devproc.c 2002/1026 ## diff -e /n/emeliedump/2002/1025/sys/src/9/port/devproc.c /n/emeliedump/2002/1026/sys/src/9/port/devproc.c 865a case Qargs: if(n == 0) error(Eshort); if(n >= ERRMAX) error(Etoobig); arg = malloc(n+1); if(arg == nil) error(Enomem); memmove(arg, va, n); m = n; if(arg[m-1] != 0) arg[m++] = 0; free(p->args); p->nargs = m; p->args = arg; break; . 840c char *a, *arg, buf[ERRMAX]; . 838c int id, m; . 548a qunlock(&p->debug); . 547a qlock(&p->debug); . 511c if(n <= 0) . 58c "args", {Qargs}, 0, 0660, . ## diffname port/devproc.c 2002/1029 ## diff -e /n/emeliedump/2002/1026/sys/src/9/port/devproc.c /n/emeliedump/2002/1029/sys/src/9/port/devproc.c 58c "args", {Qargs}, 0, 0660, . ## diffname port/devproc.c 2002/1104 ## diff -e /n/emeliedump/2002/1029/sys/src/9/port/devproc.c /n/emeliedump/2002/1104/sys/src/9/port/devproc.c 882a p->setargs = 1; . 509c if(p->setargs){ snprint(buf, nbuf, "%s [%s]", p->text, p->args); return strlen(buf); } n = p->nargs; . ## diffname port/devproc.c 2003/0214 ## diff -e /n/emeliedump/2002/1104/sys/src/9/port/devproc.c /n/emeliedump/2003/0214/sys/src/9/port/devproc.c 1192a break; case CMfair: if(!iseve()) error(Eperm); unfair = 0; break; case CMunfair: if(!iseve()) error(Eperm); unfair = 1; . 120a extern int unfair; . 93a CMfair, "fair", 1, CMunfair, "unfair", 1, . 47a CMfair, CMunfair, . ## diffname port/devproc.c 2003/0226 ## diff -e /n/emeliedump/2003/0214/sys/src/9/port/devproc.c /n/emeliedump/2003/0226/sys/src/9/port/devproc.c 1200,1209d ## diffname port/devproc.c 2003/0228 ## diff -e /n/emeliedump/2003/0226/sys/src/9/port/devproc.c /n/emeliedump/2003/0228/sys/src/9/port/devproc.c 1162,1163c procpriority(p, pri, 0); break; case CMfixedpri: if(!iseve()) error(Eperm); procpriority(p, atoi(cb->f[1]), 1); . 1155,1160c pri = atoi(cb->f[1]); if(pri > PriNormal && !iseve()) . 1119,1129d 1097c int npc, pri; . ## diffname port/devproc.c 2003/0316 ## diff -e /n/emeliedump/2003/0228/sys/src/9/port/devproc.c /n/emeliedump/2003/0316/sys/src/9/port/devproc.c 1152c procpriority(p, pri, 1); . 1150c pri = atoi(cb->f[1]); if(pri > PriNormal && !iseve()) .