~kris/9p

9hist

1bdb04845e6d36a8a38e1f6a46b727caa4e3f1e4 — David du Colombier 33 years ago 957dfcd
Plan 9 from Bell Labs 1993-07-25
8 files changed, 91 insertions(+), 74 deletions(-)

M boot/key.c
M port/dev.c
M port/devcons.c
M port/devpipe.c
M port/netif.c
M port/qio.c
M port/segment.c
M port/sysproc.c
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;