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

1993/0727/port/sysproc.c (diff list | history)

1990/0227/sys/src/9/port/sysproc.c:105,1101990/03081/sys/src/9/port/sysproc.c:105,124 (short | long)
1990/0227    
		if(c = u->fd[n])	/* assign = */ 
			incref(c); 
	/* 
1990/03081    
	 * Committed.  Link into hierarchy 
	 */ 
	lock(&p->kidlock); 
	lock(&u->p->kidlock); 
	if(u->p->kid == 0){ 
		p->sib = p; 
		u->p->kid = p; 
	}else{ 
		p->sib = u->p->kid->sib; 
		u->p->kid->sib = p; 
	} 
	unlock(&u->p->kidlock); 
	unlock(&p->kidlock); 
	/* 
1990/0227    
	 * Sched 
	 */ 
	if(setlabel(&p->sched)){ 
1990/0227/sys/src/9/port/sysproc.c:115,1201990/03081/sys/src/9/port/sysproc.c:129,135
1990/0227    
		spllo(); 
		return 0; 
	} 
1990/03081    
	p->pop = u->p; 
1990/0227    
	p->parent = u->p; 
	p->parentpid = u->p->pid; 
	p->pgrp = u->p->pgrp; 
1990/03081/sys/src/9/port/sysproc.c:134,1401990/0322/sys/src/9/port/sysproc.c:134,139 (short | long)
1990/0227    
	p->parentpid = u->p->pid; 
	p->pgrp = u->p->pgrp; 
	incref(p->pgrp); 
	u->p->nchild++; 
	pid = p->pid; 
	memset(p->time, 0, sizeof(p->time)); 
	p->time[TReal] = MACHP(0)->ticks; 
1990/0322/sys/src/9/port/sysproc.c:134,1391990/0324/sys/src/9/port/sysproc.c:134,140 (short | long)
1990/0227    
	p->parentpid = u->p->pid; 
	p->pgrp = u->p->pgrp; 
	incref(p->pgrp); 
1990/0324    
	u->p->nchild++; 
1990/0227    
	pid = p->pid; 
	memset(p->time, 0, sizeof(p->time)); 
	p->time[TReal] = MACHP(0)->ticks; 
1990/0324/sys/src/9/port/sysproc.c:6,121990/0330/sys/src/9/port/sysproc.c:6,12 (short | long)
1990/0227    
#include	"ureg.h" 
#include	"errno.h" 
 
#include	<v.out.h> 
1990/0330    
#include	<a.out.h> 
1990/0227    
 
int	shargs(char*, int, char**); 
 
1990/0330/sys/src/9/port/sysproc.c:26,311990/0614/sys/src/9/port/sysproc.c:26,32 (short | long)
1990/0227    
	ulong usp, upa, pid; 
	Chan *c; 
	Orig *o; 
1990/0614    
	KMap *k; 
1990/0227    
	int n, on, i; 
	int lastvar;	/* used to compute stack address */ 
 
1990/0330/sys/src/9/port/sysproc.c:34,401990/0614/sys/src/9/port/sysproc.c:35,43
1990/0227    
	 */ 
	p = newproc(); 
	p->upage = newpage(1, 0, USERADDR|(p->pid&0xFFFF)); 
	upa = p->upage->pa|KZERO; 
1990/0614    
	k = kmap(p->upage); 
	upa = VA(k); 
 
1990/0227    
	/* 
	 * Save time: only copy u-> data and useful stack 
	 */ 
1990/0330/sys/src/9/port/sysproc.c:41,481990/0614/sys/src/9/port/sysproc.c:44,52
1990/0227    
	memcpy((void*)upa, u, sizeof(User)); 
	n = USERADDR+BY2PG - (ulong)&lastvar; 
	n = (n+32) & ~(BY2WD-1);	/* be safe & word align */ 
	memcpy((void*)(upa+BY2PG-n), (void*)((u->p->upage->pa|KZERO)+BY2PG-n), n); 
1990/0614    
	memcpy((void*)(upa+BY2PG-n), (void*)(USERADDR+BY2PG-n), n); 
1990/0227    
	((User *)upa)->p = p; 
1990/0614    
	kunmap(k); 
1990/0227    
 
	/* 
	 * User stack 
1990/0330/sys/src/9/port/sysproc.c:51,571990/0614/sys/src/9/port/sysproc.c:55,61
1990/0227    
	s = &p->seg[SSEG]; 
	s->proc = p; 
	on = (s->maxva-s->minva)>>PGSHIFT; 
	usp = ((Ureg*)UREGADDR)->sp; 
1990/0614    
	usp = ((Ureg*)UREGADDR)->usp; 
1990/0227    
	if(usp >= USTKTOP) 
		panic("fork bad usp %lux", usp); 
	if(usp < u->p->seg[SSEG].minva) 
1990/0330/sys/src/9/port/sysproc.c:70,821990/0614/sys/src/9/port/sysproc.c:74,88
1990/0227    
		op = u->p->seg[SSEG].o->pte[i+(on-n)].page; 
		if(op){ 
			np = newpage(1, s->o, op->va); 
1990/0614    
			k = kmap(np); 
1990/0227    
			p->seg[SSEG].o->pte[i].page = np; 
			if(i == 0){	/* only part of last stack page */ 
				memset((void*)(np->pa|KZERO), 0, usp); 
				memcpy((void*)((np->pa+usp)|KZERO), 
					(void*)((op->pa+usp)|KZERO), BY2PG-usp); 
