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

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

1992/0822/sys/src/9/port/segment.c:62,701992/0824/sys/src/9/port/segment.c:62,68 (short | long | prev | next)
1991/0726    
		return; 
 
	i = s->image; 
1992/0314    
	if(i) 
	if(i->s == s) 
	if(s->ref == 1) { 
1992/0824    
	if(i && i->s == s && s->ref == 1) { 
1991/0726    
		lock(i); 
		if(s->ref == 1) 
			i->s = 0; 
1992/0822/sys/src/9/port/segment.c:94,1001992/0824/sys/src/9/port/segment.c:92,98
1991/0705    
	Page **pg, **endpages; 
 
	endpte = &s->map[SEGMAPSIZE]; 
	for(p = s->map; p < endpte; p++) 
1992/0824    
	for(p = s->map; p < endpte; p++) { 
1991/0705    
		if(*p) { 
			endpages = &((*p)->pages[PTEPERTAB]); 
			for(pg = (*p)->pages; pg < endpages; pg++) 
1992/0822/sys/src/9/port/segment.c:101,1151992/0824/sys/src/9/port/segment.c:99,115
1991/0705    
				if(*pg) 
					(*pg)->va += offset; 
		} 
1992/0824    
	} 
1991/0705    
} 
 
Segment* 
1992/0430    
dupseg(Segment *s, int share) 
1991/0705    
{ 
1992/0824    
	int i; 
1991/0705    
	Pte *pte; 
	Segment *n; 
	int i; 
 
1992/0824    
	SET(n); 
1991/0705    
	switch(s->type&SG_TYPE) { 
1991/0706    
	case SG_TEXT:			/* New segment shares pte set */ 
1991/0705    
	case SG_SHARED: 
1992/0822/sys/src/9/port/segment.c:121,1271992/0824/sys/src/9/port/segment.c:121,127
1991/0706    
	case SG_STACK: 
		qlock(&s->lk); 
1991/0705    
		n = newseg(s->type, s->base, s->size); 
1991/0706    
		goto copypte; 
1992/0824    
		break; 
1991/0705    
 
1992/0430    
	case SG_BSS:			/* Just copy on write */ 
		qlock(&s->lk); 
1992/0822/sys/src/9/port/segment.c:132,1381992/0824/sys/src/9/port/segment.c:132,138
1992/0430    
			return s; 
		} 
		n = newseg(s->type, s->base, s->size); 
		goto copypte; 
1992/0824    
		break; 
1992/0430    
 
1991/0706    
	case SG_DATA:			/* Copy on write plus demand load info */ 
		qlock(&s->lk); 
1992/0822/sys/src/9/port/segment.c:148,1661992/0824/sys/src/9/port/segment.c:148,162
1991/0705    
		n->image = s->image; 
		n->fstart = s->fstart; 
		n->flen = s->flen; 
1992/0314    
                 
1991/0705    
	copypte: 
		for(i = 0; i < SEGMAPSIZE; i++) 
			if(pte = s->map[i]) 
				n->map[i] = ptecpy(pte); 
1991/0706    
                 
		n->flushme = s->flushme; 
		qunlock(&s->lk); 
1991/0705    
		return n;	 
1992/0824    
		break; 
1991/0705    
	} 
1992/0824    
	for(i = 0; i < SEGMAPSIZE; i++) 
		if(pte = s->map[i]) 
			n->map[i] = ptecpy(pte); 
1991/0705    
 
	panic("dupseg"); 
1992/0520    
	return 0;		/* not reached */ 
1992/0824    
	n->flushme = s->flushme; 
	qunlock(&s->lk); 
	return n;	 
1991/0705    
} 
 
void 
1992/0822/sys/src/9/port/segment.c:320,3271992/0824/sys/src/9/port/segment.c:316,323
1991/0705    
 
1991/1125    
	qlock(&s->lk); 
 
1992/0824    
	/* We may start with the bss overlapping the data */ 
1991/0705    
	if(addr < s->base) { 
		/* 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); 
1992/0114    
			error(Enovmem); 
1992/0822/sys/src/9/port/segment.c:337,3591992/0824/sys/src/9/port/segment.c:333,353
1991/0705    
		return 0; 
	} 
 
	if(newsize > (PTEMAPMEM*SEGMAPSIZE)/BY2PG) { 
		qunlock(&s->lk); 
1991/0830    
		return -1; 
1991/0705    
	} 
                 
	for(i = 0; i < NSEG; i++) { 
		ns = u->p->seg[i]; 
		if(ns == 0 || ns == s) 
			continue; 
1992/0307    
		if(newtop >= ns->base) 
		if(newtop < ns->top) { 
1992/0824    
		if(newtop >= ns->base && newtop < ns->top) { 
1991/0705    
			qunlock(&s->lk); 
			pprint("segments overlap\n"); 
1992/0114    
			error(Enovmem); 
1992/0824    
			error(Esoverlap); 
1991/0705    
		} 
	} 
 
1992/0824    
	if(newsize > (PTEMAPMEM*SEGMAPSIZE)/BY2PG) { 
		qunlock(&s->lk); 
		return -1; 
	} 
 
1991/0705    
	s->top = newtop; 
	s->size = newsize; 
	qunlock(&s->lk); 
1992/0822/sys/src/9/port/segment.c:424,4301992/0824/sys/src/9/port/segment.c:418,424
1991/0705    
			continue;	 
1991/0803    
		if((newtop > ns->base && newtop <= ns->top) || 
		   (va >= ns->base && va < ns->top)) 
1992/0114    
			error(Enovmem); 
1992/0824    
			error(Esoverlap); 
1991/0705    
	} 
 
1991/0731    
	for(ps = physseg; ps->name; ps++) 


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