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

1998/0916/port/segment.c (diff list | history)

1998/0823/sys/src/9/port/segment.c:48,531998/0916/sys/src/9/port/segment.c:48,54 (short | long | prev | next)
1991/0705    
newseg(int type, ulong base, ulong size) 
{ 
	Segment *s; 
1998/0916    
	int mapsize; 
1991/0705    
 
	if(size > (SEGMAPSIZE*PTEPERTAB)) 
1992/0114    
		error(Enovmem); 
1998/0823/sys/src/9/port/segment.c:58,631998/0916/sys/src/9/port/segment.c:59,75
1992/0619    
	s->base = base; 
	s->top = base+(size*BY2PG); 
	s->size = size; 
1998/0916    
 
	mapsize = ROUND(size, PTEPERTAB)/PTEPERTAB; 
	if(mapsize > nelem(s->ssegmap)){ 
		s->map = smalloc(mapsize*sizeof(Pte*)); 
		s->mapsize = mapsize; 
	} 
	else{ 
		s->map = s->ssegmap; 
		s->mapsize = nelem(s->ssegmap); 
	} 
 
1992/0619    
	return s; 
1991/0705    
} 
 
1998/0823/sys/src/9/port/segment.c:91,1021998/0916/sys/src/9/port/segment.c:103,116
1993/0725    
	if(i) 
		putimage(i); 
1991/1109    
 
1993/0725    
	emap = &s->map[SEGMAPSIZE]; 
1998/0916    
	emap = &s->map[s->mapsize]; 
1993/0725    
	for(pp = s->map; pp < emap; pp++) 
		if(*pp) 
			freepte(s, *pp); 
1991/0705    
 
1993/0725    
	qunlock(&s->lk); 
1998/0916    
	if(s->map != s->ssegmap) 
		free(s->map); 
1996/0303    
	if(s->profile != 0) 
		free(s->profile); 
1993/0725    
	free(s); 
1998/0823/sys/src/9/port/segment.c:108,1141998/0916/sys/src/9/port/segment.c:122,128
1993/0810    
	Page **pg, *x; 
	Pte *pte, **p, **endpte; 
1991/0705    
 
	endpte = &s->map[SEGMAPSIZE]; 
1998/0916    
	endpte = &s->map[s->mapsize]; 
1992/0824    
	for(p = s->map; p < endpte; p++) { 
1993/0810    
		if(*p == 0) 
			continue; 
1998/0823/sys/src/9/port/segment.c:123,1291998/0916/sys/src/9/port/segment.c:137,143
1991/0705    
Segment* 
1992/1104    
dupseg(Segment **seg, int segno, int share) 
1991/0705    
{ 
1992/0824    
	int i; 
1998/0916    
	int i, size; 
1991/0705    
	Pte *pte; 
1992/1104    
	Segment *n, *s; 
1991/0705    
 
1998/0823/sys/src/9/port/segment.c:174,1801998/0916/sys/src/9/port/segment.c:188,195
1991/0705    
		n->flen = s->flen; 
1992/0824    
		break; 
1991/0705    
	} 
1992/0824    
	for(i = 0; i < SEGMAPSIZE; i++) 
1998/0916    
	size = s->mapsize; 
	for(i = 0; i < size; i++) 
1992/0824    
		if(pte = s->map[i]) 
			n->map[i] = ptecpy(pte); 
1991/0705    
 
1998/0823/sys/src/9/port/segment.c:374,3801998/0916/sys/src/9/port/segment.c:389,396
1991/0705    
{ 
	Segment *s, *ns; 
	ulong newtop, newsize; 
	int i; 
1998/0916    
	int i, mapsize; 
	Pte **map; 
1991/0705    
 
1993/0501    
	s = up->seg[seg]; 
1991/0705    
	if(s == 0) 
1998/0823/sys/src/9/port/segment.c:413,4221998/0916/sys/src/9/port/segment.c:429,447
1991/0705    
		} 
	} 
 