1990/0614    
				memset((void*)VA(k), 0, usp); 
				memcpy((void*)(VA(k)+usp), 
					(void*)(op->va+usp), BY2PG-usp); 
1990/0227    
			}else		/* all of higher pages */ 
				memcpy((void*)(np->pa|KZERO), (void*)(op->pa|KZERO), BY2PG); 
1990/0614    
				memcpy((void*)VA(k), (void*)op->va, BY2PG); 
			kunmap(k); 
1990/0227    
		} 
	} 
	unlock(s->o); 
1990/0330/sys/src/9/port/sysproc.c:350,3561990/0614/sys/src/9/port/sysproc.c:356,362
1990/0227    
	((Ureg*)UREGADDR)->pc = exec.entry - 4; 
	sp = (ulong*)(USTKTOP - ssize); 
	*--sp = nargs; 
	((Ureg*)UREGADDR)->sp = (ulong)sp; 
1990/0614    
	((Ureg*)UREGADDR)->usp = (ulong)sp; 
1990/0227    
	lock(&p->debug); 
	u->nnote = 0; 
	u->notify = 0; 
1990/0614/sys/src/9/port/sysproc.c:404,4111990/0619/sys/src/9/port/sysproc.c:404,409 (short | long)
1990/0227    
long 
syssleep(ulong *arg) 
{ 
	int ms; 
                 
	tsleep(&u->p->sleep, return0, 0, arg[0]); 
	return 0; 
} 
1990/0619/sys/src/9/port/sysproc.c:157,1631990/08141/sys/src/9/port/sysproc.c:157,163 (short | long)
1990/0227    
	Seg *s; 
	ulong l, t, d, b, v; 
	int i; 
	Chan *tc; 
1990/08141    
	Chan *tc, *c; 
1990/0227    
	Orig *o; 
	char **argv, **argp; 
	char *a, *charp, *file; 
1990/0619/sys/src/9/port/sysproc.c:287,2921990/08141/sys/src/9/port/sysproc.c:287,301
1990/0227    
	 * Committed.  Free old memory 
	 */ 
	freesegs(ESEG); 
1990/08141    
 
	/* 
	 * Close on exec 
	 */ 
	for(i=0; i<=u->maxfd; i++) 
		if((c=u->fd[i]) && c->flag&CCEXEC){ 
			close(c); 
			fdclose(i); 
		} 
1990/0227    
 
	/* 
	 * Text.  Shared. 
1990/08141/sys/src/9/port/sysproc.c:496,5011990/1009/sys/src/9/port/sysproc.c:496,503 (short | long)
1990/0227    
	} 
	if(arg[0] == 0) 
		pgrpcpy(pg, u->p->pgrp); 
1990/1009    
	else 
		memcpy(pg->user, u->p->pgrp->user, NAMELEN); 
1990/0227    
	closepgrp(u->p->pgrp); 
	u->p->pgrp = pg; 
	return pg->pgrpid; 
1990/1009/sys/src/9/port/sysproc.c:183,1891990/11211/sys/src/9/port/sysproc.c:183,189 (short | long)
1990/0227    
	n = (*devtab[tc->type].read)(tc, &exec, sizeof(Exec)); 
	if(n < 2) 
    Err: 
		error(0, Ebadexec); 
1990/11211    
		error(Ebadexec); 
1990/0227    
	if(n==sizeof(Exec) && exec.magic==V_MAGIC){ 
		if((exec.text&KZERO) 
		|| (ulong)exec.entry < UTZERO+sizeof(Exec) 
1990/1009/sys/src/9/port/sysproc.c:223,2291990/11211/sys/src/9/port/sysproc.c:223,229
1990/0227    
	d = (t + exec.data) & ~(BY2PG-1); 
	b = (t + exec.data + exec.bss + (BY2PG-1)) & ~(BY2PG-1); 
	if((t|d|b) & KZERO) 
		error(0, Ebadexec); 
1990/11211    
		error(Ebadexec); 
1990/0227    
 
	/* 
	 * Args: pass 1: count 
1990/1009/sys/src/9/port/sysproc.c:446,4861990/11211/sys/src/9/port/sysproc.c:446,464
1990/0227    
} 
 
long 
syslasterr(ulong *arg) 
1990/11211    
sysdeath(ulong *arg) 
1990/0227    
{ 
	Error *e; 
                 
	validaddr(arg[0], sizeof u->error, 1); 
	evenaddr(arg[0]); 
	e = (Error *)arg[0]; 
	memcpy(e, &u->error, sizeof u->error); 
	memset(&u->error, 0, sizeof u->error); 
	e->type = devchar[e->type]; 
	return 0; 
1990/11211    
	pprint("deprecated system call"); 
	pexit("Suicide", 0); 
1990/0227    
} 
 
long 
syserrstr(ulong *arg) 
{ 
	Error *e, err; 
	char buf[ERRLEN]; 
 
	validaddr(arg[1], ERRLEN, 1); 
	e = &err; 
	if(arg[0]){ 
		validaddr(arg[0], sizeof u->error, 0); 
		memcpy(e, (Error*)arg[0], sizeof(Error)); 
		e->type = devno(e->type, 1); 
		if(e->type == -1){ 
			e->type = 0; 
			e->code = Egreg+1;	/* -> "no such error" */ 
		} 
	}else{ 
		memcpy(e, &u->error, sizeof(Error)); 
		memset(&u->error, 0, sizeof(Error)); 
	} 
	(*devtab[e->type].errstr)(e, buf); 
	memcpy((char*)arg[1], buf, sizeof buf); 
