M boot/key.c => boot/key.c +3 -0
@@ 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);
M port/dev.c => port/dev.c +0 -5
@@ 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);
M port/devcons.c => port/devcons.c +12 -5
@@ 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++;
M port/devpipe.c => port/devpipe.c +13 -2
@@ 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;
}
M port/netif.c => port/netif.c +12 -12
@@ 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)];
M port/qio.c => port/qio.c +3 -2
@@ 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 {
M port/segment.c => port/segment.c +46 -48
@@ 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);
-}
M port/sysproc.c => port/sysproc.c +2 -0
@@ 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;