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

1991/1004/gnot/mmu.c (diff list | history)

1990/03091/sys/src/9/gnot/mmu.c:4,91990/06021/sys/src/9/gnot/mmu.c:4,17 (short | long)
1990/03091    
#include	"dat.h" 
#include	"fns.h" 
 
1990/06021    
struct 
{ 
	Lock; 
	int	init; 
	KMap	*free; 
	KMap	arena[4*1024*1024/BY2PG];	/* kernel mmu maps up to 4MB */ 
}kmapalloc; 
 
1990/03091    
/* 
 * Called splhi, not in Running state 
 */ 
1990/03091/sys/src/9/gnot/mmu.c:45,481990/06021/sys/src/9/gnot/mmu.c:53,107
1990/03091    
	flushcpucache(); 
	*PARAM &= ~TLBFLUSH_; 
	*PARAM |= TLBFLUSH_; 
1990/06021    
} 
 
void 
kmapinit(void) 
{ 
	KMap *k; 
	int i, e; 
 
	if(kmapalloc.init == 0){ 
		k = &kmapalloc.arena[0]; 
		k->va = KZERO|(3*1024*1024); 
		k->next = 0; 
		kmapalloc.free = k; 
		kmapalloc.init = 1; 
		return; 
	} 
	e = (4*1024*1024 - 256*1024)/BY2PG;	/* screen lives at top 256K */ 
	i = (((ulong)ialloc(0, 0))&~KZERO)/BY2PG; 
print("kmapinit %d", i); 
	kmapalloc.free = 0; 
	for(k=&kmapalloc.arena[i]; i<e; i++,k++){ 
		k->va = i*BY2PG|KZERO; 
		kunmap(k); 
	} 
} 
 
KMap* 
kmap(Page *pg) 
{ 
	KMap *k; 
 
	lock(&kmapalloc); 
	k = kmapalloc.free; 
	if(k == 0) 
		panic("kmap"); 
	kmapalloc.free = k->next; 
	unlock(&kmapalloc); 
	k->pa = pg->pa; 
	putkmmu(k->va, PPN(k->pa) | PTEVALID | PTEKERNEL); 
	return k; 
} 
 
void 
kunmap(KMap *k) 
{ 
	k->pa = 0; 
	lock(&kmapalloc); 
	k->next = kmapalloc.free; 
	kmapalloc.free = k; 
	putkmmu(k->va, INVALIDPTE); 
	unlock(&kmapalloc); 
1990/03091    
} 
1990/06021/sys/src/9/gnot/mmu.c:71,771990/0603/sys/src/9/gnot/mmu.c:71,76 (short | long)
1990/06021    
	} 
	e = (4*1024*1024 - 256*1024)/BY2PG;	/* screen lives at top 256K */ 
	i = (((ulong)ialloc(0, 0))&~KZERO)/BY2PG; 
