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

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

1990/0227/sys/src/9/port/devproc.c:82,871990/03081/sys/src/9/port/devproc.c:82,88 (short | long)
1990/0227    
Chan* 
procattach(char *spec) 
{ 
1990/03081    
	Chan *c; 
1990/0227    
	return devattach('p', spec); 
} 
 
1990/0227/sys/src/9/port/devproc.c:110,1151990/03081/sys/src/9/port/devproc.c:111,121
1990/0227    
	Orig *o; 
	Chan *tc; 
 
1990/03081    
	if(c->qid == CHDIR){ 
		if(omode != OREAD) 
			error(0, Eperm); 
		goto done; 
	} 
1990/0227    
	p = proctab(SLOT(c->qid)); 
	if((p->pid&PIDMASK) != PID(c->qid)) 
    Died: 
1990/0227/sys/src/9/port/devproc.c:156,1611990/03081/sys/src/9/port/devproc.c:162,168
1990/0227    
	 */ 
	if(p->state != Dead) 
		c->qid |= (p->pid&PIDMASK)<<PIDSHIFT; 
1990/03081    
   done: 
1990/0227    
	c->mode = omode; 
	c->flag |= COPEN; 
	c->offset = 0; 
1990/03081/sys/src/9/port/devproc.c:147,1551990/0424/sys/src/9/port/devproc.c:147,158 (short | long)
1990/0227    
	case Qnote: 
		break; 
	case Qdir: 
	case Qmem: 
	case Qproc: 
	case Qstatus: 
1990/0424    
		if(omode!=OREAD) 
			error(0, Eperm); 
		break; 
	case Qmem: 
1990/0227    
		if(omode!=OREAD) 
			error(0, Eperm); 
		break; 
1990/0424/sys/src/9/port/devproc.c:147,1611990/0614/sys/src/9/port/devproc.c:147,158 (short | long)
1990/0227    
	case Qnote: 
		break; 
	case Qdir: 
1990/0614    
	case Qmem: 
1990/0227    
	case Qproc: 
	case Qstatus: 
1990/0424    
		if(omode!=OREAD) 
			error(0, Eperm); 
		break; 
	case Qmem: 
1990/0227    
		if(omode!=OREAD) 
			error(0, Eperm); 
		break; 
	default: 
		pprint("unknown qid in devopen\n"); 
		error(0, Egreg); 
1990/0424/sys/src/9/port/devproc.c:204,2091990/0614/sys/src/9/port/devproc.c:201,208
1990/0227    
	Seg *s; 
	Orig *o; 
	Page *pg; 
1990/0614    
	KMap *k; 
	PTE *pte, *opte; 
1990/0227    
	int i; 
	long l; 
	long pid; 
1990/0424/sys/src/9/port/devproc.c:240,2531990/0614/sys/src/9/port/devproc.c:239,263
1990/0227    
				unlock(o); 
				error(0, Egreg); 
			} 
			pg = o->pte[(c->offset-o->va)>>PGSHIFT].page; 
1990/0614    
			pte = &o->pte[(c->offset-o->va)>>PGSHIFT]; 
			if(s->mod){ 
				opte = pte; 
				while(pte = pte->nextmod)	/* assign = */ 
					if(pte->proc == p) 
						break; 
				if(pte == 0) 
					pte = opte; 
			} 
			pg = pte->page; 
1990/0227    
			unlock(o); 
			if(pg == 0){ 
				pprint("nonresident page (complain to rob)\n"); 
1990/0614    
				pprint("nonresident page addr %lux (complain to rob)\n", c->offset); 
1990/0227    
				memset(a, 0, n); 
			}else{ 
				b = (char*)(pg->pa|KZERO); 
1990/0614    
				k = kmap(pg); 
				b = (char*)VA(k); 
1990/0227    
				memcpy(a, b+(c->offset&(BY2PG-1)), n); 
1990/0614    
				kunmap(k); 
1990/0227    
			} 
			return n; 
		} 
1990/0424/sys/src/9/port/devproc.c:259,2731990/0614/sys/src/9/port/devproc.c:269,285
1990/0227    
			pg = p->upage; 
			if(pg==0 || (p->pid&PIDMASK)!=PID(c->qid)) 
				error(0, Eprocdied); 
			b = (char*)(pg->pa|KZERO); 
1990/0614    
			k = kmap(pg); 
			b = (char*)VA(k); 
1990/0227    
			memcpy(a, b+(c->offset-USERADDR), n); 
1990/0614    
			kunmap(k); 
1990/0227    
			return n; 
		} 
 
		/* kernel memory.  BUG: shouldn't be so easygoing. BUG: mem mapping? */ 
		if(c->offset>=KZERO && c->offset<KZERO+conf.npage*BY2PG){ 
			if(c->offset+n > KZERO+conf.npage*BY2PG) 
				n = KZERO+conf.npage*BY2PG - c->offset; 
1990/0614    
		if(c->offset>=KZERO && c->offset<KZERO+conf.npage0*BY2PG){ 
			if(c->offset+n > KZERO+conf.npage0*BY2PG) 
				n = KZERO+conf.npage0*BY2PG - c->offset; 
1990/0227    
			memcpy(a, (char*)c->offset, n); 
			return n; 
		} 
1990/0424/sys/src/9/port/devproc.c:282,2891990/0614/sys/src/9/port/devproc.c:294,303
1990/0227    
		} 
		if((p->pid&PIDMASK) != PID(c->qid)) 
			error(0, Eprocdied); 
		up = (User*)(p->upage->pa|KZERO); 
1990/0614    
		k = kmap(p->upage); 
		up = (User*)VA(k); 
1990/0227    
		if(up->p != p){ 
1990/0614    
			kunmap(k); 
1990/0227    
			pprint("note read u/p mismatch"); 
			error(0, Egreg); 
		} 
1990/0424/sys/src/9/port/devproc.c:297,3021990/0614/sys/src/9/port/devproc.c:311,317
1990/0227    
			memcpy(&up->note[0], &up->note[1], up->nnote*sizeof(Note)); 
			n = ERRLEN; 
		} 
1990/0614    
		kunmap(k); 
1990/0227    
		unlock(&p->debug); 
		return n; 
 
1990/0424/sys/src/9/port/devproc.c:318,3241990/0614/sys/src/9/port/devproc.c:333,339
1990/0227    
			l = p->time[i]; 
			if(i == TReal) 
				l = MACHP(0)->ticks - l; 
			l *= MS2HZ; 
1990/0614    
			l = TK2MS(l); 
1990/0227    
			readnum(0, statbuf+2*NAMELEN+12+NUMSIZE*i, NUMSIZE, l, NUMSIZE); 
		} 
		memcpy(a, statbuf+c->offset, n); 