1990/11211    
	validaddr(arg[0], ERRLEN, 1); 
	memcpy((char*)arg[0], u->error, ERRLEN); 
1990/0227    
	return 0; 
} 
 
1990/1009/sys/src/9/port/sysproc.c:515,5211990/11211/sys/src/9/port/sysproc.c:493,499
1990/0227    
sysnoted(ulong *arg) 
{ 
	if(u->notified == 0) 
		error(0, Egreg); 
1990/11211    
		error(Egreg); 
1990/0227    
	return 0; 
} 
 
1990/1009/sys/src/9/port/sysproc.c:526,5311990/11211/sys/src/9/port/sysproc.c:504,509
1990/0227    
sysbrk_(ulong *arg) 
{ 
	if(segaddr(&u->p->seg[BSEG], u->p->seg[BSEG].minva, arg[0]) == 0) 
		error(0, Esegaddr); 
1990/11211    
		error(Esegaddr); 
1990/0227    
	return 0; 
} 
1990/11211/sys/src/9/port/sysproc.c:13,191990/1123/sys/src/9/port/sysproc.c:13,19 (short | long)
1990/0227    
long 
sysr1(ulong *arg) 
{ 
	print("[%d] r1 = %d\n", u->p->pid, arg[0]); 
1990/1123    
	print("[%s %s %d] r1 = %d\n", u->p->pgrp->user, u->p->text, u->p->pid, arg[0]); 
1990/0227    
	return 0; 
} 
 
1990/1123/sys/src/9/port/sysproc.c:111,1301990/1124/sys/src/9/port/sysproc.c:111,116 (short | long)
1990/0227    
		if(c = u->fd[n])	/* assign = */ 
			incref(c); 
	/* 
1990/03081    
	 * Committed.  Link into hierarchy 
	 */ 
	lock(&p->kidlock); 
	lock(&u->p->kidlock); 
	if(u->p->kid == 0){ 
		p->sib = p; 
		u->p->kid = p; 
	}else{ 
		p->sib = u->p->kid->sib; 
		u->p->kid->sib = p; 
	} 
	unlock(&u->p->kidlock); 
	unlock(&p->kidlock); 
	/* 
1990/0227    
	 * Sched 
	 */ 
	if(setlabel(&p->sched)){ 
1990/1123/sys/src/9/port/sysproc.c:135,1411990/1124/sys/src/9/port/sysproc.c:121,126
1990/0227    
		spllo(); 
		return 0; 
	} 
1990/03081    
	p->pop = u->p; 
1990/0227    
	p->parent = u->p; 
	p->parentpid = u->p->pid; 
	p->pgrp = u->p->pgrp; 
1990/1124/sys/src/9/port/sysproc.c:41,461990/1211/sys/src/9/port/sysproc.c:41,47 (short | long)
Created.
rsc Fri Mar 4 12:44:25 2005
1990/0227    
	/* 
	 * Save time: only copy u-> data and useful stack 
	 */ 
1990/1211    
	clearmmucache(); 
1990/0227    
	memcpy((void*)upa, u, sizeof(User)); 
	n = USERADDR+BY2PG - (ulong)&lastvar; 
	n = (n+32) & ~(BY2WD-1);	/* be safe & word align */ 