print("kmapinit %d", i); 
	kmapalloc.free = 0; 
	for(k=&kmapalloc.arena[i]; i<e; i++,k++){ 
		k->va = i*BY2PG|KZERO; 
1990/0603/sys/src/9/gnot/mmu.c:63,691990/0709/sys/src/9/gnot/mmu.c:63,69 (short | long)
1990/06021    
 
	if(kmapalloc.init == 0){ 
		k = &kmapalloc.arena[0]; 
		k->va = KZERO|(3*1024*1024); 
1990/0709    
		k->va = KZERO|(4*1024*1024-256*1024-BY2PG); 
1990/06021    
		k->next = 0; 
		kmapalloc.free = k; 
		kmapalloc.init = 1; 
1990/0603/sys/src/9/gnot/mmu.c:71,761990/0709/sys/src/9/gnot/mmu.c:71,77
1990/06021    
	} 
	e = (4*1024*1024 - 256*1024)/BY2PG;	/* screen lives at top 256K */ 
	i = (((ulong)ialloc(0, 0))&~KZERO)/BY2PG; 
1990/0709    
	print("%lud free map registers\n", e-i); 
1990/06021    
	kmapalloc.free = 0; 
	for(k=&kmapalloc.arena[i]; i<e; i++,k++){ 
		k->va = i*BY2PG|KZERO; 
1990/0603/sys/src/9/gnot/mmu.c:85,921990/0709/sys/src/9/gnot/mmu.c:86,95
1990/06021    
 
	lock(&kmapalloc); 
	k = kmapalloc.free; 
	if(k == 0) 
1990/0709    
	if(k == 0){ 
		dumpstack(); 
1990/06021    
		panic("kmap"); 
1990/0709    
	} 
1990/06021    
	kmapalloc.free = k->next; 
	unlock(&kmapalloc); 
	k->pa = pg->pa; 
1990/0709/sys/src/9/gnot/mmu.c:12,171990/0921/sys/src/9/gnot/mmu.c:12,28 (short | long)
1990/06021    
	KMap	arena[4*1024*1024/BY2PG];	/* kernel mmu maps up to 4MB */ 
}kmapalloc; 
 
1990/0921    
void 
putxmmu(ulong tlbvirt, ulong tlbphys, int pid) 
{ 
	if(pid != u->p->pid) 
		panic("putxmmu %ld %ld\n", pid, u->p->pid); 
	if(tlbvirt&KZERO) 
		panic("putmmu"); 
	tlbphys |= VTAG(tlbvirt)<<24; 
	UMAP[(tlbvirt&0x003FE000L)>>2] = tlbphys; 
} 
 
1990/03091    
/* 
 * Called splhi, not in Running state 
 */ 
1990/0709/sys/src/9/gnot/mmu.c:19,241990/0921/sys/src/9/gnot/mmu.c:30,36
1990/03091    
mapstack(Proc *p) 
{ 
	ulong tlbvirt, tlbphys; 
1990/0921    
	ulong i; 
1990/03091    
 
	if(p->upage->va != (USERADDR|(p->pid&0xFFFF))) 
		panic("mapstack %d 0x%lux 0x%lux", p->pid, p->upage->pa, p->upage->va); 
1990/0709/sys/src/9/gnot/mmu.c:27,321990/0921/sys/src/9/gnot/mmu.c:39,52
1990/03091    
	putkmmu(tlbvirt, tlbphys); 
	flushmmu(); 
	u = (User*)USERADDR; 
1990/0921    
 
	if(u->mc.next >= NMMU){ 
		u->mc.next &= NMMU - 1; 
		for(i = u->mc.next; i < NMMU; i++) 
			putxmmu(u->mc.mmu[i].va, u->mc.mmu[i].pa, u->mc.mmu[i].pid); 
	} 
	for(i = 0; i < u->mc.next; i++) 
		putxmmu(u->mc.mmu[i].va, u->mc.mmu[i].pa, u->mc.mmu[i].pid);/**/ 
1990/03091    
} 
 
void 
1990/0709/sys/src/9/gnot/mmu.c:43,481990/0921/sys/src/9/gnot/mmu.c:63,76
1990/03091    
{ 
	if(tlbvirt&KZERO) 
		panic("putmmu"); 
1990/0921    
	if(u){ 
		MMU *mp; 
		mp = &(u->mc.mmu[u->mc.next&(NMMU-1)]); 
		mp->pa = tlbphys; 
		mp->va = tlbvirt; 
		mp->pid = u->p->pid; 
		u->mc.next++; 
	}/**/ 
1990/03091    
	tlbphys |= VTAG(tlbvirt)<<24; 
	UMAP[(tlbvirt&0x003FE000L)>>2] = tlbphys; 
} 
1990/0709/sys/src/9/gnot/mmu.c:53,581990/0921/sys/src/9/gnot/mmu.c:81,102
1990/03091    
	flushcpucache(); 
	*PARAM &= ~TLBFLUSH_; 
	*PARAM |= TLBFLUSH_; 
1990/0921    
} 
 
void 
flushmmucache(void) 
{ 
	if(u == 0) 
		panic("flushmmucache"); 
	u->mc.next = 0; 
} 
 
void 
clearmmucache(void) 
{ 
	if(u == 0) 
		panic("clearmmucache"); 
	memset(&u->mc, 0, sizeof u->mc); 
1990/06021    
} 
 
void 
1990/0921/sys/src/9/gnot/mmu.c:40,451990/0925/sys/src/9/gnot/mmu.c:40,49 (short | long)
1990/03091    
	flushmmu(); 
	u = (User*)USERADDR; 
1990/0921    
 
1990/0925    
	/* 
 	 *  preload the MMU with the last (up to) NMMU user entries 
	 *  previously faulted into it for this process. 
	 */ 
1990/0921    
	if(u->mc.next >= NMMU){ 
		u->mc.next &= NMMU - 1; 
		for(i = u->mc.next; i < NMMU; i++) 
1990/0921/sys/src/9/gnot/mmu.c:46,521990/0925/sys/src/9/gnot/mmu.c:50,56
1990/0921    
			putxmmu(u->mc.mmu[i].va, u->mc.mmu[i].pa, u->mc.mmu[i].pid); 
	} 
	for(i = 0; i < u->mc.next; i++) 
		putxmmu(u->mc.mmu[i].va, u->mc.mmu[i].pa, u->mc.mmu[i].pid);/**/ 
1990/0925    
		putxmmu(u->mc.mmu[i].va, u->mc.mmu[i].pa, u->mc.mmu[i].pid); 
1990/03091    
} 
 
void 
1990/0921/sys/src/9/gnot/mmu.c:70,761990/0925/sys/src/9/gnot/mmu.c:74,80
1990/0921    
		mp->va = tlbvirt; 
		mp->pid = u->p->pid; 
		u->mc.next++; 
	}/**/ 
1990/0925    
	} 