1990/0424/sys/src/9/port/devproc.c:333,3381990/0614/sys/src/9/port/devproc.c:348,354
1990/0227    
{ 
	Proc *p; 
	User *up; 
1990/0614    
	KMap *k; 
1990/0227    
	char buf[ERRLEN]; 
 
	if(c->qid & CHDIR) 
1990/0424/sys/src/9/port/devproc.c:355,3651990/0614/sys/src/9/port/devproc.c:371,384
1990/0227    
			error(0, Ebadctl); 
		break; 
	case Qnote: 
		up = (User*)(p->upage->pa|KZERO); 
1990/0614    
		k = kmap(p->upage); 
		up = (User*)VA(k); 
1990/0227    
		if(up->p != p){ 
1990/0614    
			kunmap(k); 
1990/0227    
			pprint("note write u/p mismatch"); 
			error(0, Egreg); 
		} 
1990/0614    
		kunmap(k); 
1990/0227    
		if(n >= ERRLEN-1) 
			error(0, Etoobig); 
		if(n>=4 && strncmp(va, "sys:", 4)==0) 
1990/0614/sys/src/9/port/devproc.c:4,91990/0914/sys/src/9/port/devproc.c:4,10 (short | long)
1990/0227    
#include	"dat.h" 
#include	"fns.h" 
#include	"errno.h" 
1990/0914    
#include 	"io.h" 
1990/0227    
 
#include	"devtab.h" 
 
1990/0614/sys/src/9/port/devproc.c:280,2851990/0914/sys/src/9/port/devproc.c:281,291
1990/0614    
		if(c->offset>=KZERO && c->offset<KZERO+conf.npage0*BY2PG){ 
			if(c->offset+n > KZERO+conf.npage0*BY2PG) 
				n = KZERO+conf.npage0*BY2PG - c->offset; 
1990/0914    
			memcpy(a, (char*)c->offset, n); 
			return n; 
		} else if(c->offset>=UNCACHED && c->offset<UNCACHED+conf.npage0*BY2PG){ 
			if(c->offset+n > UNCACHED+conf.npage0*BY2PG) 
				n = UNCACHED+conf.npage0*BY2PG - c->offset; 
1990/0227    
			memcpy(a, (char*)c->offset, n); 
			return n; 
		} 
1990/0914/sys/src/9/port/devproc.c:4,111990/1110/sys/src/9/port/devproc.c:4,13 (short | long)
1990/0227    
#include	"dat.h" 
#include	"fns.h" 
#include	"errno.h" 
1990/0914    
#include 	"io.h" 
1990/0227    
 
1990/1110    
/* BUG mips only TAKE IT OUT */ 
#include	"io.h" 
 
1990/0227    
#include	"devtab.h" 
 
enum{ 
1990/0914/sys/src/9/port/devproc.c:13,181990/1110/sys/src/9/port/devproc.c:15,21
1990/0227    
	Qctl, 
	Qmem, 
	Qnote, 
1990/1110    
	Qnotepg, 
1990/0227    
	Qproc, 
	Qstatus, 
	Qtext, 
1990/0914/sys/src/9/port/devproc.c:22,271990/1110/sys/src/9/port/devproc.c:25,31
1990/0227    
	"ctl",		Qctl,		0,			0600, 
	"mem",		Qmem,		0,			0600, 
	"note",		Qnote,		0,			0600, 
1990/1110    
	"notepg",	Qnotepg,	0,			0200, 
1990/0227    
	"proc",		Qproc,		sizeof(Proc),		0600, 
	"status",	Qstatus,	NAMELEN+12+6*12,	0600, 
	"text",		Qtext,		0,			0600, 
1990/0914/sys/src/9/port/devproc.c:109,1141990/1110/sys/src/9/port/devproc.c:113,119
1990/0227    
procopen(Chan *c, int omode) 
{ 
	Proc *p; 
1990/1110    
	Pgrp *pg; 
1990/0227    
	Orig *o; 
	Chan *tc; 
 
1990/0914/sys/src/9/port/devproc.c:118,1231990/1110/sys/src/9/port/devproc.c:123,129
1990/03081    
		goto done; 
	} 
1990/0227    
	p = proctab(SLOT(c->qid)); 
1990/1110    
	pg = p->pgrp; 
1990/0227    
	if((p->pid&PIDMASK) != PID(c->qid)) 
    Died: 
		error(0, Eprocdied); 
1990/0914/sys/src/9/port/devproc.c:147,1571990/1110/sys/src/9/port/devproc.c:153,170
1990/0227    
	case Qctl: 
	case Qnote: 
		break; 
1990/1110    
 
	case Qnotepg: 
		if(omode != OWRITE) 
			error(0, Eperm); 
		c->pgrpid = (pg->pgrpid<<PIDSHIFT)|((pg->index+1)<<QSHIFT); 
		break; 
 
1990/0227    
	case Qdir: 
1990/0614    
	case Qmem: 
1990/0227    
	case Qproc: 
	case Qstatus: 
1990/0424    
		if(omode!=OREAD) 
1990/1110    
		if(omode != OREAD) 
1990/0424    
			error(0, Eperm); 
		break; 
1990/0227    
	default: 
1990/0914/sys/src/9/port/devproc.c:264,2701990/1110/sys/src/9/port/devproc.c:277,283
1990/0227    
		} 
 
		/* u area */ 
		if(c->offset>=USERADDR && c->offset<=USERADDR+BY2PG){ 
1990/1110    
		if(c->offset>=USERADDR && c->offset<USERADDR+BY2PG){ 
1990/0227    
			if(c->offset+n > USERADDR+BY2PG) 
				n = USERADDR+BY2PG - c->offset; 
			pg = p->upage; 
1990/0914/sys/src/9/port/devproc.c:283,2891990/1110/sys/src/9/port/devproc.c:296,303
1990/0614    
				n = KZERO+conf.npage0*BY2PG - c->offset; 
1990/0914    
			memcpy(a, (char*)c->offset, n); 
			return n; 
		} else if(c->offset>=UNCACHED && c->offset<UNCACHED+conf.npage0*BY2PG){ 
1990/1110    
		}else if(c->offset>=UNCACHED && c->offset<UNCACHED+conf.npage0*BY2PG){ 
			/* BUT mips only TAKE IT OUT */ 
1990/0914    
			if(c->offset+n > UNCACHED+conf.npage0*BY2PG) 
				n = UNCACHED+conf.npage0*BY2PG - c->offset; 
1990/0227    
			memcpy(a, (char*)c->offset, n); 
1990/0914/sys/src/9/port/devproc.c:353,3581990/1110/sys/src/9/port/devproc.c:367,373
1990/0227    
procwrite(Chan *c, void *va, long n) 
{ 
	Proc *p; 
1990/1110    
	Pgrp *pg; 
1990/0227    
	User *up; 
1990/0614    
	KMap *k; 
1990/0227    
	char buf[ERRLEN]; 
1990/0914/sys/src/9/port/devproc.c:359,3641990/1110/sys/src/9/port/devproc.c:374,399
1990/0227    
 
	if(c->qid & CHDIR) 
		error(0, Eisdir); 
1990/1110    
 
	/* 
	 * Special case: don't worry about process, just use remembered group 
	 */ 
	if(QID(c->qid) == Qnotepg){ 
		pg = pgrptab(SLOT(c->pgrpid)); 
		lock(&pg->debug); 
		if(waserror()){ 
			unlock(&pg->debug); 
			nexterror(); 
		} 
		if((pg->pgrpid&PIDMASK) != PID(c->pgrpid)){ 
			unlock(&pg->debug); 
  	  		goto Died; 
		} 
		pgrpnote(pg, va, n, NUser); 
		unlock(&pg->debug); 
		return n; 
	} 
 
1990/0227    
	p = proctab(SLOT(c->qid)); 
	lock(&p->debug); 
	if(waserror()){ 
1990/1110/sys/src/9/port/devproc.c:155,1611990/1115/sys/src/9/port/devproc.c:155,161 (short | long)
1990/0227    
		break; 
1990/1110    
 
	case Qnotepg: 
		if(omode != OWRITE) 
1990/1115    
		if(omode!=OWRITE || pg->pgrpid==1)	/* easy to do by mistake */ 
1990/1110    
			error(0, Eperm); 
		c->pgrpid = (pg->pgrpid<<PIDSHIFT)|((pg->index+1)<<QSHIFT); 
		break; 
1990/1115/sys/src/9/port/devproc.c:22,491990/11211/sys/src/9/port/devproc.c:22,49 (short | long)
1990/0227    
}; 
 
Dirtab procdir[]={ 
	"ctl",		Qctl,		0,			0600, 
	"mem",		Qmem,		0,			0600, 
	"note",		Qnote,		0,			0600, 
1990/1110    
	"notepg",	Qnotepg,	0,			0200, 
1990/0227    
	"proc",		Qproc,		sizeof(Proc),		0600, 
	"status",	Qstatus,	NAMELEN+12+6*12,	0600, 
	"text",		Qtext,		0,			0600, 
1990/11211    
	"ctl",		{Qctl},		0,			0600, 
	"mem",		{Qmem},		0,			0600, 
	"note",		{Qnote},	0,			0600, 
	"notepg",	{Qnotepg},	0,			0200, 
	"proc",		{Qproc},	sizeof(Proc),		0600, 
	"status",	{Qstatus},	NAMELEN+12+6*12,	0600, 
	"text",		{Qtext},	0,			0600, 
1990/0227    
}; 
 
/* 
 * Qids are, from bottom to top: 
1990/11211    
 * Qids are, in path: 
1990/0227    
 *	 4 bits of file type (qids above) 
 *	12 bits of process slot number + 1 
 *	15 bits of pid, for consistency checking 
1990/11211    
 *	24 bits of process slot number + 1 
 *	     in vers, 
 *	32 bits of pid, for consistency checking 
 * If notepg, c->pgrpid.path is pgrp slot, .vers is pgrpid. 
1990/0227    
 */ 
#define	NPROC	(sizeof procdir/sizeof(Dirtab)) 
#define	QSHIFT	4	/* location in qid of proc slot # */ 
#define	PIDSHIFT 16	/* location in qid of pid */ 
#define	PIDMASK	0x7FFF	/* low bits of pid used in qid */ 
#define	QID(q)	(((q)&0x0000000F)>>0) 
#define	SLOT(q)	((((q)&0x0000FFF0)>>QSHIFT)-1) 
#define	PID(q)	(((q)&0x7FFF0000)>>PIDSHIFT) 
1990/11211    
#define	QID(q)	(((q).path&0x0000000F)>>0) 
#define	SLOT(q)	((((q).path&0x0FFFFFFF0)>>QSHIFT)-1) 
#define	PID(q)	((q).vers) 
1990/0227    
 
int 
procgen(Chan *c, Dirtab *tab, int ntab, int s, Dir *dp) 
1990/1115/sys/src/9/port/devproc.c:52,581990/11211/sys/src/9/port/devproc.c:52,58
1990/0227    
	char buf[NAMELEN]; 
	ulong pid; 
 
	if(c->qid == CHDIR){ 
1990/11211    
	if(c->qid.path == CHDIR){ 
1990/0227    
		if(s >= conf.nproc) 
			return -1; 
		p = proctab(s); 
1990/1115/sys/src/9/port/devproc.c:60,661990/11211/sys/src/9/port/devproc.c:60,66
1990/0227    
		if(pid == 0) 
			return 0; 
		sprint(buf, "%d", pid); 
		devdir(c, CHDIR|(pid<<PIDSHIFT)|((s+1)<<QSHIFT), buf, 0, CHDIR|0500, dp); 
1990/11211    
		devdir(c, (Qid){CHDIR|((s+1)<<QSHIFT), pid}, buf, 0, CHDIR|0500, dp); 
1990/0227    
		return 1; 
	} 
	if(s >= NPROC) 
1990/1115/sys/src/9/port/devproc.c:68,741990/11211/sys/src/9/port/devproc.c:68,75
1990/0227    
	if(tab) 
		panic("procgen"); 
	tab = &procdir[s]; 
	devdir(c, (~CHDIR)&(c->qid|tab->qid), tab->name, tab->length, tab->perm, dp); 
1990/11211    
	devdir(c, (Qid){(~CHDIR)&(c->qid.path|tab->qid.path), c->qid.vers}, 
		tab->name, tab->length, tab->perm, dp); 
1990/0227    
	return 1; 
} 
 
1990/1115/sys/src/9/port/devproc.c:117,1321990/11211/sys/src/9/port/devproc.c:118,133
1990/0227    
	Orig *o; 
	Chan *tc; 
 
1990/03081    
	if(c->qid == CHDIR){ 
1990/11211    
	if(c->qid.path == CHDIR){ 
1990/03081    
		if(omode != OREAD) 
			error(0, Eperm); 
1990/11211    
			error(Eperm); 
1990/03081    
		goto done; 
	} 
1990/0227    
	p = proctab(SLOT(c->qid)); 
1990/1110    
	pg = p->pgrp; 
1990/0227    
	if((p->pid&PIDMASK) != PID(c->qid)) 
1990/11211    
	if(p->pid != PID(c->qid)) 
1990/0227    
    Died: 
		error(0, Eprocdied); 
1990/11211    
		error(Eprocdied); 
1990/0227    
	omode = openmode(omode); 
 
	switch(QID(c->qid)){ 
1990/1115/sys/src/9/port/devproc.c:144,1501990/11211/sys/src/9/port/devproc.c:145,151
1990/0227    
		} 
		if(!(tc->flag&COPEN) || tc->mode!=OREAD) 
			goto Close; 
		if((p->pid&PIDMASK) != PID(c->qid)) 
1990/11211    
		if(p->pid != PID(c->qid)) 
1990/0227    
			goto Close; 
		qlock(tc); 
		tc->offset = 0; 
1990/1115/sys/src/9/port/devproc.c:156,1631990/11211/sys/src/9/port/devproc.c:157,165
1990/1110    
 
	case Qnotepg: 
1990/1115    
		if(omode!=OWRITE || pg->pgrpid==1)	/* easy to do by mistake */ 
1990/1110    
			error(0, Eperm); 
		c->pgrpid = (pg->pgrpid<<PIDSHIFT)|((pg->index+1)<<QSHIFT); 
1990/11211    
			error(Eperm); 
		c->pgrpid.path = pg->index+1; 
		c->pgrpid.vers = pg->pgrpid; 
1990/1110    
		break; 
 
1990/0227    
	case Qdir: 
1990/1115/sys/src/9/port/devproc.c:165,1811990/11211/sys/src/9/port/devproc.c:167,183
1990/0227    
	case Qproc: 
	case Qstatus: 
1990/1110    
		if(omode != OREAD) 
1990/0424    
			error(0, Eperm); 
1990/11211    
			error(Eperm); 
1990/0424    
		break; 
1990/0227    
	default: 
		pprint("unknown qid in devopen\n"); 
		error(0, Egreg); 
1990/11211    
		error(Egreg); 
1990/0227    
	} 
	/* 
	 * Affix pid to qid 
	 */ 
	if(p->state != Dead) 
		c->qid |= (p->pid&PIDMASK)<<PIDSHIFT; 
1990/11211    
		c->qid.vers = p->pid; 
1990/03081    
   done: 
1990/0227    
	c->mode = omode; 
	c->flag |= COPEN; 
1990/1115/sys/src/9/port/devproc.c:186,2041990/11211/sys/src/9/port/devproc.c:188,206
1990/0227    
void 
proccreate(Chan *c, char *name, int omode, ulong perm) 
{ 
	error(0, Eperm); 
1990/11211    
	error(Eperm); 
1990/0227    
} 
 
void 
procremove(Chan *c) 
{ 
	error(0, Eperm); 
1990/11211    
	error(Eperm); 
1990/0227    
} 
 
void 
procwstat(Chan *c, char *db) 
{ 
	error(0, Eperm); 
1990/11211    
	error(Eperm); 
1990/0227    
} 
 
void 
1990/1115/sys/src/9/port/devproc.c:222,2281990/11211/sys/src/9/port/devproc.c:224,230
1990/0227    
	long pid; 
	User *up; 
 
	if(c->qid & CHDIR) 
1990/11211    
	if(c->qid.path & CHDIR) 
1990/0227    
		return devdirread(c, a, n, 0, 0, procgen); 
 
	/* 
1990/1115/sys/src/9/port/devproc.c:229,2361990/11211/sys/src/9/port/devproc.c:231,238
1990/0227    
	 * BUG: should lock(&p->debug)? 
	 */ 
	p = proctab(SLOT(c->qid)); 
	if((p->pid&PIDMASK) != PID(c->qid)) 
		error(0, Eprocdied); 
1990/11211    
	if(p->pid != PID(c->qid)) 
		error(Eprocdied); 
1990/0227    
 
	switch(QID(c->qid)){ 
	case Qmem: 
1990/1115/sys/src/9/port/devproc.c:243,2571990/11211/sys/src/9/port/devproc.c:245,259
1990/0227    
		if(s){ 
			o = s->o; 
			if(o == 0) 
				error(0, Eprocdied); 
1990/11211    
				error(Eprocdied); 
1990/0227    
			lock(o); 
			if(s->o!=o || (p->pid&PIDMASK)!=PID(c->qid)){ 
1990/11211    
			if(s->o!=o || p->pid!=PID(c->qid)){ 
1990/0227    
				unlock(o); 
				error(0, Eprocdied); 
1990/11211    
				error(Eprocdied); 
1990/0227    
			} 
			if(seg(p, c->offset) != s){ 
				unlock(o); 
				error(0, Egreg); 
1990/11211    
				error(Egreg); 
1990/0227    
			} 
1990/0614    
			pte = &o->pte[(c->offset-o->va)>>PGSHIFT]; 
			if(s->mod){ 
1990/1115/sys/src/9/port/devproc.c:281,2881990/11211/sys/src/9/port/devproc.c:283,290
1990/0227    
			if(c->offset+n > USERADDR+BY2PG) 
				n = USERADDR+BY2PG - c->offset; 
			pg = p->upage; 
			if(pg==0 || (p->pid&PIDMASK)!=PID(c->qid)) 
				error(0, Eprocdied); 
1990/11211    
			if(pg==0 || p->pid!=PID(c->qid)) 
				error(Eprocdied); 
1990/0614    
			k = kmap(pg); 
			b = (char*)VA(k); 
1990/0227    
			memcpy(a, b+(c->offset-USERADDR), n); 
1990/1115/sys/src/9/port/devproc.c:296,3071990/11211/sys/src/9/port/devproc.c:298,303
1990/0614    
				n = KZERO+conf.npage0*BY2PG - c->offset; 
1990/0914    
			memcpy(a, (char*)c->offset, n); 
			return n; 
1990/1110    
		}else if(c->offset>=UNCACHED && c->offset<UNCACHED+conf.npage0*BY2PG){ 
			/* BUT mips only TAKE IT OUT */ 
1990/0914    
			if(c->offset+n > UNCACHED+conf.npage0*BY2PG) 
				n = UNCACHED+conf.npage0*BY2PG - c->offset; 
1990/0227    
			memcpy(a, (char*)c->offset, n); 
			return n; 
		} 
		return 0; 
		break; 
1990/1115/sys/src/9/port/devproc.c:312,3281990/11211/sys/src/9/port/devproc.c:308,324
1990/0227    
			unlock(&p->debug); 
			nexterror(); 
		} 
		if((p->pid&PIDMASK) != PID(c->qid)) 
			error(0, Eprocdied); 
1990/11211    
		if(p->pid != PID(c->qid)) 
			error(Eprocdied); 
1990/0614    
		k = kmap(p->upage); 
		up = (User*)VA(k); 
1990/0227    
		if(up->p != p){ 
1990/0614    
			kunmap(k); 
1990/0227    
			pprint("note read u/p mismatch"); 
			error(0, Egreg); 
1990/11211    
			error(Egreg); 
1990/0227    
		} 
		if(n < ERRLEN) 
			error(0, Etoosmall); 
1990/11211    
			error(Etoosmall); 
1990/0227    
		if(up->nnote == 0) 
			n = 0; 
		else{ 
1990/1115/sys/src/9/port/devproc.c:359,3651990/11211/sys/src/9/port/devproc.c:355,361
1990/0227    
		memcpy(a, statbuf+c->offset, n); 
		return n; 
	} 
	error(0, Egreg); 
1990/11211    
	error(Egreg); 
1990/0227    
} 
 
 
1990/1115/sys/src/9/port/devproc.c:372,3911990/11211/sys/src/9/port/devproc.c:368,387
1990/0614    
	KMap *k; 
1990/0227    
	char buf[ERRLEN]; 
 
	if(c->qid & CHDIR) 
		error(0, Eisdir); 
1990/11211    
	if(c->qid.path & CHDIR) 
		error(Eisdir); 
1990/1110    
 
	/* 
	 * Special case: don't worry about process, just use remembered group 
	 */ 
	if(QID(c->qid) == Qnotepg){ 
		pg = pgrptab(SLOT(c->pgrpid)); 
1990/11211    
		pg = pgrptab(c->pgrpid.path-1); 
1990/1110    
		lock(&pg->debug); 
		if(waserror()){ 
			unlock(&pg->debug); 
			nexterror(); 
		} 
		if((pg->pgrpid&PIDMASK) != PID(c->pgrpid)){ 
1990/11211    
		if(pg->pgrpid != c->pgrpid.vers){ 
1990/1110    
			unlock(&pg->debug); 
  	  		goto Died; 
		} 
1990/1115/sys/src/9/port/devproc.c:400,4081990/11211/sys/src/9/port/devproc.c:396,404
1990/0227    
		unlock(&p->debug); 
		nexterror(); 
	} 
	if((p->pid&PIDMASK) != PID(c->qid)) 
1990/11211    
	if(p->pid != PID(c->qid)) 
1990/0227    
    Died: 
		error(0, Eprocdied); 
1990/11211    
		error(Eprocdied); 
1990/0227    
 
	switch(QID(c->qid)){ 
	case Qctl: 
1990/1115/sys/src/9/port/devproc.c:409,4151990/11211/sys/src/9/port/devproc.c:405,411
1990/0227    
		if(p->state==Broken && n>=4 && strncmp(va, "exit", 4)==0) 
			ready(p); 
		else 
			error(0, Ebadctl); 
1990/11211    
			error(Ebadctl); 
1990/0227    
		break; 
	case Qnote: 
1990/0614    
		k = kmap(p->upage); 
1990/1115/sys/src/9/port/devproc.c:417,4501990/11211/sys/src/9/port/devproc.c:413,434
1990/0227    
		if(up->p != p){ 
1990/0614    
			kunmap(k); 
1990/0227    
			pprint("note write u/p mismatch"); 
			error(0, Egreg); 
1990/11211    
			error(Egreg); 
1990/0227    
		} 
1990/0614    
		kunmap(k); 
1990/0227    
		if(n >= ERRLEN-1) 
			error(0, Etoobig); 
1990/11211    
			error(Etoobig); 
1990/0227    
		if(n>=4 && strncmp(va, "sys:", 4)==0) 
			error(0, Ebadarg); 
1990/11211    
			error(Ebadarg); 
1990/0227    
		memcpy(buf, va, n); 
		buf[n] = 0; 
		if(!postnote(p, 0, buf, NUser)) 
			error(0, Enonote); 
1990/11211    
			error(Enonote); 
1990/0227    
		break; 
	default: 
		pprint("unknown qid in procwrite\n"); 
		error(0, Egreg); 
1990/11211    
		error(Egreg); 
1990/0227    
	} 
	unlock(&p->debug); 
	return n; 
} 
                 
void 
procuserstr(Error *e, char *buf) 
{ 
	consuserstr(e, buf); 
} 
                 
void 
procerrstr(Error *e, char *buf) 
{ 
	rooterrstr(e, buf); 
} 
1990/11211/sys/src/9/port/devproc.c:371,3761990/1126/sys/src/9/port/devproc.c:371,377 (short | long)
1990/11211    
	if(c->qid.path & CHDIR) 
		error(Eisdir); 
1990/1110    
 
1990/1126    
	p = proctab(SLOT(c->qid)); 
1990/1110    
	/* 
	 * Special case: don't worry about process, just use remembered group 
	 */ 
1990/11211/sys/src/9/port/devproc.c:390,3961990/1126/sys/src/9/port/devproc.c:391,396
1990/1110    
		return n; 
	} 
 
1990/0227    
	p = proctab(SLOT(c->qid)); 
	lock(&p->debug); 
	if(waserror()){ 
		unlock(&p->debug); 
1990/1126/sys/src/9/port/devproc.c:5,131990/1128/sys/src/9/port/devproc.c:5,10 (short | long)
1990/0227    
#include	"fns.h" 
#include	"errno.h" 
 
1990/1110    
/* BUG mips only TAKE IT OUT */ 
#include	"io.h" 
                 
1990/0227    
#include	"devtab.h" 
 
enum{ 
1990/1126/sys/src/9/port/devproc.c:34,401990/1128/sys/src/9/port/devproc.c:31,37
1990/0227    
/* 
1990/11211    
 * Qids are, in path: 
1990/0227    
 *	 4 bits of file type (qids above) 
1990/11211    
 *	24 bits of process slot number + 1 
1990/1128    
 *	23 bits of process slot number + 1 
1990/11211    
 *	     in vers, 
 *	32 bits of pid, for consistency checking 
 * If notepg, c->pgrpid.path is pgrp slot, .vers is pgrpid. 
1990/1126/sys/src/9/port/devproc.c:42,481990/1128/sys/src/9/port/devproc.c:39,45
1990/0227    
#define	NPROC	(sizeof procdir/sizeof(Dirtab)) 
#define	QSHIFT	4	/* location in qid of proc slot # */ 
1990/11211    
#define	QID(q)	(((q).path&0x0000000F)>>0) 
#define	SLOT(q)	((((q).path&0x0FFFFFFF0)>>QSHIFT)-1) 
1990/1128    
#define	SLOT(q)	((((q).path&0x07FFFFFF0)>>QSHIFT)-1) 
1990/11211    
#define	PID(q)	((q).vers) 
1990/0227    
 
int 
1990/1128/sys/src/9/port/devproc.c:374,3901991/0212/sys/src/9/port/devproc.c:374,390 (short | long)
1990/1110    
	 */ 
	if(QID(c->qid) == Qnotepg){ 
1990/11211    
		pg = pgrptab(c->pgrpid.path-1); 
1990/1110    
		lock(&pg->debug); 
1991/0212    
		qlock(&pg->debug); 
1990/1110    
		if(waserror()){ 
			unlock(&pg->debug); 
1991/0212    
			qunlock(&pg->debug); 
1990/1110    
			nexterror(); 
		} 
1990/11211    
		if(pg->pgrpid != c->pgrpid.vers){ 
1990/1110    
			unlock(&pg->debug); 
1991/0212    
			qunlock(&pg->debug); 
1990/1110    
  	  		goto Died; 
		} 
		pgrpnote(pg, va, n, NUser); 
		unlock(&pg->debug); 
1991/0212    
		qunlock(&pg->debug); 
1990/1110    
		return n; 
	} 
 
1991/0212/sys/src/9/port/devproc.c:269,2801991/0318/sys/src/9/port/devproc.c:269,279 (short | long)
1990/0227    
			}else{ 
1990/0614    
				k = kmap(pg); 
				b = (char*)VA(k); 
1990/0227    
				memcpy(a, b+(c->offset&(BY2PG-1)), n); 
1991/0318    
				memmove(a, b+(c->offset&(BY2PG-1)), n); 
1990/0614    
				kunmap(k); 
1990/0227    
			} 
			return n; 
		} 
                 
		/* u area */ 
1990/1110    
		if(c->offset>=USERADDR && c->offset<USERADDR+BY2PG){ 
1990/0227    
			if(c->offset+n > USERADDR+BY2PG) 
1991/0212/sys/src/9/port/devproc.c:284,2901991/0318/sys/src/9/port/devproc.c:283,289
1990/11211    
				error(Eprocdied); 
1990/0614    
			k = kmap(pg); 
			b = (char*)VA(k); 
1990/0227    
			memcpy(a, b+(c->offset-USERADDR), n); 
1991/0318    
			memmove(a, b+(c->offset-USERADDR), n); 
1990/0614    
			kunmap(k); 
1990/0227    
			return n; 
		} 
1991/0212/sys/src/9/port/devproc.c:293,2991991/0318/sys/src/9/port/devproc.c:292,298
1990/0614    
		if(c->offset>=KZERO && c->offset<KZERO+conf.npage0*BY2PG){ 
			if(c->offset+n > KZERO+conf.npage0*BY2PG) 
				n = KZERO+conf.npage0*BY2PG - c->offset; 
1990/0914    
			memcpy(a, (char*)c->offset, n); 
1991/0318    
			memmove(a, (char*)c->offset, n); 
1990/0914    
			return n; 
1990/0227    
		} 
		return 0; 
1991/0212/sys/src/9/port/devproc.c:319,3271991/0318/sys/src/9/port/devproc.c:318,326
1990/0227    
		if(up->nnote == 0) 
			n = 0; 
		else{ 
			memcpy(va, up->note[0].msg, ERRLEN); 
1991/0318    
			memmove(va, up->note[0].msg, ERRLEN); 
1990/0227    
			up->nnote--; 
			memcpy(&up->note[0], &up->note[1], up->nnote*sizeof(Note)); 
1991/0318    
			memmove(&up->note[0], &up->note[1], up->nnote*sizeof(Note)); 
1990/0227    
			n = ERRLEN; 
		} 
1990/0614    
		kunmap(k); 
1991/0212/sys/src/9/port/devproc.c:333,3391991/0318/sys/src/9/port/devproc.c:332,338
1990/0227    
			return 0; 
		if(c->offset+n > sizeof(Proc)) 
			n = sizeof(Proc) - c->offset; 
		memcpy(a, ((char*)p)+c->offset, n); 
1991/0318    
		memmove(a, ((char*)p)+c->offset, n); 
1990/0227    
		return n; 
 
	case Qstatus: 
1991/0212/sys/src/9/port/devproc.c:349,3551991/0318/sys/src/9/port/devproc.c:348,354
1990/0614    
			l = TK2MS(l); 
1990/0227    
			readnum(0, statbuf+2*NAMELEN+12+NUMSIZE*i, NUMSIZE, l, NUMSIZE); 
		} 
		memcpy(a, statbuf+c->offset, n); 
1991/0318    
		memmove(a, statbuf+c->offset, n); 
1990/0227    
		return n; 
	} 
1990/11211    
	error(Egreg); 
1991/0212/sys/src/9/port/devproc.c:417,4231991/0318/sys/src/9/port/devproc.c:416,422
1990/11211    
			error(Etoobig); 
1990/0227    
		if(n>=4 && strncmp(va, "sys:", 4)==0) 
1990/11211    
			error(Ebadarg); 
1990/0227    
		memcpy(buf, va, n); 
1991/0318    
		memmove(buf, va, n); 
1990/0227    
		buf[n] = 0; 
		if(!postnote(p, 0, buf, NUser)) 
1990/11211    
			error(Enonote); 
1991/0318/sys/src/9/port/devproc.c:144,1521991/0411/sys/src/9/port/devproc.c:144,152 (short | long)
1990/0227    
			goto Close; 
1990/11211    
		if(p->pid != PID(c->qid)) 
1990/0227    
			goto Close; 
		qlock(tc); 
1991/0411    
		qlock(&tc->rdl); 
1990/0227    
		tc->offset = 0; 
		qunlock(tc); 
1991/0411    
		qunlock(&tc->rdl); 
1990/0227    
		return tc; 
	case Qctl: 
	case Qnote: 
1991/0318/sys/src/9/port/devproc.c:206,2121991/0411/sys/src/9/port/devproc.c:206,212
1990/0227    
} 
 
long 
procread(Chan *c, void *va, long n) 
1991/0411    
procread(Chan *c, void *va, long n, ulong offset) 
1990/0227    
{ 
	char *a = va, *b; 
	char statbuf[2*NAMELEN+12+6*12]; 
1991/0318/sys/src/9/port/devproc.c:236,2441991/0411/sys/src/9/port/devproc.c:236,244
1990/0227    
		/* 
		 * One page at a time 
		 */ 
		if(((c->offset+n)&~(BY2PG-1)) != (c->offset&~(BY2PG-1))) 
			n = BY2PG - (c->offset&(BY2PG-1)); 
		s = seg(p, c->offset); 
1991/0411    
		if(((offset+n)&~(BY2PG-1)) != (offset&~(BY2PG-1))) 
			n = BY2PG - (offset&(BY2PG-1)); 
		s = seg(p, offset); 
1990/0227    
		if(s){ 
			o = s->o; 
			if(o == 0) 
1991/0318/sys/src/9/port/devproc.c:248,2581991/0411/sys/src/9/port/devproc.c:248,258
1990/0227    
				unlock(o); 
1990/11211    
				error(Eprocdied); 
1990/0227    
			} 
			if(seg(p, c->offset) != s){ 
1991/0411    
			if(seg(p, offset) != s){ 
1990/0227    
				unlock(o); 
1990/11211    
				error(Egreg); 
1990/0227    
			} 
1990/0614    
			pte = &o->pte[(c->offset-o->va)>>PGSHIFT]; 
1991/0411    
			pte = &o->pte[(offset-o->va)>>PGSHIFT]; 
1990/0614    
			if(s->mod){ 
				opte = pte; 
				while(pte = pte->nextmod)	/* assign = */ 
1991/0318/sys/src/9/port/devproc.c:264,2981991/0411/sys/src/9/port/devproc.c:264,298
1990/0614    
			pg = pte->page; 
1990/0227    
			unlock(o); 
			if(pg == 0){ 
1990/0614    
				pprint("nonresident page addr %lux (complain to rob)\n", c->offset); 
1991/0411    
				pprint("nonresident page addr %lux (complain to rob)\n", offset); 
1990/0227    
				memset(a, 0, n); 
			}else{ 
1990/0614    
				k = kmap(pg); 
				b = (char*)VA(k); 
1991/0318    
				memmove(a, b+(c->offset&(BY2PG-1)), n); 
1991/0411    
				memmove(a, b+(offset&(BY2PG-1)), n); 
1990/0614    
				kunmap(k); 
1990/0227    
			} 
			return n; 
		} 
		/* u area */ 
1990/1110    
		if(c->offset>=USERADDR && c->offset<USERADDR+BY2PG){ 
1990/0227    
			if(c->offset+n > USERADDR+BY2PG) 
				n = USERADDR+BY2PG - c->offset; 
1991/0411    
		if(offset>=USERADDR && offset<USERADDR+BY2PG){ 
			if(offset+n > USERADDR+BY2PG) 
				n = USERADDR+BY2PG - offset; 
1990/0227    
			pg = p->upage; 
1990/11211    
			if(pg==0 || p->pid!=PID(c->qid)) 
				error(Eprocdied); 
1990/0614    
			k = kmap(pg); 
			b = (char*)VA(k); 
1991/0318    
			memmove(a, b+(c->offset-USERADDR), n); 
1991/0411    
			memmove(a, b+(offset-USERADDR), n); 
1990/0614    
			kunmap(k); 
1990/0227    
			return n; 
		} 
 
		/* kernel memory.  BUG: shouldn't be so easygoing. BUG: mem mapping? */ 
1990/0614    
		if(c->offset>=KZERO && c->offset<KZERO+conf.npage0*BY2PG){ 
			if(c->offset+n > KZERO+conf.npage0*BY2PG) 
				n = KZERO+conf.npage0*BY2PG - c->offset; 
1991/0318    
			memmove(a, (char*)c->offset, n); 
1991/0411    
		if(offset>=KZERO && offset<KZERO+conf.npage0*BY2PG){ 
			if(offset+n > KZERO+conf.npage0*BY2PG) 
				n = KZERO+conf.npage0*BY2PG - offset; 
			memmove(a, (char*)offset, n); 
1990/0914    
			return n; 
1990/0227    
		} 
		return 0; 
1991/0318/sys/src/9/port/devproc.c:328,3451991/0411/sys/src/9/port/devproc.c:328,345
1990/0227    
		return n; 
 
	case Qproc: 
		if(c->offset >= sizeof(Proc)) 
1991/0411    
		if(offset >= sizeof(Proc)) 
1990/0227    
			return 0; 
		if(c->offset+n > sizeof(Proc)) 
			n = sizeof(Proc) - c->offset; 
1991/0318    
		memmove(a, ((char*)p)+c->offset, n); 
1991/0411    
		if(offset+n > sizeof(Proc)) 
			n = sizeof(Proc) - offset; 
		memmove(a, ((char*)p)+offset, n); 
1990/0227    
		return n; 
 
	case Qstatus: 
		if(c->offset >= sizeof statbuf) 
1991/0411    
		if(offset >= sizeof statbuf) 
1990/0227    
			return 0; 
		if(c->offset+n > sizeof statbuf) 
			n = sizeof statbuf - c->offset; 
1991/0411    
		if(offset+n > sizeof statbuf) 
			n = sizeof statbuf - offset; 
1990/0227    
		sprint(statbuf, "%-27s %-27s %-11s ", p->text, p->pgrp->user, statename[p->state]); 
		for(i=0; i<6; i++){ 
			l = p->time[i]; 
1991/0318/sys/src/9/port/devproc.c:348,3541991/0411/sys/src/9/port/devproc.c:348,354
1990/0614    
			l = TK2MS(l); 
1990/0227    
			readnum(0, statbuf+2*NAMELEN+12+NUMSIZE*i, NUMSIZE, l, NUMSIZE); 
		} 
1991/0318    
		memmove(a, statbuf+c->offset, n); 
1991/0411    
		memmove(a, statbuf+offset, n); 
1990/0227    
		return n; 
	} 
1990/11211    
	error(Egreg); 
1991/0318/sys/src/9/port/devproc.c:356,3621991/0411/sys/src/9/port/devproc.c:356,362
1990/0227    
 
 
long 
procwrite(Chan *c, void *va, long n) 
1991/0411    
procwrite(Chan *c, void *va, long n, ulong offset) 
1990/0227    
{ 
	Proc *p; 
1990/1110    
	Pgrp *pg; 
1991/0411/sys/src/9/port/devproc.c:101,1061991/0419/sys/src/9/port/devproc.c:101,112 (short | long)
1990/0227    
	return devwalk(c, name, 0, 0, procgen); 
} 
 
1991/0419    
Chan* 
procclwalk(Chan *c, char *name) 
{ 
	return devclwalk(c, name); 
} 
 
1990/0227    
void 
procstat(Chan *c, char *db) 
{ 
1991/0419/sys/src/9/port/devproc.c:101,1121991/0427/sys/src/9/port/devproc.c:101,106 (short | long)
1990/0227    
	return devwalk(c, name, 0, 0, procgen); 
} 
 
1991/0419    
Chan* 
procclwalk(Chan *c, char *name) 
{ 
	return devclwalk(c, name); 
} 
                 
1990/0227    
void 
procstat(Chan *c, char *db) 
{ 
1991/0427/sys/src/9/port/devproc.c:130,1401991/0605/sys/src/9/port/devproc.c:130,142 (short | long)
1990/0227    
	switch(QID(c->qid)){ 
	case Qtext: 
		o = p->seg[TSEG].o; 
		if(o==0 || p->state==Dead) 
1991/0605    
		if(o==0 || p->state==Dead)  
1990/0227    
			goto Died; 
1991/0605    
 
1990/0227    
		tc = o->chan; 
		if(tc == 0) 
			goto Died; 
1991/0605    
 
1990/0227    
		if(incref(tc) == 0){ 
    Close: 
			close(tc); 
1991/0427/sys/src/9/port/devproc.c:142,1491991/0605/sys/src/9/port/devproc.c:144,153
1990/0227    
		} 
		if(!(tc->flag&COPEN) || tc->mode!=OREAD) 
			goto Close; 
1991/0605    
 
1990/11211    
		if(p->pid != PID(c->qid)) 
1990/0227    
			goto Close; 
1991/0605    
 
1991/0411    
		qlock(&tc->rdl); 
1990/0227    
		tc->offset = 0; 
1991/0411    
		qunlock(&tc->rdl); 
1991/0605/sys/src/9/port/devproc.c:328,3331991/0614/sys/src/9/port/devproc.c:328,334 (short | long)
1990/0227    
			n = ERRLEN; 
		} 
1990/0614    
		kunmap(k); 
1991/0614    
		poperror(); 
1990/0227    
		unlock(&p->debug); 
		return n; 
 
1991/0605/sys/src/9/port/devproc.c:387,3921991/0614/sys/src/9/port/devproc.c:388,394
1990/1110    
  	  		goto Died; 
		} 
		pgrpnote(pg, va, n, NUser); 
1991/0614    
		poperror(); 
1991/0212    
		qunlock(&pg->debug); 
1990/1110    
		return n; 
	} 
1991/0605/sys/src/9/port/devproc.c:429,4341991/0614/sys/src/9/port/devproc.c:431,437
1990/0227    
		pprint("unknown qid in procwrite\n"); 
1990/11211    
		error(Egreg); 
1990/0227    
	} 
1991/0614    
	poperror(); 
1990/0227    
	unlock(&p->debug); 
	return n; 
} 
1991/0614/sys/src/9/port/devproc.c:14,191991/0705/sys/src/9/port/devproc.c:14,20 (short | long)
1990/0227    
	Qnote, 
1990/1110    
	Qnotepg, 
1990/0227    
	Qproc, 
1991/0705    
	Qsegment, 
1990/0227    
	Qstatus, 
	Qtext, 
}; 
1991/0614/sys/src/9/port/devproc.c:24,331991/0705/sys/src/9/port/devproc.c:25,44
1990/11211    
	"note",		{Qnote},	0,			0600, 
	"notepg",	{Qnotepg},	0,			0200, 
	"proc",		{Qproc},	sizeof(Proc),		0600, 
