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

1991/0705/port/devproc.c (diff list | history)

1991/0614/sys/src/9/port/devproc.c:14,191991/0705/sys/src/9/port/devproc.c:14,20 (short | long | prev | next)
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); 


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