1990/03091    
	tlbphys |= VTAG(tlbvirt)<<24; 
	UMAP[(tlbvirt&0x003FE000L)>>2] = tlbphys; 
} 
1990/0921/sys/src/9/gnot/mmu.c:84,1021990/0925/sys/src/9/gnot/mmu.c:88,98
1990/0921    
} 
 
void 
flushmmucache(void) 
1990/0925    
clearmmucache(void) 
1990/0921    
{ 
	if(u == 0) 
		panic("flushmmucache"); 
	u->mc.next = 0; 
} 
                 
void 
clearmmucache(void) 
{ 
	if(u == 0) 
		panic("clearmmucache"); 
	memset(&u->mc, 0, sizeof u->mc); 
1990/06021    
} 
 
void 
1990/0925/sys/src/9/gnot/mmu.c:12,281990/0928/sys/src/9/gnot/mmu.c:12,17 (short | long)
1990/06021    
	KMap	arena[4*1024*1024/BY2PG];	/* kernel mmu maps up to 4MB */ 
}kmapalloc; 
 
1990/0921    
void 
putxmmu(ulong tlbvirt, ulong tlbphys, int pid) 
{ 
	if(pid != u->p->pid) 
		panic("putxmmu %ld %ld\n", pid, u->p->pid); 
	if(tlbvirt&KZERO) 
		panic("putmmu"); 
	tlbphys |= VTAG(tlbvirt)<<24; 
	UMAP[(tlbvirt&0x003FE000L)>>2] = tlbphys; 
} 
                 
1990/03091    
/* 
 * Called splhi, not in Running state 
 */ 
1990/0925/sys/src/9/gnot/mmu.c:39,561990/0928/sys/src/9/gnot/mmu.c:28,33
1990/03091    
	putkmmu(tlbvirt, tlbphys); 
	flushmmu(); 
	u = (User*)USERADDR; 
1990/0921    
                 
1990/0925    
	/* 
 	 *  preload the MMU with the last (up to) NMMU user entries 
	 *  previously faulted into it for this process. 
	 */ 
1990/0921    
	if(u->mc.next >= NMMU){ 
		u->mc.next &= NMMU - 1; 
		for(i = u->mc.next; i < NMMU; i++) 
			putxmmu(u->mc.mmu[i].va, u->mc.mmu[i].pa, u->mc.mmu[i].pid); 
	} 
	for(i = 0; i < u->mc.next; i++) 
1990/0925    
		putxmmu(u->mc.mmu[i].va, u->mc.mmu[i].pa, u->mc.mmu[i].pid); 
1990/03091    
} 
 
void 
1990/0925/sys/src/9/gnot/mmu.c:67,801990/0928/sys/src/9/gnot/mmu.c:44,49
1990/03091    
{ 
	if(tlbvirt&KZERO) 
		panic("putmmu"); 
1990/0921    
	if(u){ 
		MMU *mp; 
		mp = &(u->mc.mmu[u->mc.next&(NMMU-1)]); 
		mp->pa = tlbphys; 
		mp->va = tlbvirt; 
		mp->pid = u->p->pid; 
		u->mc.next++; 
1990/0925    
	} 
1990/03091    
	tlbphys |= VTAG(tlbvirt)<<24; 
	UMAP[(tlbvirt&0x003FE000L)>>2] = tlbphys; 
} 
1990/0925/sys/src/9/gnot/mmu.c:85,981990/0928/sys/src/9/gnot/mmu.c:54,59
1990/03091    
	flushcpucache(); 
	*PARAM &= ~TLBFLUSH_; 
	*PARAM |= TLBFLUSH_; 
1990/0921    
} 
                 
void 
1990/0925    
clearmmucache(void) 
1990/0921    
{ 
	if(u == 0) 
		panic("flushmmucache"); 
	u->mc.next = 0; 
1990/06021    
} 
 
void 
1990/0928/sys/src/9/gnot/mmu.c:19,251990/1004/sys/src/9/gnot/mmu.c:19,26 (short | long)
1990/03091    
mapstack(Proc *p) 
{ 
	ulong tlbvirt, tlbphys; 
1990/0921    
	ulong i; 
1990/1004    
	ulong next; 
	MMU *mm, *mn, *me; 
1990/03091    
 
	if(p->upage->va != (USERADDR|(p->pid&0xFFFF))) 
		panic("mapstack %d 0x%lux 0x%lux", p->pid, p->upage->pa, p->upage->va); 
1990/0928/sys/src/9/gnot/mmu.c:26,331990/1004/sys/src/9/gnot/mmu.c:27,55
1990/03091    
	tlbvirt = USERADDR; 
	tlbphys = PPN(p->upage->pa) | PTEVALID | PTEKERNEL; 
	putkmmu(tlbvirt, tlbphys); 
	flushmmu(); 
	u = (User*)USERADDR; 
1990/1004    
 
	/* 
	 *  if not a kernel process and this process was not the  
	 *  last process on this machine, flush & preload mmu 
	 */ 
	if(!p->kp && p!=m->lproc){ 
		flushmmu(); 
 
		/* 
		 *  preload the MMU with the last (up to) NMMU user entries 
		 *  previously faulted into it for this process. 
		 */ 
		mn = &u->mc.mmu[u->mc.next&(NMMU-1)]; 
		me = &u->mc.mmu[NMMU]; 
		if(u->mc.next >= NMMU){ 
			for(mm = mn; mm < me; mm++) 
				UMAP[mm->va] = mm->pa; 
		} 
		for(mm = u->mc.mmu; mm < mn; mm++) 
			UMAP[mm->va] = mm->pa; 
 
		m->lproc = p; 
	} 
1990/03091    
} 
 