1990/1124/sys/src/9/port/sysproc.c:114,1191990/1211/sys/src/9/port/sysproc.c:115,121
1990/0227    
	 * Sched 
	 */ 
	if(setlabel(&p->sched)){ 
1990/1211    
		clearmmucache(); 
1990/0227    
		u->p = p; 
		p->state = Running; 
		p->mach = m; 
1990/1124/sys/src/9/port/sysproc.c:132,1371990/1211/sys/src/9/port/sysproc.c:134,140
1990/0227    
	memcpy(p->text, u->p->text, NAMELEN); 
	ready(p); 
	flushmmu(); 
1990/1211    
	clearmmucache(); 
1990/0227    
	return pid; 
} 
 
1990/1124/sys/src/9/port/sysproc.c:147,1531990/1211/sys/src/9/port/sysproc.c:150,156
1990/0227    
	char **argv, **argp; 
	char *a, *charp, *file; 
	char *progarg[sizeof(Exec)/2+1], elem[NAMELEN]; 
	ulong ssize, spage, nargs, nbytes, n; 
1990/1211    
	ulong ssize, spage, nargs, nbytes, n, bssend; 
1990/0227    
	ulong *sp; 
	int indir; 
	Exec exec; 
1990/1124/sys/src/9/port/sysproc.c:169,1751990/1211/sys/src/9/port/sysproc.c:172,178
1990/0227    
	if(n < 2) 
    Err: 
1990/11211    
		error(Ebadexec); 
1990/0227    
	if(n==sizeof(Exec) && exec.magic==V_MAGIC){ 
1990/1211    
	if(n==sizeof(Exec) && exec.magic==AOUT_MAGIC){ 
1990/0227    
		if((exec.text&KZERO) 
		|| (ulong)exec.entry < UTZERO+sizeof(Exec) 
		|| (ulong)exec.entry >= UTZERO+sizeof(Exec)+exec.text) 
1990/1124/sys/src/9/port/sysproc.c:206,2121990/1211/sys/src/9/port/sysproc.c:209,216
1990/0227    
	 * Last partial page of data goes into BSS. 
	 */ 
	d = (t + exec.data) & ~(BY2PG-1); 
	b = (t + exec.data + exec.bss + (BY2PG-1)) & ~(BY2PG-1); 
1990/1211    
	bssend = t + exec.data + exec.bss; 
	b = (bssend + (BY2PG-1)) & ~(BY2PG-1); 
1990/0227    
	if((t|d|b) & KZERO) 
1990/11211    
		error(Ebadexec); 
1990/0227    
 
1990/1124/sys/src/9/port/sysproc.c:331,3361990/1211/sys/src/9/port/sysproc.c:335,342
1990/0227    
 
	close(tc); 
 
1990/1211    
	p->bssend = bssend; 
 
1990/0227    
	/* 
	 * Move the stack 
	 */ 
1990/1124/sys/src/9/port/sysproc.c:347,3531990/1211/sys/src/9/port/sysproc.c:353,360
1990/0227    
	unlock(o); 
 
	flushmmu(); 
	((Ureg*)UREGADDR)->pc = exec.entry - 4; 
1990/1211    
 	clearmmucache(); 
	((Ureg*)UREGADDR)->pc = exec.entry + ENTRYOFFSET; 
1990/0227    
	sp = (ulong*)(USTKTOP - ssize); 
	*--sp = nargs; 
1990/0614    
	((Ureg*)UREGADDR)->usp = (ulong)sp; 
1990/1124/sys/src/9/port/sysproc.c:355,3601990/1211/sys/src/9/port/sysproc.c:362,368
1990/0227    
	u->nnote = 0; 
	u->notify = 0; 
	u->notified = 0; 
1990/1211    
	setup(p); 
1990/0227    
	unlock(&p->debug); 
	return 0; 
} 
1990/1124/sys/src/9/port/sysproc.c:488,4941990/1211/sys/src/9/port/sysproc.c:496,520
1990/0227    
long 
sysbrk_(ulong *arg) 
{ 
	if(segaddr(&u->p->seg[BSEG], u->p->seg[BSEG].minva, arg[0]) == 0) 
1990/1211    
	ulong addr; 
	Seg *s; 
 
	addr = arg[0]; 
#ifdef WHYROB 
	if(addr < u->p->bssend){ 
		pprint("addr below bss\n"); 
		pexit("Suicide", 0); 
1990/11211    
		error(Esegaddr); 
1990/1211    
	} 
#endif WHYROB 
	if(addr <= ((u->p->bssend+(BY2PG-1))&~(BY2PG-1)))	/* still in DSEG */ 
		goto Return; 
	if(segaddr(&u->p->seg[BSEG], u->p->seg[BSEG].minva, arg[0]) == 0){ 
		pprint("bad segaddr in brk\n"); 
		pexit("Suicide", 0); 
		error(Esegaddr); 
	} 
    Return: 
	u->p->bssend = addr; 
1990/0227    
	return 0; 
} 
1990/1211/sys/src/9/port/sysproc.c:205,2141990/1212/sys/src/9/port/sysproc.c:205,211 (short | long)
1990/0227    
 
    Binary: 
	t = (UTZERO+sizeof(Exec)+exec.text+(BY2PG-1)) & ~(BY2PG-1); 
	/* 
	 * Last partial page of data goes into BSS. 
	 */ 
	d = (t + exec.data) & ~(BY2PG-1); 
1990/1212    
	d = (t + exec.data + (BY2PG-1)) & ~(BY2PG-1); 
1990/1211    
	bssend = t + exec.data + exec.bss; 
	b = (bssend + (BY2PG-1)) & ~(BY2PG-1); 
1990/0227    
	if((t|d|b) & KZERO) 
1990/1211/sys/src/9/port/sysproc.c:311,3171990/1212/sys/src/9/port/sysproc.c:308,314
1990/0227    
	if(o == 0){ 
		o = neworig(t, (d-t)>>PGSHIFT, OWRPERM|OPURE|OCACHED, tc); 
		o->minca = p->seg[TSEG].o->maxca; 
		o->maxca = o->minca + (exec.data & ~(BY2PG-1)); 
1990/1212    
		o->maxca = o->minca + exec.data; 
1990/0227    
	} 
	s->o = o; 
	s->minva = t; 
1990/1211/sys/src/9/port/sysproc.c:319,3331990/1212/sys/src/9/port/sysproc.c:316,328
1990/0227    
	s->mod = 0; 
 
	/* 
	 * BSS.  Created afresh, starting with last page of data. 
	 * BUG: should pick up the last page of data, which should be cached in the 
	 * data segment. 
1990/1212    
	 * BSS.  Created afresh. 
1990/0227    
	 */ 
	s = &p->seg[BSEG]; 
	s->proc = p; 
	o = neworig(d, (b-d)>>PGSHIFT, OWRPERM, tc); 
	o->minca = p->seg[DSEG].o->maxca; 
	o->maxca = o->minca + (exec.data & (BY2PG-1)); 
1990/1212    
	o = neworig(d, (b-d)>>PGSHIFT, OWRPERM, 0); 
	o->minca = 0; 
	o->maxca = 0; 
1990/0227    
	s->o = o; 
	s->minva = d; 
	s->maxva = b; 
1990/1211/sys/src/9/port/sysproc.c:353,3591990/1212/sys/src/9/port/sysproc.c:348,354
1990/0227    
	unlock(o); 
 
	flushmmu(); 
1990/1211    
 	clearmmucache(); 
1990/1212    
	clearmmucache(); 
1990/1211    
	((Ureg*)UREGADDR)->pc = exec.entry + ENTRYOFFSET; 
1990/0227    
	sp = (ulong*)(USTKTOP - ssize); 
	*--sp = nargs; 
1990/1211/sys/src/9/port/sysproc.c:362,3681990/1212/sys/src/9/port/sysproc.c:357,363
1990/0227    
	u->nnote = 0; 
	u->notify = 0; 
	u->notified = 0; 
1990/1211    
	setup(p); 
1990/1212    
	procsetup(p); 
1990/0227    
	unlock(&p->debug); 
	return 0; 
} 
1990/1212/sys/src/9/port/sysproc.c:233,2391990/1226/sys/src/9/port/sysproc.c:233,239 (short | long)
1990/0227    
			validaddr((ulong)argp, BY2WD, 0); 
		validaddr((ulong)a, 1, 0); 
		nbytes += (vmemchr(a, 0, 0xFFFFFFFF) - a) + 1; 
			nargs++; 
