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

1990/1124/port/sysproc.c (diff list | history)

1990/1124/sys/src/9/port/sysproc.c:41,461990/1211/sys/src/9/port/sysproc.c:41,47 (short | long | prev | next)
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; 
} 


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