void 
1990/0928/sys/src/9/gnot/mmu.c:45,511990/1004/sys/src/9/gnot/mmu.c:67,85
1990/03091    
	if(tlbvirt&KZERO) 
		panic("putmmu"); 
	tlbphys |= VTAG(tlbvirt)<<24; 
	UMAP[(tlbvirt&0x003FE000L)>>2] = tlbphys; 
1990/1004    
	tlbvirt = (tlbvirt&0x003FE000L)>>2; 
	if(u){ 
		MMU *mp; 
		int s; 
 
		s = splhi(); 
		mp = &(u->mc.mmu[u->mc.next&(NMMU-1)]); 
		mp->pa = tlbphys; 
		mp->va = tlbvirt; 
		u->mc.next++; 
		splx(s); 
	} 
	UMAP[tlbvirt] = tlbphys; 
1990/03091    
} 
 
void 
1990/0928/sys/src/9/gnot/mmu.c:54,591990/1004/sys/src/9/gnot/mmu.c:88,101
1990/03091    
	flushcpucache(); 
	*PARAM &= ~TLBFLUSH_; 
	*PARAM |= TLBFLUSH_; 
1990/1004    
} 
 
void 
clearmmucache(void) 
{ 
	if(u == 0) 
		panic("flushmmucache"); 
	u->mc.next = 0; 
1990/06021    
} 
 
void 
1990/1004/sys/src/9/gnot/mmu.c:27,321990/1211/sys/src/9/gnot/mmu.c:27,33 (short | long)
1990/03091    
	tlbvirt = USERADDR; 
	tlbphys = PPN(p->upage->pa) | PTEVALID | PTEKERNEL; 
	putkmmu(tlbvirt, tlbphys); 
1990/1211    
	u = (User*)USERADDR; 
1990/1004    
 
	/* 
	 *  if not a kernel process and this process was not the  
1990/1004/sys/src/9/gnot/mmu.c:149,1521990/1211/sys/src/9/gnot/mmu.c:150,159
1990/06021    
	kmapalloc.free = k; 
	putkmmu(k->va, INVALIDPTE); 
	unlock(&kmapalloc); 
1990/1211    
} 
 
void 
invalidateu(void) 
{ 
	putkmmu(USERADDR, INVALIDPTE); 
1990/03091    
} 
1990/1211/sys/src/9/gnot/mmu.c:54,591991/0507/sys/src/9/gnot/mmu.c:54,65 (short | long)
1990/03091    
} 
 
void 
1991/0507    
mmurelease(Proc *p) 
{ 
	USED(p); 
} 
 
void 
1990/03091    
putkmmu(ulong tlbvirt, ulong tlbphys) 
{ 
	if(!(tlbvirt&KZERO)) 
1991/0507/sys/src/9/gnot/mmu.c:22,271991/0705/sys/src/9/gnot/mmu.c:22,28 (short | long)
1990/1004    
	ulong next; 
	MMU *mm, *mn, *me; 
1990/03091    
 
1991/0705    
 
1990/03091    
	if(p->upage->va != (USERADDR|(p->pid&0xFFFF))) 
		panic("mapstack %d 0x%lux 0x%lux", p->pid, p->upage->pa, p->upage->va); 
	tlbvirt = USERADDR; 
1991/0507/sys/src/9/gnot/mmu.c:29,341991/0705/sys/src/9/gnot/mmu.c:30,41
1990/03091    
	putkmmu(tlbvirt, tlbphys); 
1990/1211    
	u = (User*)USERADDR; 
1990/1004    
 
1991/0705    
	if(p->newtlb) { 
		flushmmu(); 
		clearmmucache(); 
		p->newtlb = 0; 
	} 
 
1990/1004    
	/* 
	 *  if not a kernel process and this process was not the  
	 *  last process on this machine, flush & preload mmu 
1991/0507/sys/src/9/gnot/mmu.c:69,751991/0705/sys/src/9/gnot/mmu.c:76,82
1990/03091    
} 
 
void 
putmmu(ulong tlbvirt, ulong tlbphys) 
1991/0705    
putmmu(ulong tlbvirt, ulong tlbphys, Page *p) 
1990/03091    
{ 
	if(tlbvirt&KZERO) 
		panic("putmmu"); 
1991/0507/sys/src/9/gnot/mmu.c:101,1071991/0705/sys/src/9/gnot/mmu.c:108,114
1990/1004    
clearmmucache(void) 
{ 
	if(u == 0) 
		panic("flushmmucache"); 
1991/0705    
		panic("clearmmucache"); 
1990/1004    
	u->mc.next = 0; 
1990/06021    
} 
 
1991/0705/sys/src/9/gnot/mmu.c:127,1331991/0802/sys/src/9/gnot/mmu.c:127,133 (short | long)
1990/06021    
		return; 
	} 
	e = (4*1024*1024 - 256*1024)/BY2PG;	/* screen lives at top 256K */ 
	i = (((ulong)ialloc(0, 0))&~KZERO)/BY2PG; 
