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

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

1990/0330/sys/src/9/port/sysproc.c:26,311990/0614/sys/src/9/port/sysproc.c:26,32 (short | long | prev | next)
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; 


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