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

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

1991/0318/sys/src/9/port/devproc.c:144,1521991/0411/sys/src/9/port/devproc.c:144,152 (short | long | prev | next)
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; 


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