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

1990/06021/gnot/fault.c (diff list | history)

1990/0315/sys/src/9/gnot/fault.c:51,611990/06021/sys/src/9/gnot/fault.c:51,62 (short | long | prev | next)
1990/03091    
	Orig *o; 
	char *l; 
	Page *pg; 
1990/06021    
	KMap *k, *k1; 
1990/03091    
	int zeroed = 0, head = 1; 
	int i, user, read, insyscall; 
 
	if(u == 0) 
		panic("fault"); 
1990/06021    
		panic("fault u==0 pc=%lux", ur->pc); 
1990/03091    
	insyscall = u->p->insyscall; 
	u->p->insyscall = 1; 
	if(f->ssw & DF) 
1990/0315/sys/src/9/gnot/fault.c:149,1571990/06021/sys/src/9/gnot/fault.c:150,160
1990/03091    
			if(n > BY2PG) 
				n = BY2PG; 
			pg = newpage(1, o, addr); 
1990/06021    
			k = kmap(pg); 
1990/03091    
			qlock(o->chan); 
			if(waserror()){ 
				print("demand load i/o error %d\n", u->error.code); 
1990/06021    
				kunmap(k); 
1990/03091    
				qunlock(o->chan); 
				pg->o = 0; 
				pg->ref--; 
1990/0315/sys/src/9/gnot/fault.c:158,1721990/06021/sys/src/9/gnot/fault.c:161,176
1990/03091    
				goto cant; 
			} 
			o->chan->offset = (addr-o->va) + o->minca; 
			l = (char*)(pg->pa|KZERO); 
1990/06021    
			l = (char*)k->va; 
1990/03091    
			if((*devtab[o->chan->type].read)(o->chan, l, n) != n) 
				error(0, Eioload); 
			qunlock(o->chan); 
			poperror(); 
			/* BUG: if was first page of bss, move to data */ 
			if(n<BY2PG) 
				memset(l+n, 0, BY2PG-n); 
			lock(o); 
1990/06021    
			kunmap(k); 
			poperror(); 
1990/03091    
			opte = &o->pte[(addr-s->minva)>>PGSHIFT];	/* could move */ 
			pte = opte; 
			if(pte->page == 0){ 
1990/0315/sys/src/9/gnot/fault.c:231,2371990/06021/sys/src/9/gnot/fault.c:235,245
1990/03091    
			opte->page = 0; 
		}else{		/* copy page */ 
			pte->page = newpage(1, o, addr); 
			memcpy((void*)(pte->page->pa|KZERO), (void*)(pg->pa|KZERO), BY2PG); 
1990/06021    
			k = kmap(pte->page); 
			k1 = kmap(pg); 
			memcpy((void*)k->va, (void*)k1->va, BY2PG); 
			kunmap(k); 
			kunmap(k1); 
1990/03091    
			if(pg->ref <= 1) 
				panic("pg->ref <= 1"); 
			pg->ref--; 


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