1991/0705    
	"segment",	{Qsegment},	0,			0400, 
1990/11211    
	"status",	{Qstatus},	NAMELEN+12+6*12,	0600, 
	"text",		{Qtext},	0,			0600, 
1990/0227    
}; 
 
1991/0705    
char *sname[]={ 			/* Segment type from portdat.h */ 
	"Text",  
	"Data",  
	"Bss",  
	"Stack",  
	"Shared",  
	"Phys", 
}; 
 
1990/0227    
/* 
1990/11211    
 * Qids are, in path: 
1990/0227    
 *	 4 bits of file type (qids above) 
1991/0614/sys/src/9/port/devproc.c:47,531991/0705/sys/src/9/port/devproc.c:58,64
1990/0227    
{ 
	Proc *p; 
	char buf[NAMELEN]; 
	ulong pid; 
1991/0705    
	ulong pid, path; 
1990/0227    
 
1990/11211    
	if(c->qid.path == CHDIR){ 
1990/0227    
		if(s >= conf.nproc) 
1991/0614/sys/src/9/port/devproc.c:65,711991/0705/sys/src/9/port/devproc.c:76,83
1990/0227    
	if(tab) 
		panic("procgen"); 
	tab = &procdir[s]; 
1990/11211    
	devdir(c, (Qid){(~CHDIR)&(c->qid.path|tab->qid.path), c->qid.vers}, 
1991/0705    
	path = c->qid.path&~(CHDIR|((1<<QSHIFT)-1));	/* slot component */ 
	devdir(c, (Qid){path|tab->qid.path, c->qid.vers}, 
1990/11211    
		tab->name, tab->length, tab->perm, dp); 