1991/0802    
	i = PGROUND(((ulong)ialloc(0, 0))&~KZERO)/BY2PG; 
1990/0709    
	print("%lud free map registers\n", e-i); 
1990/06021    
	kmapalloc.free = 0; 
	for(k=&kmapalloc.arena[i]; i<e; i++,k++){ 
1991/0802/sys/src/9/gnot/mmu.c:140,1461991/0817/sys/src/9/gnot/mmu.c:140,151 (short | long)
1990/06021    
kmap(Page *pg) 
{ 
	KMap *k; 
1991/0817    
	int s; 
1990/06021    
 
1991/0817    
	if(u && u->p){ 
		s = u->p->state; 
		u->p->state = MMUing; 
	} 
1990/06021    
	lock(&kmapalloc); 
	k = kmapalloc.free; 
1990/0709    
	if(k == 0){ 
1991/0802/sys/src/9/gnot/mmu.c:151,1561991/0817/sys/src/9/gnot/mmu.c:156,163
1990/06021    
	unlock(&kmapalloc); 
	k->pa = pg->pa; 
	putkmmu(k->va, PPN(k->pa) | PTEVALID | PTEKERNEL); 
1991/0817    
	if(u && u->p) 
		u->p->state = s; 
1990/06021    
	return k; 
} 
 
1991/0817/sys/src/9/gnot/mmu.c:9,151991/0821/sys/src/9/gnot/mmu.c:9,15 (short | long)
1990/06021    
	Lock; 
	int	init; 
	KMap	*free; 
	KMap	arena[4*1024*1024/BY2PG];	/* kernel mmu maps up to 4MB */ 
1991/0821    
	KMap	arena[MB4/BY2PG];	/* kernel mmu maps up to 4MB */ 
1990/06021    
}kmapalloc; 
 
1990/03091    
/* 
1991/0817/sys/src/9/gnot/mmu.c:120,1341991/0821/sys/src/9/gnot/mmu.c:120,137
1990/06021    
 
	if(kmapalloc.init == 0){ 
		k = &kmapalloc.arena[0]; 
1990/0709    
		k->va = KZERO|(4*1024*1024-256*1024-BY2PG); 
1991/0821    
		k->va = KZERO|(MB4-256*1024-BY2PG); 
1990/06021    
		k->next = 0; 
		kmapalloc.free = k; 
		kmapalloc.init = 1; 
		return; 
	} 
	e = (4*1024*1024 - 256*1024)/BY2PG;	/* screen lives at top 256K */ 
1991/0821    
 
	e = (MB4 - 256*1024)/BY2PG;	/* screen lives at top 256K */ 
1991/0802    
	i = PGROUND(((ulong)ialloc(0, 0))&~KZERO)/BY2PG; 
1991/0821    
 
1990/0709    
	print("%lud free map registers\n", e-i); 
1991/0821    
 
1990/06021    
	kmapalloc.free = 0; 
	for(k=&kmapalloc.arena[i]; i<e; i++,k++){ 
		k->va = i*BY2PG|KZERO; 
1991/0817/sys/src/9/gnot/mmu.c:140,1511991/0821/sys/src/9/gnot/mmu.c:143,149
1990/06021    
kmap(Page *pg) 
{ 
	KMap *k; 
1991/0817    
	int s; 
1990/06021    
 
1991/0817    
	if(u && u->p){ 
		s = u->p->state; 
		u->p->state = MMUing; 
	} 
1990/06021    
	lock(&kmapalloc); 
	k = kmapalloc.free; 
1990/0709    
	if(k == 0){ 
1991/0817/sys/src/9/gnot/mmu.c:154,1631991/0821/sys/src/9/gnot/mmu.c:152,160
1990/0709    
	} 
1990/06021    
	kmapalloc.free = k->next; 
	unlock(&kmapalloc); 
1991/0821    
 
1990/06021    
	k->pa = pg->pa; 
	putkmmu(k->va, PPN(k->pa) | PTEVALID | PTEKERNEL); 
1991/0817    
	if(u && u->p) 
		u->p->state = s; 
1990/06021    
	return k; 
} 
 
1991/0817/sys/src/9/gnot/mmu.c:165,1741991/0821/sys/src/9/gnot/mmu.c:162,172
1990/06021    
kunmap(KMap *k) 
{ 
	k->pa = 0; 
1991/0821    
	putkmmu(k->va, INVALIDPTE); 
 
1990/06021    
	lock(&kmapalloc); 
	k->next = kmapalloc.free; 
	kmapalloc.free = k; 
	putkmmu(k->va, INVALIDPTE); 
	unlock(&kmapalloc); 
1990/1211    
} 
 
1991/0821/sys/src/9/gnot/mmu.c:143,1491991/0827/sys/src/9/gnot/mmu.c:143,151 (short | long)
1990/06021    
kmap(Page *pg) 
{ 
	KMap *k; 
1991/0827    
	int s; 
1990/06021    
 
1991/0827    
	s = splhi(); 
1990/06021    
	lock(&kmapalloc); 
	k = kmapalloc.free; 
1990/0709    
	if(k == 0){ 
1991/0821/sys/src/9/gnot/mmu.c:152,1571991/0827/sys/src/9/gnot/mmu.c:154,160
1990/0709    
	} 
1990/06021    
	kmapalloc.free = k->next; 
	unlock(&kmapalloc); 
1991/0827    
	splx(s); 
1991/0821    
 
1990/06021    
	k->pa = pg->pa; 
	putkmmu(k->va, PPN(k->pa) | PTEVALID | PTEKERNEL); 
1991/0821/sys/src/9/gnot/mmu.c:161,1731991/0827/sys/src/9/gnot/mmu.c:164,180
1990/06021    
void 
kunmap(KMap *k) 
{ 
1991/0827    
	int s; 
 
1990/06021    
	k->pa = 0; 
1991/0821    
	putkmmu(k->va, INVALIDPTE); 
 
1991/0827    
	s = splhi(); 
1990/06021    
	lock(&kmapalloc); 
	k->next = kmapalloc.free; 
	kmapalloc.free = k; 
	unlock(&kmapalloc); 
1991/0827    
	splx(s); 
1990/1211    
} 
 
void 
1991/0827/sys/src/9/gnot/mmu.c:143,1511991/0828/sys/src/9/gnot/mmu.c:143,155 (short | long)
1990/06021    
kmap(Page *pg) 
{ 
	KMap *k; 
1991/0827    
	int s; 
1991/0828    
	int s = 0; 
1990/06021    
 
1991/0827    
	s = splhi(); 
1991/0828    
	if(u) { 
		s = u->p->state; 
		u->p->state = MMUing; 
	} 
	 
1990/06021    
	lock(&kmapalloc); 
	k = kmapalloc.free; 
1990/0709    
	if(k == 0){ 
1991/0827/sys/src/9/gnot/mmu.c:154,1631991/0828/sys/src/9/gnot/mmu.c:158,169
1990/0709    
	} 
1990/06021    
	kmapalloc.free = k->next; 
	unlock(&kmapalloc); 
1991/0827    
	splx(s); 
1991/0821    
 
1990/06021    
	k->pa = pg->pa; 
	putkmmu(k->va, PPN(k->pa) | PTEVALID | PTEKERNEL); 
1991/0828    
	if(s) 
		u->p->state = s; 
 
1990/06021    
	return k; 
} 
 
1991/0828/sys/src/9/gnot/mmu.c:143,1541991/0926/sys/src/9/gnot/mmu.c:143,148 (short | long)
1990/06021    
kmap(Page *pg) 
{ 
	KMap *k; 
1991/0828    
	int s = 0; 
1990/06021    
                 
1991/0828    
	if(u) { 
		s = u->p->state; 
		u->p->state = MMUing; 
	} 
	 
1990/06021    
	lock(&kmapalloc); 
	k = kmapalloc.free; 
1991/0828/sys/src/9/gnot/mmu.c:161,1681991/0926/sys/src/9/gnot/mmu.c:155,160
1991/0821    
 
1990/06021    
	k->pa = pg->pa; 
	putkmmu(k->va, PPN(k->pa) | PTEVALID | PTEKERNEL); 
1991/0828    
	if(s) 
		u->p->state = s; 
 
1990/06021    
	return k; 
} 
1991/0926/sys/src/9/gnot/mmu.c:23,291991/0928/sys/src/9/gnot/mmu.c:23,29 (short | long)
1990/1004    
	MMU *mm, *mn, *me; 
1990/03091    
 
1991/0705    
 
1990/03091    
	if(p->upage->va != (USERADDR|(p->pid&0xFFFF))) 
1991/0928    
	if(p->upage->va != (USERADDR|(p->pid&0xFFFF)) && p->pid != 0) 
1990/03091    
		panic("mapstack %d 0x%lux 0x%lux", p->pid, p->upage->pa, p->upage->va); 
	tlbvirt = USERADDR; 
	tlbphys = PPN(p->upage->pa) | PTEVALID | PTEKERNEL; 
1991/0928/sys/src/9/gnot/mmu.c:143,1491991/1004/sys/src/9/gnot/mmu.c:143,151 (short | long)
1990/06021    
kmap(Page *pg) 
{ 
	KMap *k; 
1991/0828    
	                 
1991/1004    
	int s; 
 
	s = splhi(); 
1990/06021    
	lock(&kmapalloc); 
	k = kmapalloc.free; 
1990/0709    
	if(k == 0){ 
1991/0928/sys/src/9/gnot/mmu.c:152,1571991/1004/sys/src/9/gnot/mmu.c:154,160
1990/0709    
	} 
1990/06021    
	kmapalloc.free = k->next; 
	unlock(&kmapalloc); 
1991/1004    
	splx(s); 
1991/0821    
 
1990/06021    
	k->pa = pg->pa; 
	putkmmu(k->va, PPN(k->pa) | PTEVALID | PTEKERNEL); 
1991/1004/sys/src/9/gnot/mmu.c:32,381992/0103/sys/src/9/gnot/mmu.c:32,37 (short | long)
1990/1004    
 
1991/0705    
	if(p->newtlb) { 
		flushmmu(); 
		clearmmucache(); 
		p->newtlb = 0; 
	} 
 
1991/1004/sys/src/9/gnot/mmu.c:42,611992/0103/sys/src/9/gnot/mmu.c:41,46
1990/1004    
	 */ 
	if(!p->kp && p!=m->lproc){ 
		flushmmu(); 
                 
		/* 
		 *  preload the MMU with the last (up to) NMMU user entries 
		 *  previously faulted into it for this process. 
		 */ 
		mn = &u->mc.mmu[u->mc.next&(NMMU-1)]; 
		me = &u->mc.mmu[NMMU]; 
		if(u->mc.next >= NMMU){ 
			for(mm = mn; mm < me; mm++) 
				UMAP[mm->va] = mm->pa; 
		} 
		for(mm = u->mc.mmu; mm < mn; mm++) 
			UMAP[mm->va] = mm->pa; 
                 
		m->lproc = p; 
	} 
1990/03091    
} 
1991/1004/sys/src/9/gnot/mmu.c:82,981992/0103/sys/src/9/gnot/mmu.c:67,72
1990/03091    
		panic("putmmu"); 
	tlbphys |= VTAG(tlbvirt)<<24; 
1990/1004    
	tlbvirt = (tlbvirt&0x003FE000L)>>2; 
	if(u){ 
		MMU *mp; 
		int s; 
                 
		s = splhi(); 
		mp = &(u->mc.mmu[u->mc.next&(NMMU-1)]); 
		mp->pa = tlbphys; 
		mp->va = tlbvirt; 
		u->mc.next++; 
		splx(s); 
	} 
	UMAP[tlbvirt] = tlbphys; 
1990/03091    
} 
 
1991/1004/sys/src/9/gnot/mmu.c:102,1151992/0103/sys/src/9/gnot/mmu.c:76,81
1990/03091    
	flushcpucache(); 
	*PARAM &= ~TLBFLUSH_; 
	*PARAM |= TLBFLUSH_; 
1990/1004    
} 
                 
void 
clearmmucache(void) 
{ 
	if(u == 0) 
1991/0705    
		panic("clearmmucache"); 
1990/1004    
	u->mc.next = 0; 
1990/06021    
} 
 
void 
1992/0103/sys/src/9/gnot/mmu.c:94,1001992/0315/sys/src/9/gnot/mmu.c:94,100 (short | long)
1990/06021    
	} 
