~kris/9p

9hist

2b010f019af18a989e4ff72d7ee51ee491fdabaf — David du Colombier 33 years ago 641ff7e
Plan 9 from Bell Labs 1993-08-18
6 files changed, 99 insertions(+), 57 deletions(-)

M port/devproc.c
M port/error.h
M port/page.c
M port/portdat.h
M power/mem.h
M power/trap.c
M port/devproc.c => port/devproc.c +93 -43
@@ 10,32 10,36 @@

enum
{
	Qdir,
	Qctl,
	Qdir,
	Qfpregs,
	Qkregs,
	Qmem,
	Qnote,
	Qnotepg,
	Qproc,
	Qns,
	Qregs,
	Qsegment,
	Qstatus,
	Qtext,
	Qwait,
	Qns,
};

#define	STATSIZE	(2*NAMELEN+12+7*12)
Dirtab procdir[] =
{
	"ctl",		{Qctl},		0,			0000,
	"fpregs",	{Qfpregs},	sizeof(FPsave),		0000,
	"kregs",	{Qkregs},	sizeof(Ureg),		0000,
	"mem",		{Qmem},		0,			0000,
	"note",		{Qnote},	0,			0000,
	"notepg",	{Qnotepg},	0,			0000,
	"proc",		{Qproc},	sizeof(Proc),		0000,
	"ns",		{Qns},		0,			0400,
	"regs",		{Qregs},	sizeof(Ureg),		0000,
	"segment",	{Qsegment},	0,			0444,
	"status",	{Qstatus},	STATSIZE,		0444,
	"text",		{Qtext},	0,			0000,
	"wait",		{Qwait},	0,			0400,
	"ns",		{Qns},		0,			0400,
};

/* Segment type from portdat.h */


@@ 173,16 177,24 @@ procopen(Chan *c, int omode)
		tc->offset = 0;
		return tc;

	case Qkregs:
	case Qsegment:
		if(omode != OREAD)
			error(Eperm);
		break;

	case Qctl:
	case Qnote:
	case Qmem:
	case Qsegment:
	case Qproc:
	case Qstatus:
	case Qwait:
	case Qregs:
	case Qfpregs:
		break;

	case Qns:
		if(omode != OREAD)
			error(Eperm);
		c->aux = malloc(sizeof(Mntwalk));
		break;