1990/1226    
		nargs++; 
1990/0227    
	} 
	ssize = BY2WD*(nargs+1) + ((nbytes+(BY2WD-1)) & ~(BY2WD-1)); 
	spage = (ssize+(BY2PG-1)) >> PGSHIFT; 
1990/1212/sys/src/9/port/sysproc.c:349,3551990/1226/sys/src/9/port/sysproc.c:349,355
1990/0227    
 
	flushmmu(); 
1990/1212    
	clearmmucache(); 
1990/1211    
	((Ureg*)UREGADDR)->pc = exec.entry + ENTRYOFFSET; 
1990/1226    
	execpc(exec.entry); 
1990/0227    
	sp = (ulong*)(USTKTOP - ssize); 
	*--sp = nargs; 
1990/0614    
	((Ureg*)UREGADDR)->usp = (ulong)sp; 
1990/1226/sys/src/9/port/sysproc.c:126,1311990/1227/sys/src/9/port/sysproc.c:126,132 (short | long)
1990/0227    
	p->parent = u->p; 
	p->parentpid = u->p->pid; 
	p->pgrp = u->p->pgrp; 
1990/1227    
	p->bssend = u->p->bssend; 
1990/0227    
	incref(p->pgrp); 
1990/0324    
	u->p->nchild++; 
1990/0227    
	pid = p->pid; 
1990/1226/sys/src/9/port/sysproc.c:495,5071990/1227/sys/src/9/port/sysproc.c:496,506
1990/1211    
	Seg *s; 
 
	addr = arg[0]; 