1991/0821    
 
	e = (MB4 - 256*1024)/BY2PG;	/* screen lives at top 256K */ 
1991/0802    
	i = PGROUND(((ulong)ialloc(0, 0))&~KZERO)/BY2PG; 
1992/0315    
	i = PGROUND(palloc.addr0)/BY2PG; 
1991/0821    
 
1990/0709    
	print("%lud free map registers\n", e-i); 
1991/0821    
 
1992/0315/sys/src/9/gnot/mmu.c:1,51992/0321/sys/src/9/gnot/mmu.c:1,5 (short | long)
Move lib.h to ../port.
rsc Fri Mar 4 12:44:25 2005
1990/03091    
#include	"u.h" 
#include	"lib.h" 
1992/0321    
#include	"../port/lib.h" 
1990/03091    
#include	"mem.h" 
#include	"dat.h" 
#include	"fns.h" 
1992/0321/sys/src/9/gnot/mmu.c:99,1071992/0622/sys/src/9/gnot/mmu.c:99,107 (short | long)
1990/0709    
	print("%lud free map registers\n", e-i); 
1991/0821    
 
1990/06021    
	kmapalloc.free = 0; 
	for(k=&kmapalloc.arena[i]; i<e; i++,k++){ 
1992/0622    
	for(k=&kmapalloc.arena[i]; i < e; i++){ 
1990/06021    
		k->va = i*BY2PG|KZERO; 
		kunmap(k); 
1992/0622    
		kunmap(k++); 
1990/06021    
	} 
} 
 
