| plan 9 kernel history: overview | file list | diff list |
1991/0705/port/devproc.c (diff list | history)
| 1991/0614/sys/src/9/port/devproc.c:14,19 – 1991/0705/sys/src/9/port/devproc.c:14,20 (short | long | prev | next) | ||
| 1990/0227 | Qnote, | |
| 1990/1110 | Qnotepg, | |
| 1990/0227 | Qproc, | |
| 1991/0705 | Qsegment, | |
| 1990/0227 | Qstatus, Qtext, }; | |
| 1991/0614/sys/src/9/port/devproc.c:24,33 – 1991/0705/sys/src/9/port/devproc.c:25,44 | ||
| 1990/11211 | "note", {Qnote}, 0, 0600, "notepg", {Qnotepg}, 0, 0200, "proc", {Qproc}, sizeof(Proc), 0600, | |
| 1991/0705 | "segment", {Qsegment}, 0, 0400, | |
| 1990/11211 | "status", {Qstatus}, NAMELEN+12+6*12, 0600, "text", {Qtext}, 0, 0600, | |
| 1990/0227 | }; | |
| 1991/0705 | char *sname[]={ /* Segment type from portdat.h */ "Text", "Data", "Bss", "Stack", "Shared", "Phys", }; | |
| 1990/0227 | /* | |
| 1990/11211 | * Qids are, in path: | |
| 1990/0227 | * 4 bits of file type (qids above) | |
| 1991/0614/sys/src/9/port/devproc.c:47,53 – 1991/0705/sys/src/9/port/devproc.c:58,64 | ||
| 1990/0227 | { Proc *p; char buf[NAMELEN]; | |
| 1991/0705 | ulong pid, path; | |
| 1990/0227 | ||
| 1990/11211 | if(c->qid.path == CHDIR){ | |
| 1990/0227 | if(s >= conf.nproc) | |
| 1991/0614/sys/src/9/port/devproc.c:65,71 – 1991/0705/sys/src/9/port/devproc.c:76,83 | ||
| 1990/0227 | if(tab) panic("procgen"); tab = &procdir[s]; | |
| 1990/11211 |
| |
| 1991/0705 | path = c->qid.path&~(CHDIR|((1<<QSHIFT)-1)); /* slot component */ devdir(c, (Qid){path|tab->qid.path, c->qid.vers}, | |
| 1990/11211 | tab->name, tab->length, tab->perm, dp); | |
| 1990/0227 | return 1; } | |
| 1991/0614/sys/src/9/port/devproc.c:112,118 – 1991/0705/sys/src/9/port/devproc.c:124,130 | ||
| 1990/0227 | { Proc *p; | |
| 1990/1110 | Pgrp *pg; | |
| 1990/0227 |
| |
| 1991/0705 | Segment *s; | |
| 1990/0227 | Chan *tc; | |
| 1990/11211 | if(c->qid.path == CHDIR){ | |
| 1991/0614/sys/src/9/port/devproc.c:129,139 – 1991/0705/sys/src/9/port/devproc.c:141,151 | ||
| 1990/0227 | switch(QID(c->qid)){ case Qtext: | |
| 1991/0605 |
| |
| 1991/0705 | s = p->seg[TSEG]; if(s==0 || p->state==Dead || s->image==0) | |
| 1990/0227 | goto Died; | |
| 1991/0605 | ||
| 1990/0227 |
| |
| 1991/0705 | tc = s->image->c; | |
| 1990/0227 | if(tc == 0) goto Died; | |
| 1991/0605 | ||
| 1991/0614/sys/src/9/port/devproc.c:154,159 – 1991/0705/sys/src/9/port/devproc.c:166,172 | ||
| 1990/0227 | return tc; case Qctl: case Qnote: | |
| 1991/0705 | case Qsegment: | |
| 1990/0227 | break; | |
| 1990/1110 | case Qnotepg: | |
| 1991/0614/sys/src/9/port/devproc.c:213,229 – 1991/0705/sys/src/9/port/devproc.c:226,243 | ||
| 1991/0411 | procread(Chan *c, void *va, long n, ulong offset) | |
| 1990/0227 | { char *a = va, *b; | |
| 1991/0705 | char statbuf[NSEG*32]; | |
| 1990/0227 | Proc *p; | |
| 1991/0705 | Pte *pte; Segment *s; | |
| 1990/0227 | Page *pg; | |
| 1990/0614 | KMap *k; | |
| 1990/0227 |
| |
| 1991/0705 | int i, j; | |
| 1990/0227 | long l; long pid; User *up; | |
| 1991/0705 | ulong soff; Segment *sg; | |
| 1990/0227 | ||
| 1990/11211 | if(c->qid.path & CHDIR) | |
| 1990/0227 | return devdirread(c, a, n, 0, 0, procgen); | |
| 1991/0614/sys/src/9/port/devproc.c:242,273 – 1991/0705/sys/src/9/port/devproc.c:256,277 | ||
| 1990/0227 | */ | |
| 1991/0411 | if(((offset+n)&~(BY2PG-1)) != (offset&~(BY2PG-1))) n = BY2PG - (offset&(BY2PG-1)); | |
| 1991/0705 | s = seg(p, offset, 1); | |
| 1990/0227 | if(s){ | |
| 1991/0705 | if(p->pid!=PID(c->qid)){ qunlock(&s->lk); | |
| 1990/11211 | error(Eprocdied); | |
| 1990/0227 |
| |
| 1990/11211 |
| |
| 1990/0227 |
| |
| 1990/11211 |
| |
| 1990/0227 | } | |
| 1991/0411 |
| |
| 1990/0227 |
| |
| 1990/11211 |
| |
| 1990/0227 |
| |
| 1991/0411 |
| |
| 1990/0614 |
| |
| 1990/0227 |
| |
| 1991/0705 | 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)){ | |
| 1991/0411 | pprint("nonresident page addr %lux (complain to rob)\n", offset); | |
| 1990/0227 | memset(a, 0, n); }else{ | |
| 1991/0614/sys/src/9/port/devproc.c:276,281 – 1991/0705/sys/src/9/port/devproc.c:280,288 | ||
| 1991/0411 | memmove(a, b+(offset&(BY2PG-1)), n); | |
| 1990/0614 | kunmap(k); | |
| 1990/0227 | } | |
| 1991/0705 | qlock(&s->lk); s->steal--; qunlock(&s->lk); | |
| 1990/0227 | return n; } /* u area */ | |
| 1991/0614/sys/src/9/port/devproc.c:355,360 – 1991/0705/sys/src/9/port/devproc.c:362,380 | ||
| 1990/0227 | } | |
| 1991/0411 | memmove(a, statbuf+offset, n); | |
| 1990/0227 | return n; | |
| 1991/0705 | 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; | |
| 1990/0227 | } | |
| 1990/11211 | error(Egreg); | |
| 1990/0227 | } | |
| 1991/0614/sys/src/9/port/devproc.c:404,414 – 1991/0705/sys/src/9/port/devproc.c:424,454 | ||
| 1990/0227 | switch(QID(c->qid)){ case Qctl: | |
| 1991/0705 | if(n >= 4 && strncmp(va, "exit", 4) == 0) { if(p->state == Broken) { ready(p); break; } } | |
| 1990/0227 | else | |
| 1990/11211 |
| |
| 1990/0227 |
| |
| 1991/0705 | 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); | |
| 1990/0227 | case Qnote: | |
| 1990/0614 | k = kmap(p->upage); up = (User*)VA(k); | |