#ifdef WHYROB 
	if(addr < u->p->bssend){ 
		pprint("addr below bss\n"); 
		pexit("Suicide", 0); 
1990/11211    
		error(Esegaddr); 
1990/1211    
	} 
#endif WHYROB 
	if(addr <= ((u->p->bssend+(BY2PG-1))&~(BY2PG-1)))	/* still in DSEG */ 
		goto Return; 
	if(segaddr(&u->p->seg[BSEG], u->p->seg[BSEG].minva, arg[0]) == 0){ 
1990/1227/sys/src/9/port/sysproc.c:127,1321991/0118/sys/src/9/port/sysproc.c:127,133 (short | long)
1990/0227    
	p->parentpid = u->p->pid; 
	p->pgrp = u->p->pgrp; 
1990/1227    
	p->bssend = u->p->bssend; 
1991/0118    
	p->fpstate = u->p->fpstate; 
1990/0227    
	incref(p->pgrp); 
1990/0324    
	u->p->nchild++; 
1990/0227    
	pid = p->pid; 
1991/0118/sys/src/9/port/sysproc.c:42,511991/0318/sys/src/9/port/sysproc.c:42,51 (short | long)
1990/0227    
	 * Save time: only copy u-> data and useful stack 
	 */ 
1990/1211    
	clearmmucache(); 
1990/0227    
	memcpy((void*)upa, u, sizeof(User)); 
1991/0318    
	memmove((void*)upa, u, sizeof(User)); 
1990/0227    
	n = USERADDR+BY2PG - (ulong)&lastvar; 
	n = (n+32) & ~(BY2WD-1);	/* be safe & word align */ 
1990/0614    
	memcpy((void*)(upa+BY2PG-n), (void*)(USERADDR+BY2PG-n), n); 
1991/0318    
	memmove((void*)(upa+BY2PG-n), (void*)(USERADDR+BY2PG-n), n); 
1990/0227    
	((User *)upa)->p = p; 
1990/0614    
	kunmap(k); 
1990/0227    
 
1991/0118/sys/src/9/port/sysproc.c:79,881991/0318/sys/src/9/port/sysproc.c:79,88
1990/0227    
			p->seg[SSEG].o->pte[i].page = np; 
			if(i == 0){	/* only part of last stack page */ 
1990/0614    
				memset((void*)VA(k), 0, usp); 
				memcpy((void*)(VA(k)+usp), 
1991/0318    
				memmove((void*)(VA(k)+usp), 
1990/0614    
					(void*)(op->va+usp), BY2PG-usp); 
1990/0227    
			}else		/* all of higher pages */ 
1990/0614    
				memcpy((void*)VA(k), (void*)op->va, BY2PG); 
1991/0318    
				memmove((void*)VA(k), (void*)op->va, BY2PG); 
1990/0614    
			kunmap(k); 
1990/0227    
		} 
	} 
1991/0118/sys/src/9/port/sysproc.c:133,1391991/0318/sys/src/9/port/sysproc.c:133,139
1990/0227    
	pid = p->pid; 
	memset(p->time, 0, sizeof(p->time)); 
	p->time[TReal] = MACHP(0)->ticks; 
	memcpy(p->text, u->p->text, NAMELEN); 
1991/0318    
	memmove(p->text, u->p->text, NAMELEN); 
1990/0227    
	ready(p); 
	flushmmu(); 
1990/1211    
	clearmmucache(); 
1991/0118/sys/src/9/port/sysproc.c:185,1911991/0318/sys/src/9/port/sysproc.c:185,191
1990/0227    
	/* 
	 * Process #! /bin/sh args ... 
	 */ 
	memcpy(line, &exec, sizeof(Exec)); 
1991/0318    
	memmove(line, &exec, sizeof(Exec)); 
1990/0227    
	if(indir || line[0]!='#' || line[1]!='!') 
		goto Err; 
	n = shargs(line, n, progarg); 
1991/0118/sys/src/9/port/sysproc.c:265,2751991/0318/sys/src/9/port/sysproc.c:265,275
1990/0227    
		} 
		*argv++ = charp + (USTKTOP-TSTKTOP); 
		n = strlen(*argp) + 1; 
		memcpy(charp, *argp++, n); 
1991/0318    
		memmove(charp, *argp++, n); 
1990/0227    
		charp += n; 
	} 
 
	memcpy(p->text, elem, NAMELEN); 
1991/0318    
	memmove(p->text, elem, NAMELEN); 
