From 1bdb04845e6d36a8a38e1f6a46b727caa4e3f1e4 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sun, 25 Jul 1993 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1993-07-25 --- boot/key.c | 3 ++ port/dev.c | 5 --- port/devcons.c | 17 ++++++--- port/devpipe.c | 15 ++++++-- port/netif.c | 24 ++++++------- port/qio.c | 5 +-- port/segment.c | 94 ++++++++++++++++++++++++-------------------------- port/sysproc.c | 2 ++ 8 files changed, 91 insertions(+), 74 deletions(-) diff --git a/boot/key.c b/boot/key.c index 8220bf7da3b4cff4acff0807198ac7bb0290a5ce..b567571ea702e1497b2a4f6fbee549f118d05c21 100644 --- a/boot/key.c +++ b/boot/key.c @@ -46,10 +46,13 @@ key(int islocal, Method *mp) warning("bad authentication id"); if(getsafe(safe.authdom, DOMLEN, &safe.authdomsum, "#e/authdom", 0) < 0) warning("bad authentication domain"); + if(kflag){ + do getpasswd(password, sizeof password); while(!passtokey(safe.machkey, password)); + outin("authid", safe.authid, sizeof(safe.authid)); outin("authdom", safe.authdom, sizeof(safe.authdom)); safe.machsum = nvcsum(safe.machkey, DESKEYLEN); diff --git a/port/dev.c b/port/dev.c index 4b246f0fb95fe0f587c43ea85af757db5012a1b8..c80c210993488b3f09ec5510eaba6e8f31aa9199 100644 --- a/port/dev.c +++ b/port/dev.c @@ -143,11 +143,6 @@ devstat(Chan *c, char *db, Dirtab *tab, int ntab, Devgen *gen) for(i=0;; i++) switch((*gen)(c, tab, ntab, i, &dir)){ case -1: - /* - * given a channel, we cannot derive the directory name - * that the channel was generated from since it was lost - * by namec. - */ if(c->qid.path & CHDIR){ devdir(c, c->qid, c->path->elem, i*DIRLEN, eve, CHDIR|0555, &dir); convD2M(&dir, db); diff --git a/port/devcons.c b/port/devcons.c index 0c90b337db68d3236498604f2bcf0a94f7d78de7..691f621ab61825fca047d30cd689daaa865df74c 100644 --- a/port/devcons.c +++ b/port/devcons.c @@ -446,12 +446,12 @@ consclose(Chan *c) long consread(Chan *c, void *buf, long n, ulong offset) { - int ch, i, k, id; ulong l; - char *cbuf = buf; - char *b, *bp; - char tmp[128]; /* must be >= 6*NUMSIZE */ Mach *mp; + char *b, *bp; + char tmp[128]; /* must be >= 6*NUMSIZE */ + char *cbuf = buf; + int ch, i, k, id, eol; if(n <= 0) return n; @@ -474,6 +474,7 @@ consread(Chan *c, void *buf, long n, ulong offset) splx(i); continue; } + eol = 0; switch(ch){ case '\b': if(kbd.x) @@ -482,18 +483,23 @@ consread(Chan *c, void *buf, long n, ulong offset) case 0x15: kbd.x = 0; break; + case '\n': + case 0x04: + eol = 1; default: kbd.line[kbd.x++] = ch; break; } - if(kbd.x == sizeof(kbd.line) || ch == '\n' || ch == 0x04){ + if(kbd.x == sizeof(kbd.line) || eol){ if(ch == 0x04) kbd.x--; qwrite(lineq, kbd.line, kbd.x, 1); + kbd.x = 0; } } n = qread(lineq, buf, n); qunlock(&kbd); + poperror(); return n; case Qcputime: @@ -697,6 +703,7 @@ conswrite(Chan *c, void *va, long n, ulong offset) qunlock(&kbd); } else if(strncmp(a, "rawoff", 6) == 0){ kbd.raw = 0; + kbd.x = 0; } if(a = strchr(a, ' ')) a++; diff --git a/port/devpipe.c b/port/devpipe.c index 4193ae6201282c1e433d7a7e9684915ffa843d5c..ce314cb5ea42ed59eee317ec24bd96bcf91b2bd4 100644 --- a/port/devpipe.c +++ b/port/devpipe.c @@ -297,15 +297,26 @@ pipewrite(Chan *c, void *va, long n, ulong offset) USED(offset); + if(waserror()) { + postnote(up, 1, "sys: write on closed pipe", NUser); + error(Ehungup); + } + p = c->aux; switch(NETTYPE(c->qid.path)){ case Qdata0: - return qwrite(p->q[1], va, n, 0); + n = qwrite(p->q[1], va, n, 0); + break; + case Qdata1: - return qwrite(p->q[0], va, n, 0); + n = qwrite(p->q[0], va, n, 0); + break; + default: panic("piperead"); } + + poperror(); return n; } diff --git a/port/netif.c b/port/netif.c index d6afccfa2d26836a3f317cefe6a0e7ca8dc4aae1..da6059e6aa977ea4fddf2dbdb3b060ae5da8a2c3 100644 --- a/port/netif.c +++ b/port/netif.c @@ -97,7 +97,7 @@ netifgen(Chan *c, void *vp, int ntab, int i, Dir *dp) break; case 2: q.path = NETQID(NETID(c->qid.path), Nstatqid); - devdir(c, q, "stat", 0, eve, 0444, dp); + devdir(c, q, "stats", 0, eve, 0444, dp); break; case 3: q.path = NETQID(NETID(c->qid.path), Ntypeqid); @@ -158,8 +158,8 @@ netifopen(Netif *nif, Chan *c, int omode) long netifread(Netif *nif, Chan *c, void *a, long n, ulong offset) { + int i, j; Netfile *f; - int i; char buf[256]; if(c->qid.path&CHDIR) @@ -172,17 +172,17 @@ netifread(Netif *nif, Chan *c, void *a, long n, ulong offset) case Nctlqid: return readnum(offset, a, n, NETID(c->qid.path), NUMSIZE); case Nstatqid: - n = sprint(buf, "in: %d\n", nif->inpackets); - n += sprint(buf+n, "out: %d\n", nif->outpackets); - n += sprint(buf+n, "crc errs: %d\n", nif->crcs); - n += sprint(buf+n, "overflows: %d\n", nif->overflows); - n += sprint(buf+n, "framing errs: %d\n", nif->frames); - n += sprint(buf+n, "buffer errs: %d\n", nif->buffs); - n += sprint(buf+n, "output errs: %d\n", nif->oerrs); - n += sprint(buf+n, "addr:", nif->oerrs); + j = sprint(buf, "in: %d\n", nif->inpackets); + j += sprint(buf+j, "out: %d\n", nif->outpackets); + j += sprint(buf+j, "crc errs: %d\n", nif->crcs); + j += sprint(buf+j, "overflows: %d\n", nif->overflows); + j += sprint(buf+j, "framing errs: %d\n", nif->frames); + j += sprint(buf+j, "buffer errs: %d\n", nif->buffs); + j += sprint(buf+j, "output errs: %d\n", nif->oerrs); + j += sprint(buf+j, "addr: "); for(i = 0; i < nif->alen; i++) - n += sprint(buf+n, "%2.2ux", nif->addr[i]); - n += sprint(buf+n, "\n"); + j += sprint(buf+j, "%2.2ux", nif->addr[i]); + sprint(buf+j, "\n"); return readstr(offset, a, n, buf); case Ntypeqid: f = nif->f[NETID(c->qid.path)]; diff --git a/port/qio.c b/port/qio.c index dc3c2d27a8ad181e3dcb169ae2d1fcc0e9b696f7..f7a366f589f2b1833fb889d9f1dbcef2da959745 100644 --- a/port/qio.c +++ b/port/qio.c @@ -178,7 +178,7 @@ iallocinit(void) } /* start garbage collector */ - kproc("iallockproc", iallockproc, 0); + kproc("ialloc", iallockproc, 0); } Block* @@ -407,6 +407,7 @@ qread(Queue *q, void *vp, int len) if(q->state & Qclosed){ unlock(q); splx(x); +print("Qclosed %lux\n", q); return 0; } @@ -439,7 +440,7 @@ qread(Queue *q, void *vp, int len) memmove(p, b->rp, n); b->rp += n; - /* free it or put it what's left on the queue */ + /* free it or put what's left on the queue */ if(b->rp >= b->wp || (q->state&Qmsg)) free(b); else { diff --git a/port/segment.c b/port/segment.c index a4f44276b8b1494033a419eb99df8a8f17be513e..652b230736631216e41fc6476ceb7a16527a38e4 100644 --- a/port/segment.c +++ b/port/segment.c @@ -5,7 +5,8 @@ #include "fns.h" #include "../port/error.h" -Page *snewpage(ulong addr); +Page *lkpage(Segment*, ulong); +void lkpgfree(Page*); void imagereclaim(void); /* System specific segattach devices */ @@ -61,33 +62,38 @@ putseg(Segment *s) return; i = s->image; - if(i && i->s == s && s->ref == 1) { + if(i != 0) { lock(i); - if(s->ref == 1) + lock(s); + if(i->s == s && s->ref == 1) i->s = 0; unlock(i); } + else + lock(s); - if(decref(s) == 0) { - qlock(&s->lk); - if(i) - putimage(i); + s->ref--; + if(s->ref != 0) { + unlock(s); + return; + } - emap = &s->map[SEGMAPSIZE]; - for(pp = s->map; pp < emap; pp++) - if(*pp) - freepte(s, *pp); + qlock(&s->lk); + if(i) + putimage(i); - qunlock(&s->lk); + emap = &s->map[SEGMAPSIZE]; + for(pp = s->map; pp < emap; pp++) + if(*pp) + freepte(s, *pp); - free(s); - } + qunlock(&s->lk); + free(s); } void relocateseg(Segment *s, ulong offset) { - int i; Pte **p, **endpte; Page **pg, **endpages; @@ -96,11 +102,8 @@ relocateseg(Segment *s, ulong offset) if(*p) { endpages = &((*p)->pages[PTEPERTAB]); for(pg = (*p)->pages; pg < endpages; pg++) - if(*pg){ + if(*pg) (*pg)->va += offset; - for(i = 0; i < MAXMACH; i++) - (*pg)->cachectl[i] |= PG_DATINVALID; - } } } } @@ -243,8 +246,14 @@ found: unlock(&imagealloc); if(i->s == 0) { + /* Disaster after commit in exec */ + if(waserror()) { + unlock(i); + pexit(Enovmem, 1); + } i->s = newseg(type, base, len); i->s->image = i; + poperror(); } else incref(i->s); @@ -404,7 +413,7 @@ segattach(Proc *p, ulong attr, char *name, ulong va, ulong len) int i, sno; USED(p); - if((va&KZERO) == KZERO) /* BUG: Only ok for now */ + if((va&KZERO) == KZERO) /* BUG: Only ok for now */ error(Ebadarg); validaddr((ulong)name, 1, 0); @@ -438,15 +447,13 @@ found: if(len > ps->size) error(Enovmem); - attr &= ~SG_TYPE; /* Turn off what we are not allowed */ - attr |= ps->attr; /* Copy in defaults */ + attr &= ~SG_TYPE; /* Turn off what we are not allowed */ + attr |= ps->attr; /* Copy in defaults */ s = newseg(attr, va, len/BY2PG); s->pseg = ps; up->seg[sno] = s; - /* Need some code build mapped devices here */ - return 0; } @@ -454,7 +461,7 @@ long syssegflush(ulong *arg) { Segment *s; - int i, j, pages; + int i, j, len; ulong soff; Page *pg; @@ -466,33 +473,24 @@ syssegflush(ulong *arg) soff = arg[0]-s->base; j = (soff&(PTEMAPMEM-1))/BY2PG; - pages = ((arg[0]+arg[1]+(BY2PG-1))&~(BY2PG-1))-(arg[0]&~(BY2PG-1)); + len = arg[1]+BY2PG; - for(i = soff/PTEMAPMEM; i < SEGMAPSIZE; i++) { - if(pages <= 0) - goto done; - if(s->map[i]) { - while(j < PTEPERTAB) { - if(pg = s->map[i]->pages[j]) - for(i = 0; i < MAXMACH; i++) - pg->cachectl[i] |= PG_TXTFLUSH; - if(--pages == 0) - goto done; - j++; - } - j = 0; + for(i = soff/PTEMAPMEM; len > 0 && i < SEGMAPSIZE; i++) { + if(s->map[i] == 0) { + len -= PTEMAPMEM; + continue; } - else - pages -= PTEMAPMEM/BY2PG; + while(len > 0 && j < PTEPERTAB) { + pg = s->map[i]->pages[j]; + if(pg != 0) + memset(pg->cachectl, PG_TXTFLUSH, sizeof pg->cachectl); + j++; + len -= BY2PG; + } + j = 0; } -done: + qunlock(&s->lk); flushmmu(); return 0; } - -Page* -snewpage(ulong addr) -{ - return newpage(1, 0, addr); -} diff --git a/port/sysproc.c b/port/sysproc.c index f3f5e19fc8229cd9c3258711f1cde0ba44c61379..f8bcc3ae3af654b1d3a1751e3f109e0f9424bc71 100644 --- a/port/sysproc.c +++ b/port/sysproc.c @@ -294,6 +294,7 @@ sysexec(ulong *arg) if((ssize+4) & 7) ssize += 4; spage = (ssize+(BY2PG-1)) >> PGSHIFT; +print("ssize %d spage %lux\n", ssize, spage); /* * Build the stack segment, putting it in kernel virtual for the moment */ @@ -318,6 +319,7 @@ sysexec(ulong *arg) argp = (char**)arg[1]; } *argv++ = charp + (USTKTOP-TSTKTOP); +print("arg[%d] %s\n", i, *argp); n = strlen(*argp) + 1; memmove(charp, *argp++, n); charp += n;