~kris/9p

9hist

1fd95ca6a71de3f7900bdae8fc3c03e09a0ea8f4 — David du Colombier 31 years ago 504ce4c
Plan 9 from Bell Labs 1994-11-11
3 files changed, 167 insertions(+), 39 deletions(-)

M boot/boot.c
M pc/devastar.c
M pc/main.c
M boot/boot.c => boot/boot.c +5 -1
@@ 19,6 19,7 @@ int	mflag;
int	fflag;
int	kflag;
int	aflag;
int	nflag;
int	pflag;
int	afd = -1;



@@ 65,6 66,9 @@ boot(int argc, char *argv[])
	case 'k':
		kflag = 1;
		break;
	case 'n':
		nflag = 1;
		break;
	case 'm':
		pflag = 1;
		mflag = 1;


@@ 125,7 129,7 @@ boot(int argc, char *argv[])
	if(mount(fd, "/", MAFTER|MCREATE, "") < 0)
		fatal("mount");
	close(fd);
	if(cpuflag == 0)
	if(cpuflag == 0 && nflag == 0)
		newkernel();

	/*

M pc/devastar.c => pc/devastar.c +160 -37
@@ 7,7 7,6 @@
#include	"../port/error.h"

#include	"devtab.h"
#include	"../port/netif.h"

/*
 *  Stargate's Avanstar serial board.  There are ISA, EISA, microchannel


@@ 215,9 214,10 @@ struct Astar
{
	ISAConf;
	int		id;		/* from plan9.ini */
	int		nchan;		/* number of channels */
	Astarchan	*c;		/* channels */
	int		ramsize;	/* 16k or 256k */
	GCB		*gbc;		/* board comm area */
	Astarchan	*c;		/* channels */
};

/* host per channel info */


@@ 227,27 227,89 @@ struct Astarchan

	Astar	*a;	/* controller */
	CCB	*ccb;	/* control block */
	int	perm;

	/* buffers */
	Queue	*iq;
	Queue	*oq;


	/* staging areas to avoid some of the per character costs */
	uchar	istage[Stagesize];
	uchar	*ip;
	uchar	*ie;

	uchar	ostage[Stagesize];
	uchar	*op;
	uchar	*oe;
};

Astar *astar[Maxcard];
int nastar;
static int nastar;

enum
{
	Qmem=	0,
	Qdata,
	Qctl,
	Qstat,
};
#define TYPE(x)		((x)&0xff)
#define BOARD(x)	((((x)&~CHDIR)>>16)&0xff)
#define CHAN(x)		((((x)&~CHDIR)>>8)&0xff)
#define QID(b,c,t)	(((b)<<16)|((c)<<8)|(t))

static int astarsetup(Astar*);

int
devgen(Chan *c, Dirtab *tab, int ntab, int i, Dir *db)
{
	int dev, sofar, ch, t;

	USED(tab, ntab);
	sofar = 0;

	for(dev = 0; dev < nstar; dev++){
		if(sofar == i){
			sprint(db->name, "atar%dmem", astar[dev].id);
			db->qid = QID(dev, 0, Qmem);
			db->mode = 0660;
			break;
		}

		if(i < sofar + 3*astar[dev].nchan){
			i -= sofar;
			ch = i/3;
			t = i%3;
			switch(t){
			case 0:
				sprint(db->name, "eia%d%2.2d", dev, ch);
				db->mode = astar[dev]->c[ch].perm;
				db->qid = QID(dev, 0, Qdata);
				break;
			case 1:
				sprint(db->name, "eia%d%2.2dctl", dev, ch);
				db->mode = astar[dev]->c[ch].perm;
				db->qid = QID(dev, 0, Qctl);
				break;
			case 2:
				sprint(db->name, "eia%d%2.2dstat", dev, ch);
				db->mode = 0444;
				db->qid = QID(dev, 0, Qstat);
				break;
			break;
		}

		sofar += 1 + 3*astar[dev].nchan;
	}

	if(j == nstar)
		return -1;

	db->atime = seconds();
	db->mtime = kerndate;
	db->hlength = 0;
	db->length = length;
	memmove(db->uid, eve, NAMELEN);
	memmove(db->gid, eve, NAMELEN);
	db->type = devchar[c->type];
	db->dev = c->dev;
	if(c->flag&CMSG)
		db->mode |= CHMOUNT;

	return 1;
}

void
astarreset(void)
{


@@ 283,30 345,6 @@ astarreset(void)
		}
		nastar++;
	}

	ndir = 3*nuart;
	ns16552dir = xalloc(ndir * sizeof(Dirtab));
	dp = ns16552dir;
	for(i = 0; i < nuart; i++){
		/* 3 directory entries per port */
		sprint(dp->name, "eia%d", i);
		dp->qid.path = NETQID(i, Ndataqid);
		dp->perm = 0660;
		dp++;
		sprint(dp->name, "eia%dctl", i);
		dp->qid.path = NETQID(i, Nctlqid);
		dp->perm = 0660;
		dp++;
		sprint(dp->name, "eia%dstat", i);
		dp->qid.path = NETQID(i, Nstatqid);
		dp->perm = 0444;
		dp++;
	}
}

void
astarinit(void)
{
}

/* isa ports an ax00i can appear at */


@@ 363,3 401,88 @@ astarsetup(Astar *a)

	return 0;
}

void
astarinit(void)
{
}

Chan*
astarattach(char *spec)
{
	return devattach('g', spec);
}

Chan*
astarclone(Chan *c, Chan *nc)
{
	return devclone(c, nc);
}

int
astarwalk(Chan *c, char *name)
{
	return devwalk(c, name, 0, 0, astargen);
}

void
astarstat(Chan *c, char *dp)
{
	devstat(c, dp, 0, 0, astargen);
}

Chan*
astaropen(Chan *c, int omode)
{
	Uart *p;

	c = devopen(c, omode, 0, 0, astargen);

	return c;
}

void
astarcreate(Chan *c, char *name, int omode, ulong perm)
{
	USED(c, name, omode, perm);
	error(Eperm);
}

void
astarclose(Chan *c)
{
	USED(c);
}

long
astarread(Chan *c, void *buf, long n, ulong offset)
{
	Astar *a;

	if(c->qid.path & CHDIR)
		return devdirread(c, buf, n, 0, 0, astargen);

	switch(TYPE(c->qid.path)){
	case Qmem:
		a = astar[
		return qread(p->iq, buf, n);
	}

	return 0;
}

long
astarwrite(Chan *c, void *buf, long n, ulong offset)
{
	Uart *p;

	if(c->qid.path & CHDIR)
		error(Eperm);

	switch(TYPE(c->qid.path)){
	case Qmem:
		return qread(p->iq, buf, n);
	}

	return 0;
}

M pc/main.c => pc/main.c +2 -1
@@ 237,7 237,8 @@ bootargs(ulong base)
	} else if(strncmp(cp, "sd!", 3) == 0){
		sprint(buf, "local!#w/sd%ddisk", atoi(cp+3));
		av[ac++] = pusharg(buf);
	}
	} else if(strncmp(cp, "e!", 2) == 0)
		av[ac++] = pusharg("-n");
	if(buf[0]){
		cp = strchr(buf, '!');
		if(cp){