1990/0227    
 
	/* 
	 * Committed.  Free old memory 
1991/0118/sys/src/9/port/sysproc.c:448,4541991/0318/sys/src/9/port/sysproc.c:448,454
1990/0227    
	char buf[ERRLEN]; 
 
1990/11211    
	validaddr(arg[0], ERRLEN, 1); 
	memcpy((char*)arg[0], u->error, ERRLEN); 
1991/0318    
	memmove((char*)arg[0], u->error, ERRLEN); 
1990/0227    
	return 0; 
} 
 
1991/0118/sys/src/9/port/sysproc.c:465,4711991/0318/sys/src/9/port/sysproc.c:465,471
1990/0227    
	if(arg[0] == 0) 
		pgrpcpy(pg, u->p->pgrp); 
1990/1009    
	else 
		memcpy(pg->user, u->p->pgrp->user, NAMELEN); 
1991/0318    
		memmove(pg->user, u->p->pgrp->user, NAMELEN); 
1990/0227    
	closepgrp(u->p->pgrp); 
	u->p->pgrp = pg; 
	return pg->pgrpid; 
1991/0318/sys/src/9/port/sysproc.c:474,4801991/0326/sys/src/9/port/sysproc.c:474,481 (short | long)
1990/0227    
long 
sysnotify(ulong *arg) 
{ 
	validaddr(arg[0], sizeof(ulong), 0); 
1991/0326    
	if(arg[0] != 0) 
		validaddr(arg[0], sizeof(ulong), 0); 
1990/0227    
	u->notify = (int(*)(void*, char*))(arg[0]); 
	return 0; 
} 
1991/0326/sys/src/9/port/sysproc.c:170,1761991/0411/sys/src/9/port/sysproc.c:170,176 (short | long)
1990/0227    
	} 
	if(!indir) 
		strcpy(elem, u->elem); 
	n = (*devtab[tc->type].read)(tc, &exec, sizeof(Exec)); 
1991/0411    
	n = (*devtab[tc->type].read)(tc, &exec, sizeof(Exec), 0); 
1990/0227    
	if(n < 2) 
    Err: 
1990/11211    
		error(Ebadexec); 
1991/0411/sys/src/9/port/sysproc.c:134,1421991/0430/sys/src/9/port/sysproc.c:134,142 (short | long)
1990/0227    
	memset(p->time, 0, sizeof(p->time)); 
	p->time[TReal] = MACHP(0)->ticks; 
1991/0318    
	memmove(p->text, u->p->text, NAMELEN); 
1990/0227    
	ready(p); 
	flushmmu(); 
1990/1211    
	clearmmucache(); 
1991/0430    
	ready(p); 
1990/0227    
	return pid; 
} 
 
1991/0430/sys/src/9/port/sysproc.c:407,4121991/0513/sys/src/9/port/sysproc.c:407,417 (short | long)
1990/0227    
	return 0; 
} 
 
1991/0513    
long 
sysalarm(ulong *arg) 
{ 
	return procalarm(arg[0]);		 
} 
1990/0227    
 
long 
sysexits(ulong *arg) 
1991/0513/sys/src/9/port/sysproc.c:460,4651991/0514/sys/src/9/port/sysproc.c:460,466 (short | long)
1990/0227    
long 
sysforkpgrp(ulong *arg) 
{ 
1991/0514    
	int mask; 
1990/0227    
	Pgrp *pg; 
 
	pg = newpgrp(); 
1991/0513/sys/src/9/port/sysproc.c:467,4761991/0514/sys/src/9/port/sysproc.c:468,492
1990/0227    
		closepgrp(pg); 
		nexterror(); 
	} 
	if(arg[0] == 0) 
1991/0514    
 
	mask = arg[0]; 
	if(mask == FPall) 
		mask = FPnote|FPenv|FPnamespc; 
 
	memmove(pg->user, u->p->pgrp->user, NAMELEN); 
 
	if(mask & FPnamespc) 
1990/0227    
		pgrpcpy(pg, u->p->pgrp); 
1990/1009    
	else 
1991/0318    
		memmove(pg->user, u->p->pgrp->user, NAMELEN); 
1991/0514    
 
	if(mask & FPenv) 
		envcpy(pg, u->p->pgrp); 
 
	if((mask & FPnote) == 0) { 
		u->nnote = 0; 
		u->notified = 0; 
		memset(u->note, 0, sizeof(u->note)); 
	} 
 
1990/0227    
	closepgrp(u->p->pgrp); 
	u->p->pgrp = pg; 
	return pg->pgrpid; 
1991/0514/sys/src/9/port/sysproc.c:152,1581991/0522/sys/src/9/port/sysproc.c:152,158 (short | long)
1990/0227    
	char **argv, **argp; 
	char *a, *charp, *file; 
	char *progarg[sizeof(Exec)/2+1], elem[NAMELEN]; 
1990/1211    
	ulong ssize, spage, nargs, nbytes, n, bssend; 
1991/0522    
	ulong sbase, ssize, spage, nargs, nbytes, n, bssend; 
1990/0227    
	ulong *sp; 
	int indir; 
	Exec exec; 
1991/0514/sys/src/9/port/sysproc.c:239,2511991/0522/sys/src/9/port/sysproc.c:239,254
1990/0227    
	} 
	ssize = BY2WD*(nargs+1) + ((nbytes+(BY2WD-1)) & ~(BY2WD-1)); 
	spage = (ssize+(BY2PG-1)) >> PGSHIFT; 
                 
1991/0522    
	sbase = TSTKTOP-(spage<<PGSHIFT); 
1990/0227    
	/* 
	 * Build the stack segment, putting it in kernel virtual for the moment 
	 */ 
