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

1992/0114/port/segment.c (diff list | history)

1992/0111/sys/src/9/port/segment.c:57,631992/0114/sys/src/9/port/segment.c:57,63 (short | long | prev | next)
1991/0705    
	Segment *s; 
 
	if(size > (SEGMAPSIZE*PTEPERTAB)) 
		errors("segment too large"); 
1992/0114    
		error(Enovmem); 
1991/0705    
 
	for(;;) { 
		lock(&segalloc); 
1992/0111/sys/src/9/port/segment.c:335,3411992/0114/sys/src/9/port/segment.c:335,341
1991/0705    
 
	s = u->p->seg[seg]; 
	if(s == 0) 
		errors("no segment"); 
1992/0114    
		error(Ebadarg); 
1991/0705    
 
	if(addr == 0) 
		return s->base; 
1992/0111/sys/src/9/port/segment.c:346,3521992/0114/sys/src/9/port/segment.c:346,352
1991/0705    
		/* We may start with the bss overlapping the data */ 
		if(seg != BSEG || u->p->seg[DSEG] == 0 || addr < u->p->seg[DSEG]->base) { 
			qunlock(&s->lk); 
1991/1125    
			errors("addr below segment"); 
1992/0114    
			error(Enovmem); 
1991/1125    
		} 
1991/0705    
		addr = s->base; 
	} 
1992/0111/sys/src/9/port/segment.c:371,3771992/0114/sys/src/9/port/segment.c:371,377
1991/0705    
		if(newtop >= ns->base && newtop < ns->top) { 
			qunlock(&s->lk); 
			pprint("segments overlap\n"); 
			error(Esegaddr); 
1992/0114    
			error(Enovmem); 
1991/0705    
		} 
	} 
 
1992/0111/sys/src/9/port/segment.c:424,4301992/0114/sys/src/9/port/segment.c:424,430
1991/0705    
 
1991/1115    
	USED(p); 
1991/0705    
	if(va&KZERO)					/* BUG: Only ok for now */ 
		errors("bad virtual address"); 
1992/0114    
		error(Ebadarg); 
1991/0705    
 
	validaddr((ulong)name, 1, 0); 
	vmemchr(name, 0, ~0); 
1992/0111/sys/src/9/port/segment.c:434,4401992/0114/sys/src/9/port/segment.c:434,440
1991/0705    
			break; 
 
	if(sno == NSEG) 
		errors("no per process segments"); 
1992/0114    
		error(Enovmem); 
1991/0705    
 
	va = va&~(BY2PG-1); 
	len = PGROUND(len); 
1992/0111/sys/src/9/port/segment.c:445,4511992/0114/sys/src/9/port/segment.c:445,451
1991/0705    
			continue;	 
1991/0803    
		if((newtop > ns->base && newtop <= ns->top) || 
		   (va >= ns->base && va < ns->top)) 
1991/0705    
			errors("segments overlap"); 
1992/0114    
			error(Enovmem); 
1991/0705    
	} 
 
1991/0731    
	for(ps = physseg; ps->name; ps++) 
1992/0111/sys/src/9/port/segment.c:452,4611992/0114/sys/src/9/port/segment.c:452,461
1991/0705    
		if(strcmp(name, ps->name) == 0) 
			goto found; 
 
	errors("bad segment name"); 
1992/0114    
	error(Ebadarg); 
1991/0705    
found: 
	if(len > ps->size) 
		errors("segment too long"); 
1992/0114    
		error(Enovmem); 
1991/0705    
 
	attr &= ~SG_TYPE;			/* Turn off what we are not allowed */ 
	attr |= ps->attr;			/* Copy in defaults */ 
1992/0111/sys/src/9/port/segment.c:480,4861992/0114/sys/src/9/port/segment.c:480,486
1991/0705    
 
	s = seg(u->p, arg[0], 1); 
	if(s == 0) 
		errors("bad segment address"); 
1992/0114    
		error(Ebadarg); 
1991/0706    
 
	s->flushme = 1; 
1991/0705    
 


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