1992/0824    
	if(newsize > (PTEMAPMEM*SEGMAPSIZE)/BY2PG) { 
1998/0916    
	if(newsize > (SEGMAPSIZE*PTEPERTAB)) { 
1992/0824    
		qunlock(&s->lk); 
1992/0912    
		error(Enovmem); 
1992/0824    
	} 
1998/0916    
	mapsize = ROUND(newsize, PTEPERTAB)/PTEPERTAB; 
	if(mapsize > s->mapsize){ 
		map = smalloc(mapsize*sizeof(Pte*)); 
		memmove(map, s->map, s->mapsize); 
		if(s->map != s->ssegmap) 
			free(s->map); 
		s->map = map; 
		s->mapsize = mapsize; 
	} 
1992/0824    
 
1991/0705    
	s->top = newtop; 
	s->size = newsize; 
1998/0823/sys/src/9/port/segment.c:430,4361998/0916/sys/src/9/port/segment.c:455,461
1991/0705    
void 
mfreeseg(Segment *s, ulong start, int pages) 
{ 
	int i, j; 
1998/0916    
	int i, j, size; 
1991/0705    
	ulong soff; 
	Page *pg; 
1998/0724    
	Page *list; 
1998/0823/sys/src/9/port/segment.c:438,4451998/0916/sys/src/9/port/segment.c:463,471
1991/0705    
	soff = start-s->base; 
	j = (soff&(PTEMAPMEM-1))/BY2PG; 
 
1998/0916    
	size = s->mapsize; 
1998/0724    
	list = nil; 
1991/0705    
	for(i = soff/PTEMAPMEM; i < SEGMAPSIZE; i++) { 
1998/0916    
	for(i = soff/PTEMAPMEM; i < size; i++) { 
1998/0512    
		if(pages <= 0) 
1992/1206    
			break; 
		if(s->map[i] == 0) { 
1998/0823/sys/src/9/port/segment.c:477,4831998/0916/sys/src/9/port/segment.c:503,509
1991/0705    
	} 
} 
 
1994/0514    
int 
1998/0916    
Segment* 
1994/0514    
isoverlap(Proc *p, ulong va, int len) 
{ 
	int i; 
1998/0823/sys/src/9/port/segment.c:491,4991998/0916/sys/src/9/port/segment.c:517,525
1998/0512    
			continue; 
1994/0514    
		if((newtop > ns->base && newtop <= ns->top) || 
		   (va >= ns->base && va < ns->top)) 
			return 1; 
1998/0916    
			return ns; 
1994/0514    
	} 
1998/0326    
	return 0; 
1998/0916    
	return nil; 
1998/0326    
} 
 
int 
1998/0823/sys/src/9/port/segment.c:526,5331998/0916/sys/src/9/port/segment.c:552,559
1991/0705    
ulong 
segattach(Proc *p, ulong attr, char *name, ulong va, ulong len) 
{ 
	int i, sno; 
1994/0514    
	Segment *s; 
1998/0916    
	int sno; 
	Segment *s, *os; 
1994/0514    
	Physseg *ps; 
1991/0705    
 
1994/0514    
	if(va != 0 && (va&KZERO) == KZERO)	/* BUG: Only ok for now */ 
1998/0823/sys/src/9/port/segment.c:537,5431998/0916/sys/src/9/port/segment.c:563,569
1991/0705    
	vmemchr(name, 0, ~0); 
 
	for(sno = 0; sno < NSEG; sno++) 
1994/0514    
		if(p->seg[sno] == 0 && sno != ESEG) 
1998/0916    
		if(p->seg[sno] == nil && sno != ESEG) 
1991/0705    
			break; 
 
	if(sno == NSEG) 
1998/0823/sys/src/9/port/segment.c:545,5621998/0916/sys/src/9/port/segment.c:571,598
1991/0705    
 
	len = PGROUND(len); 
1994/0514    
 
	/* Find a hole in the address space */ 
1998/0916    
	/* 
	 * Find a hole in the address space. 
	 * Starting at the lowest possible stack address - len, 
	 * check for an overlapping segment, and repeat at the 
	 * base of that segment - len until either a hole is found 
	 * or the address space is exhausted. 
	 */ 
1994/0514    
	if(va == 0) { 
		va = p->seg[SSEG]->base - len; 
		for(i = 0; i < 20; i++) { 
			if(isoverlap(p, va, len) == 0) 
1998/0916    
		for(;;) { 
			os = isoverlap(p, va, len); 
			if(os == nil) 
1994/0514    
				break; 
1998/0916    
			va = os->base; 
			if(len > va) 
				error(Enovmem); 
1994/0514    
			va -= len; 
		} 
1991/0705    
	} 
 
1994/0514    
	va = va&~(BY2PG-1); 
	if(isoverlap(p, va, len)) 
1998/0916    
	if(isoverlap(p, va, len) != nil) 
1994/0514    
		error(Esoverlap); 
 
1991/0731    
	for(ps = physseg; ps->name; ps++) 
1998/0823/sys/src/9/port/segment.c:568,5741998/0916/sys/src/9/port/segment.c:604,610
1991/0705    
	if(len > ps->size) 
1992/0114    
		error(Enovmem); 
1991/0705    
 
1993/0725    
	attr &= ~SG_TYPE;		/* Turn off what we are not allowed */ 
1998/0916    
	attr &= ~SG_TYPE;		/* Turn off what is not allowed */ 
1993/0725    
	attr |= ps->attr;		/* Copy in defaults */ 
1991/0705    
 
	s = newseg(attr, va, len/BY2PG); 


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