1990/0227    
	return 1; 
} 
1991/0614/sys/src/9/port/devproc.c:112,1181991/0705/sys/src/9/port/devproc.c:124,130
1990/0227    
{ 
	Proc *p; 
1990/1110    
	Pgrp *pg; 
1990/0227    
	Orig *o; 
1991/0705    
	Segment *s; 
1990/0227    
	Chan *tc; 
 
1990/11211    
	if(c->qid.path == CHDIR){ 
1991/0614/sys/src/9/port/devproc.c:129,1391991/0705/sys/src/9/port/devproc.c:141,151
1990/0227    
 
	switch(QID(c->qid)){ 
	case Qtext: 
		o = p->seg[TSEG].o; 
1991/0605    
		if(o==0 || p->state==Dead)  
1991/0705    
		s = p->seg[TSEG]; 
		if(s==0 || p->state==Dead || s->image==0)  
1990/0227    
			goto Died; 
1991/0605    
 
1990/0227    
		tc = o->chan; 
1991/0705    
		tc = s->image->c; 
1990/0227    
		if(tc == 0) 
			goto Died; 
1991/0605    
 
1991/0614/sys/src/9/port/devproc.c:154,1591991/0705/sys/src/9/port/devproc.c:166,172
1990/0227    
		return tc; 
	case Qctl: 
	case Qnote: 
1991/0705    
	case Qsegment: 
1990/0227    
		break; 
1990/1110    
 
	case Qnotepg: 
1991/0614/sys/src/9/port/devproc.c:213,2291991/0705/sys/src/9/port/devproc.c:226,243
1991/0411    
procread(Chan *c, void *va, long n, ulong offset) 
1990/0227    
{ 
	char *a = va, *b; 
	char statbuf[2*NAMELEN+12+6*12]; 
1991/0705    
	char statbuf[NSEG*32]; 
1990/0227    
	Proc *p; 
	Seg *s; 
	Orig *o; 
1991/0705    
	Pte *pte; 
	Segment *s; 
1990/0227    
	Page *pg; 
1990/0614    
	KMap *k; 
	PTE *pte, *opte; 
1990/0227    
	int i; 
1991/0705    
	int i, j; 
1990/0227    
	long l; 
	long pid; 
	User *up; 
1991/0705    
	ulong soff; 
	Segment *sg; 
1990/0227    
 
1990/11211    
	if(c->qid.path & CHDIR) 
1990/0227    
		return devdirread(c, a, n, 0, 0, procgen); 
1991/0614/sys/src/9/port/devproc.c:242,2731991/0705/sys/src/9/port/devproc.c:256,277
1990/0227    
		 */ 
1991/0411    
		if(((offset+n)&~(BY2PG-1)) != (offset&~(BY2PG-1))) 
			n = BY2PG - (offset&(BY2PG-1)); 
		s = seg(p, offset); 
1991/0705    
		s = seg(p, offset, 1); 
1990/0227    
		if(s){ 
			o = s->o; 
			if(o == 0) 
1991/0705    
			if(p->pid!=PID(c->qid)){ 
				qunlock(&s->lk); 
1990/11211    
				error(Eprocdied); 
1990/0227    
			lock(o); 
1990/11211    
			if(s->o!=o || p->pid!=PID(c->qid)){ 
1990/0227    
				unlock(o); 
1990/11211    
				error(Eprocdied); 
1990/0227    
			} 
1991/0411    
			if(seg(p, offset) != s){ 
1990/0227    
				unlock(o); 
1990/11211    
				error(Egreg); 
1990/0227    
			} 
1991/0411    
			pte = &o->pte[(offset-o->va)>>PGSHIFT]; 
1990/0614    
			if(s->mod){ 
				opte = pte; 
				while(pte = pte->nextmod)	/* assign = */ 
					if(pte->proc == p) 
						break; 
				if(pte == 0) 
					pte = opte; 
			} 
			pg = pte->page; 
1990/0227    
			unlock(o); 
			if(pg == 0){ 
1991/0705    
 
			soff = offset-s->base; 
			pte = s->map[soff/PTEMAPMEM]; 
			pg = 0; 
			if(pte) 
				pg = pte->pages[(soff&(PTEMAPMEM-1))/BY2PG]; 
 
			s->steal++; 
			qunlock(&s->lk); 
			if(pagedout(pg)){ 
1991/0411    
				pprint("nonresident page addr %lux (complain to rob)\n", offset); 
1990/0227    
				memset(a, 0, n); 
			}else{ 
1991/0614/sys/src/9/port/devproc.c:276,2811991/0705/sys/src/9/port/devproc.c:280,288
1991/0411    
				memmove(a, b+(offset&(BY2PG-1)), n); 
1990/0614    
				kunmap(k); 
1990/0227    
			} 
1991/0705    
			qlock(&s->lk); 
			s->steal--; 
			qunlock(&s->lk); 
1990/0227    
			return n; 
		} 
		/* u area */ 
1991/0614/sys/src/9/port/devproc.c:355,3601991/0705/sys/src/9/port/devproc.c:362,380
1990/0227    
		} 
1991/0411    
		memmove(a, statbuf+offset, n); 
1990/0227    
		return n; 
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' : ' ', 
				sg->base, sg->top, sg->ref); 
		if(offset >= j) 
			return 0; 
		if(offset+n > j) 
			n = j-offset; 
		memmove(a, &statbuf[offset], n); 
		return n; 
1990/0227    
	} 
1990/11211    
	error(Egreg); 
1990/0227    
} 
1991/0614/sys/src/9/port/devproc.c:404,4141991/0705/sys/src/9/port/devproc.c:424,454
1990/0227    
 
	switch(QID(c->qid)){ 
	case Qctl: 
		if(p->state==Broken && n>=4 && strncmp(va, "exit", 4)==0) 
			ready(p); 
1991/0705    
		if(n >= 4 && strncmp(va, "exit", 4) == 0) { 
			if(p->state == Broken) { 
				ready(p); 
				break; 
			} 
		} 
1990/0227    
		else 
1990/11211    
			error(Ebadctl); 
1990/0227    
		break; 
1991/0705    
		if(n >= 4 && strncmp(va, "stop", 4) == 0) { 
			p->procctl = Proc_stopme; 
			break; 
		} 
		else 
		if(n >= 5 && strncmp(va, "start", 5) == 0) { 
			if(p->state == Stopped) { 
				ready(p); 
				break; 
			} 
			errors("not stopped"); 
		} 
		else 
		if(n >= 4 && strncmp(va, "kill", 4) == 0) { 
			p->procctl = Proc_exitme; 
			break; 
		} 
		error(Ebadctl); 
1990/0227    
	case Qnote: 
1990/0614    
		k = kmap(p->upage); 
		up = (User*)VA(k); 
1991/0705/sys/src/9/port/devproc.c:19,241991/0712/sys/src/9/port/devproc.c:19,25 (short | long)
1990/0227    
	Qtext, 
}; 
 
1991/0712    
#define	STATSIZE	(2*NAMELEN+12+6*12) 
1990/0227    
Dirtab procdir[]={ 
1990/11211    
	"ctl",		{Qctl},		0,			0600, 
	"mem",		{Qmem},		0,			0600, 
1991/0705/sys/src/9/port/devproc.c:26,321991/0712/sys/src/9/port/devproc.c:27,33
1990/11211    
	"notepg",	{Qnotepg},	0,			0200, 
	"proc",		{Qproc},	sizeof(Proc),		0600, 
1991/0705    
	"segment",	{Qsegment},	0,			0400, 
1990/11211    
	"status",	{Qstatus},	NAMELEN+12+6*12,	0600, 
1991/0712    
	"status",	{Qstatus},	STATSIZE,		0600, 
1990/11211    
	"text",		{Qtext},	0,			0600, 
1990/0227    
}; 
 
1991/0705/sys/src/9/port/devproc.c:348,3641991/0712/sys/src/9/port/devproc.c:349,366
1990/0227    
		return n; 
 
	case Qstatus: 
1991/0411    
		if(offset >= sizeof statbuf) 
1991/0712    
		if(offset >= STATSIZE) 
1990/0227    
			return 0; 
1991/0411    
		if(offset+n > sizeof statbuf) 
			n = sizeof statbuf - offset; 
1990/0227    
		sprint(statbuf, "%-27s %-27s %-11s ", p->text, p->pgrp->user, statename[p->state]); 
1991/0712    
		if(offset+n > STATSIZE) 
			n = STATSIZE - offset; 
		j = sprint(statbuf, "%-27s %-27s %-11s ", 
			p->text, p->pgrp->user, statename[p->state]); 
1990/0227    
		for(i=0; i<6; i++){ 
			l = p->time[i]; 
			if(i == TReal) 
				l = MACHP(0)->ticks - l; 
1990/0614    
			l = TK2MS(l); 
1990/0227    
			readnum(0, statbuf+2*NAMELEN+12+NUMSIZE*i, NUMSIZE, l, NUMSIZE); 
1991/0712    
			readnum(0, statbuf+j+NUMSIZE*i, NUMSIZE, l, NUMSIZE); 
1990/0227    
		} 
1991/0411    
		memmove(a, statbuf+offset, n); 
1990/0227    
		return n; 
1991/0712/sys/src/9/port/devproc.c:273,2791991/0724/sys/src/9/port/devproc.c:273,279 (short | long)
1991/0705    
			s->steal++; 
			qunlock(&s->lk); 
			if(pagedout(pg)){ 
1991/0411    
				pprint("nonresident page addr %lux (complain to rob)\n", offset); 
1991/0724    
				pprint("nonresident page addr %lux (complain to philw)\n", offset); 
1990/0227    
				memset(a, 0, n); 
			}else{ 
1990/0614    
				k = kmap(pg); 
1991/0724/sys/src/9/port/devproc.c:27,331991/0807/sys/src/9/port/devproc.c:27,33 (short | long)
1990/11211    
	"notepg",	{Qnotepg},	0,			0200, 
	"proc",		{Qproc},	sizeof(Proc),		0600, 
1991/0705    
	"segment",	{Qsegment},	0,			0400, 
1991/0712    
	"status",	{Qstatus},	STATSIZE,		0600, 
1991/0807    
	"status",	{Qstatus},	STATSIZE,		0400, 
1990/11211    
	"text",		{Qtext},	0,			0600, 
1990/0227    
}; 
 
1991/0807/sys/src/9/port/devproc.c:354,3601991/0926/sys/src/9/port/devproc.c:354,360 (short | long)
1991/0712    
		if(offset+n > STATSIZE) 
			n = STATSIZE - offset; 
		j = sprint(statbuf, "%-27s %-27s %-11s ", 
			p->text, p->pgrp->user, statename[p->state]); 
1991/0926    
			p->text, p->pgrp->user, p->psstate ? p->psstate : statename[p->state]); 
1990/0227    
		for(i=0; i<6; i++){ 
			l = p->time[i]; 
			if(i == TReal) 
1991/0926/sys/src/9/port/devproc.c:111,1161991/1011/sys/src/9/port/devproc.c:111,122 (short | long)
1990/0227    
int 
procwalk(Chan *c, char *name) 
{ 
1991/1011    
	if(name[0] == '.' && name[1] == '.' && 
	   name[2] == '\0') { 
		c->qid.path = Qdir|CHDIR; 
		return 1; 
	} 
 
1990/0227    
	return devwalk(c, name, 0, 0, procgen); 
} 
 
1991/1011/sys/src/9/port/devproc.c:313,3181991/1025/sys/src/9/port/devproc.c:313,324 (short | long)
1991/0411    
			memmove(a, (char*)offset, n); 
1990/0914    
			return n; 
1990/0227    
		} 
1991/1025    
		if(offset>=KZERO && offset<KZERO+conf.base1+conf.npage1*BY2PG){ 
			if(offset+n > KZERO+conf.base1+conf.npage1*BY2PG) 
				n = KZERO+conf.base1+conf.npage1*BY2PG - offset; 
			memmove(a, (char*)offset, n); 
			return n; 
		} 
1990/0227    
		return 0; 
		break; 
 
1991/1025/sys/src/9/port/devproc.c:366,3721991/1105/sys/src/9/port/devproc.c:366,372 (short | long)
1991/0712    
		if(offset+n > STATSIZE) 
			n = STATSIZE - offset; 
		j = sprint(statbuf, "%-27s %-27s %-11s ", 
1991/0926    
			p->text, p->pgrp->user, p->psstate ? p->psstate : statename[p->state]); 
1991/1105    
			p->text, p->user, p->psstate ? p->psstate : statename[p->state]); 
1990/0227    
		for(i=0; i<6; i++){ 
			l = p->time[i]; 
			if(i == TReal) 
1991/1105/sys/src/9/port/devproc.c:111,1181991/1106/sys/src/9/port/devproc.c:111,117 (short | long)
1990/0227    
int 
procwalk(Chan *c, char *name) 
{ 
1991/1011    
	if(name[0] == '.' && name[1] == '.' && 
	   name[2] == '\0') { 
1991/1106    
	if(strcmp(name, "..") == 0) { 
1991/1011    
		c->qid.path = Qdir|CHDIR; 
		return 1; 
	} 
Too many diffs (26 > 25). Stopping.


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