1991/0522    
	if(sbase <= USERADDR) 
		errors("not enough argument stack space"); 
 
1990/0227    
	s = &p->seg[ESEG]; 
	s->proc = p; 
	s->o = neworig(TSTKTOP-(spage<<PGSHIFT), spage, OWRPERM, 0); 
1991/0522    
	s->o = neworig(sbase, spage, OWRPERM, 0); 
1990/0227    
	s->minva = s->o->va; 
	s->maxva = TSTKTOP; 
 
1991/0522/sys/src/9/port/sysproc.c:152,1581991/0523/sys/src/9/port/sysproc.c:152,158 (short | long)
1990/0227    
	char **argv, **argp; 
	char *a, *charp, *file; 
	char *progarg[sizeof(Exec)/2+1], elem[NAMELEN]; 
1991/0522    
	ulong sbase, ssize, spage, nargs, nbytes, n, bssend; 
1991/0523    
	ulong ssize, spage, nargs, nbytes, n, bssend; 
1990/0227    
	ulong *sp; 
	int indir; 
	Exec exec; 
1991/0522/sys/src/9/port/sysproc.c:239,2541991/0523/sys/src/9/port/sysproc.c:239,253
1990/0227    
	} 
	ssize = BY2WD*(nargs+1) + ((nbytes+(BY2WD-1)) & ~(BY2WD-1)); 
	spage = (ssize+(BY2PG-1)) >> PGSHIFT; 
1991/0522    
	sbase = TSTKTOP-(spage<<PGSHIFT); 
1990/0227    
	/* 
	 * Build the stack segment, putting it in kernel virtual for the moment 
	 */ 
1991/0522    
	if(sbase <= USERADDR) 
1991/0523    
	if(spage > TSTKSIZ) 
1991/0522    
		errors("not enough argument stack space"); 
 
1990/0227    
	s = &p->seg[ESEG]; 
	s->proc = p; 
1991/0522    
	s->o = neworig(sbase, spage, OWRPERM, 0); 
1991/0523    
	s->o = neworig(TSTKTOP-(spage<<PGSHIFT), spage, OWRPERM, 0); 
1990/0227    
	s->minva = s->o->va; 
	s->maxva = TSTKTOP; 
 
1991/0523/sys/src/9/port/sysproc.c:41,471991/0529/sys/src/9/port/sysproc.c:41,47 (short | long)
1990/0227    
	/* 
	 * Save time: only copy u-> data and useful stack 
	 */ 
1990/1211    
	clearmmucache(); 
1991/0529    
	clearmmucache();	/* so child doesn't inherit any of your mappings */ 
1991/0318    
	memmove((void*)upa, u, sizeof(User)); 
1990/0227    
	n = USERADDR+BY2PG - (ulong)&lastvar; 
	n = (n+32) & ~(BY2WD-1);	/* be safe & word align */ 
1991/0523/sys/src/9/port/sysproc.c:115,1211991/0529/sys/src/9/port/sysproc.c:115,120
1990/0227    
	 * Sched 
	 */ 
	if(setlabel(&p->sched)){ 
1990/1211    
		clearmmucache(); 
1990/0227    
		u->p = p; 
		p->state = Running; 
		p->mach = m; 
1991/0523/sys/src/9/port/sysproc.c:134,1391991/0529/sys/src/9/port/sysproc.c:133,143
1990/0227    
	memset(p->time, 0, sizeof(p->time)); 
	p->time[TReal] = MACHP(0)->ticks; 
1991/0318    
	memmove(p->text, u->p->text, NAMELEN); 
1991/0529    
	/* 
	 *  since the bss/data segments are now shareable, 
	 *  any mmu info about this process is now stale 
	 *  (i.e. has bad properties) and has to be discarded. 
	 */ 
1990/0227    
	flushmmu(); 
1990/1211    
	clearmmucache(); 
1991/0430    
	ready(p); 
1991/0523/sys/src/9/port/sysproc.c:351,3561991/0529/sys/src/9/port/sysproc.c:355,364
1990/0227    
		o->pte[i].page->va += (USTKTOP-TSTKTOP); 
	unlock(o); 
 
1991/0529    
	/* 
	 *  at this point, the mmu contains info about the old address 
	 *  space and needs to be flushed 
	 */ 
1990/0227    
	flushmmu(); 
1990/1212    
	clearmmucache(); 
1990/1226    
	execpc(exec.entry); 
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)