@@ 251,9 263,11 @@ procread(Chan *c, void *va, long n, ulong offset)
{
	long l;
	Proc *p;
	int i, j;
	Waitq *wq;
	Ureg kur;
	uchar *rptr;
	Mntwalk *mw;
	int i, j, rsize;
	Segment *sg, *s;
	char *a = va, *sps;
	char statbuf[NSEG*32];


@@ 267,33 281,33 @@ procread(Chan *c, void *va, long n, ulong offset)

	switch(QID(c->qid)){
	case Qmem:
		if(offset >= KZERO) {
			/* Protect crypt key memory */
			if(offset >= palloc.cmembase&&offset < palloc.cmemtop)
				error(Eperm);

			/* validate physical kernel addresses */
			if(offset < (ulong)end) {
				if(offset+n > (ulong)end)
					n = (ulong)end - offset;
				memmove(a, (char*)offset, n);
				return n;
			}
			if(offset >= conf.base0 && offset < conf.npage0){
				if(offset+n > conf.npage0)
					n = conf.npage0 - offset;
				memmove(a, (char*)offset, n);
				return n;
			}
			if(offset >= conf.base1 && offset < conf.npage1){
				if(offset+n > conf.npage1)
					n = conf.npage1 - offset;
				memmove(a, (char*)offset, n);
				return n;
			}
		}
		if(offset < KZERO)
			return procctlmemio(p, offset, n, va, 1);

		/* Protect crypt key memory */
		if(offset >= palloc.cmembase&&offset < palloc.cmemtop)
			error(Eperm);

		return procctlmemio(p, offset, n, va, 1);
		/* validate physical kernel addresses */
		if(offset < (ulong)end) {
			if(offset+n > (ulong)end)
				n = (ulong)end - offset;
			memmove(a, (char*)offset, n);
			break;
		}
		if(offset >= conf.base0 && offset < conf.npage0){
			if(offset+n > conf.npage0)
				n = conf.npage0 - offset;
			memmove(a, (char*)offset, n);
			break;
		}
		if(offset >= conf.base1 && offset < conf.npage1){
			if(offset+n > conf.npage1)
				n = conf.npage1 - offset;
			memmove(a, (char*)offset, n);
			break;
		}
		error(Ebadarg);

	case Qnote:
		qlock(&p->debug);


@@ 319,12 333,28 @@ procread(Chan *c, void *va, long n, ulong offset)
		qunlock(&p->debug);
		return n;

	case Qproc:
		if(offset >= sizeof(Proc))
	case Qregs:
		rptr = (uchar*)p->dbgreg;
		rsize = sizeof(Ureg);
		goto regread;

	case Qkregs:
		memset(&kur, 0, sizeof(Ureg));
		kur.pc = p->sched.pc;
		kur.sp = p->sched.sp;
		rptr = (uchar*)&kur;
		rsize = sizeof(Ureg);
		goto regread;

	case Qfpregs:
		rptr = (uchar*)&p->fpsave;
		rsize = sizeof(FPsave);
	regread:
		if(offset >= rsize)
			return 0;
		if(offset+n > sizeof(Proc))
			n = sizeof(Proc) - offset;
		memmove(a, ((char*)p)+offset, n);
		if(offset+n > rsize)
			n = rsize - offset;
		memmove(a, rptr+offset, n);
		return n;

	case Qstatus:


@@ 362,11 392,15 @@ procread(Chan *c, void *va, long n, ulong offset)

	case Qsegment:
		j = 0;
		for(i = 0; i < NSEG; i++)
			if(sg = p->seg[i])
				j += sprint(&statbuf[j], "%-6s %c %.8lux %.8lux %4d\n",
				sname[sg->type&SG_TYPE], sg->type&SG_RONLY ? 'R' : ' ',
		for(i = 0; i < NSEG; i++) {
			sg = p->seg[i];
			if(sg == 0)
				continue;
			j += sprint(&statbuf[j], "%-6s %c %.8lux %.8lux %4d\n",
				sname[sg->type&SG_TYPE],
				sg->type&SG_RONLY ? 'R' : ' ',
				sg->base, sg->top, sg->ref);
		}
		if(offset >= j)
			return 0;
		if(offset+n > j)


@@ 506,6 540,22 @@ procwrite(Chan *c, void *va, long n, ulong offset)
		n = procctlmemio(p, offset, n, va, 0);
		break;

	case Qregs:
		if(offset >= sizeof(Ureg))
			return 0;
		if(offset+n > sizeof(Ureg))
			n = sizeof(Ureg) - offset;
		setregisters(p->dbgreg, (char*)(p->dbgreg)+offset, va, n);
		break;

	case Qfpregs:
		if(offset >= sizeof(FPsave))
			return 0;
		if(offset+n > sizeof(FPsave))
			n = sizeof(FPsave) - offset;
		memmove((uchar*)&p->fpsave+offset, va, n);
		break;

	case Qctl:
		procctlreq(p, va, n);
		break;

M port/error.h => port/error.h +1 -1
@@ 52,7 52,7 @@ extern char Eintr[];		/* interrupted */
extern char Eneedservice[];	/* service required for tcp/udp/il calls */
extern char Enomem[];		/* kernel allocate failed */
extern char Esfnotcached[];	/* subfont not cached */
extern char Egreg[];		/* it's a thermal problem */
extern char Esoverlap[];	/* segments overlap */
extern char Emouseset[];	/* mouse type already set */
extern char Erecover[];		/* failed to recover fd */
extern char Egreg[];		/* coherency problem */

M port/page.c => port/page.c +2 -10
@@ 140,11 140,6 @@ retry:
		goto retry;
	}

if(p->log == 0) {
	p->log = smalloc(8192);
	p->lptr = 0;
}

	uncachepage(p);
	p->ref++;
	p->va = va;


@@ 260,7 255,8 @@ duppage(Page *p)				/* Always call with p locked */
	else
		palloc.tail = np->prev;

	if(palloc.tail) {		/* Link back onto tail to give us lru */
	/* Link back onto tail to give us lru in the free list */
	if(palloc.tail) {
		np->prev = palloc.tail;
		palloc.tail->next = np;
		np->next = 0;


@@ 279,10 275,6 @@ duppage(Page *p)				/* Always call with p locked */
		unlock(np);
		return;
	}
if(np->log == 0) {
	np->log = smalloc(8192);
	np->lptr = 0;
}
	
	uncachepage(np);
	np->va = p->va;

M port/portdat.h => port/portdat.h +0 -3
@@ 312,9 312,6 @@ struct Page
	Page	*next;			/* Lru free list */
	Page	*prev;
	Page	*hash;			/* Image hash chains */

	uchar	*log;
	int	lptr;
};

struct Swapalloc

M power/mem.h => power/mem.h +2 -0
@@ 113,6 113,8 @@
#define	NTLB	64	/* number of entries */
#define	TLBROFF	8	/* offset of first randomly indexed entry */

#define NCOLOR	1
#define getcolor(a)	0
/*
 * Address spaces
 */

M power/trap.c => power/trap.c +1 -0
@@ 80,6 80,7 @@ trap(Ureg *ur)
			fpchk = 1;
		}
	}

	switch(ecode){
	case CINT:
		if(ur->cause&INTR3) {			/* FP trap */