~kris/9p

9hist

045b8506669b848ada0b2c20e6c65be518aab0d9 — David du Colombier 36 years ago f2df868
Plan 9 from Bell Labs 1990-03-03
6 files changed, 47 insertions(+), 40 deletions(-)

M port/chan.c
M port/dev.c
M port/devmnt.c
M port/page.c
M power/dat.h
M power/io.h
M port/chan.c => port/chan.c +2 -0
@@ 78,6 78,8 @@ loop:
		c->offset = 0;
		c->mnt = 0;
		c->stream = 0;
		c->mchan = 0;
		c->mqid = 0;
		return c;
	}
	unlock(&chanalloc);

M port/dev.c => port/dev.c +2 -0
@@ 76,6 76,8 @@ devclone(Chan *c, Chan *nc)
	nc->dev = c->dev;
	nc->flag = c->flag;
	nc->mnt = c->mnt;
	nc->mchan = c->mchan;
	nc->mqid = c->mqid;
	return nc;
}


M port/devmnt.c => port/devmnt.c +25 -13
@@ 18,6 18,7 @@ struct Mnt
{
	Ref;			/* for number of chans, incl. mntpt but not msg */
	QLock;			/* for access */
	ulong	mntid;		/* serial # */
	Chan	*msg;		/* for reading and writing messages */
	Chan	*mntpt;		/* channel in user's name space */
};


@@ 50,6 51,12 @@ struct
	Mnthdr	*free;
}mnthdralloc;

struct
{
	Lock;
	long	id;
}mntid;

Mnt	*mnt;
void	mntxmit(Mnt*, Mnthdr*);



@@ 119,19 126,17 @@ Mnt*
mntdev(int dev, int noerr)
{
	Mnt *m;
	int i;

	if(dev<0 || conf.nmntdev<=dev){
		if(noerr)
			return 0;
		panic("mntdev out of range");
	}
	m = &mnt[dev];
	if(m->msg == 0){
		if(noerr)
			return 0;
		error(0, Eshutdown);
	}
	return m;
	for(m=mnt,i=0; i<conf.nmntdev; i++,m++)		/* use a hash table some day */
		if(m->mntid == dev){
			if(m->msg == 0)
				break;
			return m;
		}
	if(noerr)
		return 0;
	error(0, Eshutdown);
}

void


@@ 187,8 192,11 @@ mntattach(char *spec)
    Found:
	m->ref = 1;
	unlock(m);
	lock(&mntid);
	m->mntid = ++mntid.id;
	unlock(&mntid);
	c = devattach('M', spec);
	c->dev = m - mnt;
	c->dev = m->mntid;
	m->mntpt = c;
	cm = bogus.chan;
	m->msg = cm;


@@ 205,6 213,8 @@ mntattach(char *spec)
	strcpy(mh->thdr.aname, spec);
	mntxmit(m, mh);
	c->qid = mh->rhdr.qid;
	c->mchan = m->msg;
	c->mqid = c->qid;
	mhfree(mh);
	poperror();
	return c;


@@ 243,6 253,8 @@ mntclone(Chan *c, Chan *nc)
	nc->flag = c->flag;
	nc->offset = c->offset;
	nc->mnt = c->mnt;
	nc->mchan = c->mchan;
	nc->mqid = c->qid;
	if(new)
		poperror();
	mhfree(mh);

M port/page.c => port/page.c +14 -12
@@ 77,17 77,18 @@ audit(char *s)
{
	int nf, nb;
	Page *p;
	static int here;

static int here;
do;while(here);
here=1;

	do;while(here);
	here=1;
	p = palloc.head;
	nf=nb=0;
	while(p){
print("%lux %lux %d\n", p->pa, p->va, p->ref);
if(p->o) print("\t%d %lux %c\n", p->o->nproc, p->o->qid, devchar[p->o->type]);
delay(100);
		print("%lux %lux %d\n", p->pa, p->va, p->ref);
		if(p->o){
			print("\t%d %lux %c\n", p->o->nproc, p->o->qid, devchar[p->o->type]);
			delay(100);	/* let it drain; there's a lot here */
		}
		nf++;
		p = p->next;
	}


@@ 98,7 99,7 @@ delay(100);
	}
	print("%s: nf: %d nb: %d\n", s, nf, nb);
	delay(1000);
here=0;
	here=0;
}

void


@@ 187,7 188,6 @@ loop:
		}
#endif
	}
	audit("newpage");
	print("no physical memory\n");
	unlock(&palloc);
	if(u == 0)


@@ 257,7 257,7 @@ lookorig(ulong va, ulong npte, int flag, Chan *c)
			lock(o);
			if(o->npage && o->qid==c->qid)
			if(o->va==va && o->npte==npte && o->flag==flag)
			if(o->type==c->type && o->dev==c->dev){
			if(o->mchan==c->mchan && o->mqid==c->mqid && o->type==c->type){
				if(o->chan == 0){
					o->chan = c;
					incref(c);


@@ 289,13 289,15 @@ loop:
		o->chan = c;
		if(c){
			o->type = c->type;
			o->dev = c->dev;
			o->qid = c->qid;
			o->mchan = c->mchan;
			o->mqid = c->mqid;
			incref(c);
		}else{
			o->type = -1;
			o->dev = -1;
			o->qid = -1;
			o->mqid = -1;
			o->mchan = 0;
		}
		growpte(o, npte);
		unlock(&origalloc);

M power/dat.h => power/dat.h +4 -1
@@ 94,6 94,8 @@ struct Chan
	ulong	mountid;
	int	fid;			/* for devmnt */
	Stream	*stream;		/* for stream channels */
	Chan	*mchan;			/* channel to mounted server */
	ulong	mqid;			/* qid of root of mount point */
};

struct	FPsave


@@ 226,8 228,9 @@ struct Orig
	PTE	*pte;
	Chan	*chan;			/* channel deriving segment (if open) */
	ushort	type;			/* of channel (which could be non-open) */
	ushort	dev;
	ulong	qid;
	Chan	*mchan;
	ulong	mqid;
	ulong	minca;			/* base of region in chan */
	ulong	maxca;			/* end of region in chan */
};

M power/io.h => power/io.h +0 -14
@@ 78,17 78,3 @@ struct INTVEC {
#define	MPBERR0		IO2(ulong, 0xF48000)
#define	MPBERR1		IO2(ulong, 0xF4C000)
#define SBEADDR		((ulong *)(UNCACHED|0x1f080000))

/*
 *  hsvme datakit board
 */
struct hsvme {
	ushort	version;
	ushort	pad0x02;
	ushort	vector;
	ushort	pad0x06;
	ushort	csr;
	ushort	pad0x0A;
	ushort	data;
};
#define HSVME		VMEA24SUP(struct hsvme, 0xF90000)