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

1994/0514/port/segment.c (diff list | history)

1993/1012/sys/src/9/port/segment.c:405,4201994/0514/sys/src/9/port/segment.c:405,438 (short | long | prev | next)
1991/0705    
	} 
} 
 
1994/0514    
int 
isoverlap(Proc *p, ulong va, int len) 
{ 
	int i; 
	Segment *ns; 
	ulong newtop; 
 
	newtop = va+len; 
	for(i = 0; i < NSEG; i++) { 
		ns = p->seg[i]; 
		if(ns == 0) 
			continue;	 
		if((newtop > ns->base && newtop <= ns->top) || 
		   (va >= ns->base && va < ns->top)) 
			return 1; 
	} 
	return 0; 
} 
 
1991/0705    
ulong 
segattach(Proc *p, ulong attr, char *name, ulong va, ulong len) 
{ 
1992/0711    
	Segment *s, *ns; 
1991/0705    
	Physseg *ps; 
	ulong newtop; 
	int i, sno; 
1994/0514    
	Segment *s; 
	Physseg *ps; 
1991/0705    
 
1991/1115    
	USED(p); 
1993/0725    
	if((va&KZERO) == KZERO)			/* BUG: Only ok for now */ 
1994/0514    
	if(va != 0 && (va&KZERO) == KZERO)	/* BUG: Only ok for now */ 
1992/0114    
		error(Ebadarg); 
1991/0705    
 
	validaddr((ulong)name, 1, 0); 
1993/1012/sys/src/9/port/segment.c:421,4441994/0514/sys/src/9/port/segment.c:439,466
1991/0705    
	vmemchr(name, 0, ~0); 
 
	for(sno = 0; sno < NSEG; sno++) 
1993/0501    
		if(up->seg[sno] == 0 && sno != ESEG) 
1994/0514    
		if(p->seg[sno] == 0 && sno != ESEG) 
1991/0705    
			break; 
 
	if(sno == NSEG) 
1992/0114    
		error(Enovmem); 
1991/0705    
 
	va = va&~(BY2PG-1); 
	len = PGROUND(len); 
	newtop = va+len; 
	for(i = 0; i < NSEG; i++) { 
1993/0501    
		ns = up->seg[i]; 
1991/0705    
		if(ns == 0) 
			continue;	 
1991/0803    
		if((newtop > ns->base && newtop <= ns->top) || 
		   (va >= ns->base && va < ns->top)) 
1992/0824    
			error(Esoverlap); 
1994/0514    
 
	/* Find a hole in the address space */ 
	if(va == 0) { 
		va = p->seg[SSEG]->base - len; 
		for(i = 0; i < 20; i++) { 
			if(isoverlap(p, va, len) == 0) 
				break; 
			va -= len; 
		} 
1991/0705    
	} 
 
1994/0514    
	va = va&~(BY2PG-1); 
	if(isoverlap(p, va, len)) 
		error(Esoverlap); 
 
1991/0731    
	for(ps = physseg; ps->name; ps++) 
1991/0705    
		if(strcmp(name, ps->name) == 0) 
			goto found; 
1993/1012/sys/src/9/port/segment.c:453,4611994/0514/sys/src/9/port/segment.c:475,483
1991/0705    
 
	s = newseg(attr, va, len/BY2PG); 
1993/0210    
	s->pseg = ps; 
1993/0501    
	up->seg[sno] = s; 
1994/0514    
	p->seg[sno] = s; 
1991/0705    
 
	return 0; 
1994/0514    
	return va; 
1991/0705    
} 
 
1993/0919    
void 


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