plan 9 kernel history: overview | file list | diff list

1993/0818/port/devproc.c (diff list | history)

1993/0501/sys/src/9/port/devproc.c:10,261993/0818/sys/src/9/port/devproc.c:10,28 (short | long | prev | next)
1990/0227    
 
1993/0501    
enum 
{ 
1990/0227    
	Qdir, 
	Qctl, 
1993/0818    
	Qdir, 
	Qfpregs, 
	Qkregs, 
1990/0227    
	Qmem, 
	Qnote, 
1990/1110    
	Qnotepg, 
1990/0227    
	Qproc, 
1993/0818    
	Qns, 
	Qregs, 
1991/0705    
	Qsegment, 
1990/0227    
	Qstatus, 
	Qtext, 
1993/0309    
	Qwait, 
1993/0501    
	Qns, 
1990/0227    
}; 
 
1992/0814    
#define	STATSIZE	(2*NAMELEN+12+7*12) 
1993/0501/sys/src/9/port/devproc.c:27,411993/0818/sys/src/9/port/devproc.c:29,45
1992/0824    
Dirtab procdir[] = 
{ 
1991/1109    
	"ctl",		{Qctl},		0,			0000, 
1993/0818    
	"fpregs",	{Qfpregs},	sizeof(FPsave),		0000, 
	"kregs",	{Qkregs},	sizeof(Ureg),		0000, 
1991/1109    
	"mem",		{Qmem},		0,			0000, 
	"note",		{Qnote},	0,			0000, 
1991/1112    
	"notepg",	{Qnotepg},	0,			0000, 
1991/1109    
	"proc",		{Qproc},	sizeof(Proc),		0000, 
1993/0818    
	"ns",		{Qns},		0,			0400, 
	"regs",		{Qregs},	sizeof(Ureg),		0000, 
1991/1112    
	"segment",	{Qsegment},	0,			0444, 
	"status",	{Qstatus},	STATSIZE,		0444, 
1991/1109    
	"text",		{Qtext},	0,			0000, 
1993/0309    
	"wait",		{Qwait},	0,			0400, 
1993/0501    
	"ns",		{Qns},		0,			0400, 
1990/0227    
}; 
 
1991/1109    
/* Segment type from portdat.h */ 
1993/0501/sys/src/9/port/devproc.c:173,1881993/0818/sys/src/9/port/devproc.c:177,200
1990/0227    
		tc->offset = 0; 
		return tc; 
1991/1110    
 
1993/0818    
	case Qkregs: 
	case Qsegment: 
		if(omode != OREAD) 
			error(Eperm); 
		break; 
 
1990/0227    
	case Qctl: 
	case Qnote: 
1991/1110    
	case Qmem: 
1991/0705    
	case Qsegment: 
1991/1112    
	case Qproc: 
	case Qstatus: 
1993/0309    
	case Qwait: 
1993/0818    
	case Qregs: 
	case Qfpregs: 
1990/0227    
		break; 
1990/1110    
 
1993/0501    
	case Qns: 
1993/0818    
		if(omode != OREAD) 
			error(Eperm); 
1993/0501    
		c->aux = malloc(sizeof(Mntwalk)); 
		break; 
 
1993/0501/sys/src/9/port/devproc.c:251,2591993/0818/sys/src/9/port/devproc.c:263,273
1990/0227    
{ 
1993/0501    
	long l; 
1990/0227    
	Proc *p; 
1991/0705    
	int i, j; 
1993/0309    
	Waitq *wq; 
1993/0818    
	Ureg kur; 
	uchar *rptr; 
1993/0501    
	Mntwalk *mw; 
1993/0818    
	int i, j, rsize; 
1993/0501    
	Segment *sg, *s; 
	char *a = va, *sps; 
	char statbuf[NSEG*32]; 
1993/0501/sys/src/9/port/devproc.c:267,3001993/0818/sys/src/9/port/devproc.c:281,314
1990/0227    
 
	switch(QID(c->qid)){ 
	case Qmem: 
1991/1110    
		if(offset >= KZERO) { 
1992/0824    
			/* Protect crypt key memory */ 
1993/0501    
			if(offset >= palloc.cmembase&&offset < palloc.cmemtop) 
1992/0824    
				error(Eperm); 
1993/0818    
		if(offset < KZERO) 
			return procctlmemio(p, offset, n, va, 1); 
1992/0824    
 
1992/0128    
			/* validate physical kernel addresses */ 
1992/0628    
			if(offset < (ulong)end) { 
				if(offset+n > (ulong)end) 
					n = (ulong)end - offset; 
1991/1110    
				memmove(a, (char*)offset, n); 
				return n; 
			} 
1992/0628    
			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; 
1991/1110    
				memmove(a, (char*)offset, n); 
				return n; 
			} 
1993/0818    
		/* 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); 
			break; 
1990/0227    
		} 
1993/0818    
		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); 
1991/1109    
 
		return procctlmemio(p, offset, n, va, 1); 
                 
1990/0227    
	case Qnote: 
1991/1216    
		qlock(&p->debug); 
1990/0227    
		if(waserror()){ 
1993/0501/sys/src/9/port/devproc.c:319,3301993/0818/sys/src/9/port/devproc.c:333,360
1991/1216    
		qunlock(&p->debug); 
1990/0227    
		return n; 
 
	case Qproc: 
1991/0411    
		if(offset >= sizeof(Proc)) 
1993/0818    
	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) 
1990/0227    
			return 0; 
1991/0411    
		if(offset+n > sizeof(Proc)) 
			n = sizeof(Proc) - offset; 
		memmove(a, ((char*)p)+offset, n); 
1993/0818    
		if(offset+n > rsize) 
			n = rsize - offset; 
		memmove(a, rptr+offset, n); 
1990/0227    
		return n; 
 
	case Qstatus: 
1993/0501/sys/src/9/port/devproc.c:362,3721993/0818/sys/src/9/port/devproc.c:392,406
1991/1110    
 
1991/0705    
	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' : ' ', 
1993/0818    
		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' : ' ', 
1991/0705    
				sg->base, sg->top, sg->ref); 
1993/0818    
		} 
1991/0705    
		if(offset >= j) 
			return 0; 
		if(offset+n > j) 
1993/0501/sys/src/9/port/devproc.c:504,5091993/0818/sys/src/9/port/devproc.c:538,559
1992/0114    
			error(Ebadctl); 
1991/1110    
 
1993/0501    
		n = procctlmemio(p, offset, n, va, 0); 
1993/0818    
		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); 
1991/1110    
		break; 
 
1990/0227    
	case Qctl: 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)