1992/0622/sys/src/9/gnot/mmu.c:81,881992/0625/sys/src/9/gnot/mmu.c:81,89 (short | long)
1990/06021    
void 
kmapinit(void) 
{ 
1992/0625    
	int i; 
	Page *p; 
1990/06021    
	KMap *k; 
	int i, e; 
 
	if(kmapalloc.init == 0){ 
		k = &kmapalloc.arena[0]; 
1992/0622/sys/src/9/gnot/mmu.c:93,1081992/0625/sys/src/9/gnot/mmu.c:94,110
1990/06021    
		return; 
	} 
1991/0821    
 
	e = (MB4 - 256*1024)/BY2PG;	/* screen lives at top 256K */ 
1992/0315    
	i = PGROUND(palloc.addr0)/BY2PG; 
1991/0821    
                 
1990/0709    
	print("%lud free map registers\n", e-i); 
1991/0821    
                 
1990/06021    
	kmapalloc.free = 0; 
1992/0622    
	for(k=&kmapalloc.arena[i]; i < e; i++){ 
1990/06021    
		k->va = i*BY2PG|KZERO; 
1992/0622    
		kunmap(k++); 
1992/0625    
	i = 0; 
	/* Reclaim map register for pages in bank0 */ 
	for(p = palloc.head; p; p = p->next) { 
		if(p->pa < MB4) { 
			k = &kmapalloc.arena[p->pa/BY2PG]; 
			k->va = p->pa|KZERO; 
			kunmap(k); 
			i++; 
		} 
1990/06021    
	} 
1992/0625    
	print("%lud free map registers\n", i); 
1990/06021    
} 
 
KMap* 
1992/0625/sys/src/9/gnot/mmu.c:82,931992/0630/sys/src/9/gnot/mmu.c:82,94 (short | long)
1990/06021    
kmapinit(void) 
{ 
1992/0625    
	int i; 
1992/0630    
	ulong endscreen; 
1992/0625    
	Page *p; 
1990/06021    
	KMap *k; 
 
	if(kmapalloc.init == 0){ 
		k = &kmapalloc.arena[0]; 
1991/0821    
		k->va = KZERO|(MB4-256*1024-BY2PG); 
1992/0630    
		k->va = KZERO|(MB4-BY2PG); 
1990/06021    
		k->next = 0; 
		kmapalloc.free = k; 
		kmapalloc.init = 1; 
1992/0625/sys/src/9/gnot/mmu.c:95,1031992/0630/sys/src/9/gnot/mmu.c:96,108
1990/06021    
	} 
1991/0821    
 
1992/0625    
	i = 0; 
	/* Reclaim map register for pages in bank0 */ 
1992/0630    
	/* 
	 * Reclaim map register for pages in bank0; 
	 * screen is in virtual space overlaying physical pages; be careful 
	 */ 
	endscreen = (PGROUND((ulong)end)&~KZERO) + 256*1024; 
1992/0625    
	for(p = palloc.head; p; p = p->next) { 
		if(p->pa < MB4) { 
1992/0630    
		if(p->pa >= endscreen && p->pa < MB4) { 
1992/0625    
			k = &kmapalloc.arena[p->pa/BY2PG]; 
			k->va = p->pa|KZERO; 
			kunmap(k); 
1992/0630/sys/src/9/gnot/mmu.c:19,261992/0711/sys/src/9/gnot/mmu.c:19,24 (short | long)
1990/03091    
mapstack(Proc *p) 
{ 
	ulong tlbvirt, tlbphys; 
1990/1004    
	ulong next; 
	MMU *mm, *mn, *me; 
1990/03091    
 
1991/0705    
 
1991/0928    
	if(p->upage->va != (USERADDR|(p->pid&0xFFFF)) && p->pid != 0) 
1992/0630/sys/src/9/gnot/mmu.c:61,681992/0711/sys/src/9/gnot/mmu.c:59,67
1990/03091    
} 
 
void 
1991/0705    
putmmu(ulong tlbvirt, ulong tlbphys, Page *p) 
1992/0711    
putmmu(ulong tlbvirt, ulong tlbphys, Page *pg) 
1990/03091    
{ 
1992/0711    
	USED(pg); 
1990/03091    
	if(tlbvirt&KZERO) 
		panic("putmmu"); 
	tlbphys |= VTAG(tlbvirt)<<24; 
Too many diffs (26 > 25). Stopping.


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