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

1999/0415/alphapc/mmu.c (diff list | history)

1999/0415/sys/src/9/alphapc/mmu.c:233,2411999/0511/sys/src/9/alphapc/mmu.c:233,254 (short | long)
1999/0415    
} 
 
ulong 
upamalloc(...) 
1999/0511    
upamalloc(ulong pa, int size, int align) 
1999/0415    
{ 
	panic("upamalloc"); 
1999/0511    
	void *va; 
 
	/* 
	 * Viability hack. 
	return kmapv(((uvlong)space<<32LL)|offset, size); 
	return kmapio(0x88, addr, len); 
	 */ 
	USED(align); 
print("upa0: pa %luX size %d, align %d nextio %luX\n", pa, size, align, nextio); 
	va = kmapv(((uvlong)0x88<<32LL)|pa, size); 
print("upa1: va %luX nextio %luX\n", va, nextio); 
	if(va == nil) 
		return 0; 
	return PADDR(va); 
1999/0415    
} 
 
void 
1999/0511/sys/src/9/alphapc/mmu.c:238,2511999/0512/sys/src/9/alphapc/mmu.c:238,249 (short | long)
1999/0511    
	void *va; 
 
	/* 
	 * Viability hack. 
	return kmapv(((uvlong)space<<32LL)|offset, size); 
	return kmapio(0x88, addr, len); 
1999/0512    
	 * Viability hack. Only for PCI frambuffers. 
1999/0511    
	 */ 
1999/0512    
	if(pa == 0) 
		return 0; 
1999/0511    
	USED(align); 
print("upa0: pa %luX size %d, align %d nextio %luX\n", pa, size, align, nextio); 
	va = kmapv(((uvlong)0x88<<32LL)|pa, size); 
print("upa1: va %luX nextio %luX\n", va, nextio); 
	if(va == nil) 
		return 0; 
	return PADDR(va); 
1999/0512/sys/src/9/alphapc/mmu.c:250,2562000/0401/sys/src/9/alphapc/mmu.c:250,256 (short | long)
1999/0415    
} 
 
void 
upafree(...) 
2000/0401    
upafree(ulong, int) 
1999/0415    
{ 
	panic("upafree"); 
2000/0401    
	print("upafree: virtual mapping not freed\n"); 
1999/0415    
} 
2000/0401/sys/src/9/alphapc/mmu.c:238,2442000/0517/sys/src/9/alphapc/mmu.c:238,244 (short | long)
1999/0511    
	void *va; 
 
	/* 
1999/0512    
	 * Viability hack. Only for PCI frambuffers. 
2000/0517    
	 * Viability hack. Only for PCI framebuffers. 
1999/0511    
	 */ 
1999/0512    
	if(pa == 0) 
		return 0; 
2000/0517/sys/src/9/alphapc/mmu.c:254,2562001/0727/sys/src/9/alphapc/mmu.c:254,272 (short | long)
1999/0415    
{ 
2000/0401    
	print("upafree: virtual mapping not freed\n"); 
1999/0415    
} 
2001/0727    
 
void 
mmudump(void) 
{ 
	Page *top, *lvl2; 
 
	iprint("ptbr %lux up %lux\n", (ulong)m->ptbr, up); 
	if(up) { 
		top = up->mmutop; 
		if(top != nil) 
			iprint("top %lux top[N-1] %lux\n", top->va, ((uvlong *)top->va)[PTE2PG-1]); 
		lvl2 = up->mmulvl2; 
		if(lvl2 != nil) 
			iprint("lvl2 %lux\n", lvl2->va); 
	} 
} 
2001/0727/sys/src/9/alphapc/mmu.c:38,792001/0728/sys/src/9/alphapc/mmu.c:38,75 (short | long)
1999/0415    
	nextio = (uchar*) (KZERO|bootconf->maxphys); 
} 
 
/* 
 * Called splhi, not in Running state 
 */ 
void 
mmuswitch(Proc *p) 
2001/0728    
static void 
mmuptefree(Proc* proc) 
1999/0415    
{ 
	Page *pg; 
	uvlong *lvl2; 
2001/0728    
	Page **last, *page; 
1999/0415    
 
	if(p->newtlb){ 
		/* 
		 *  newtlb set means that they are inconsistent 
		 *  with the segment.c data structures. 
		 * 
		 *  bin the current 3rd level page tables and 
		 *  the pointers to them in the 2nd level page. 
		 *  pg->daddr is used by putmmu to save the offset into 
		 *  the 2nd level page. 
		 */ 
		if(p->mmutop && p->mmuused){ 
			lvl2 = (uvlong*)p->mmulvl2->va; 
			for(pg = p->mmuused; pg->next; pg = pg->next) 
				lvl2[pg->daddr] = 0; 
			lvl2[pg->daddr] = 0; 
			pg->next = p->mmufree; 
			p->mmufree = p->mmuused; 
			p->mmuused = 0; 
2001/0728    
	if(proc->mmutop && proc->mmuused){ 
		lvl2 = (uvlong*)proc->mmulvl2->va; 
		last = &proc->mmuused; 
		for(page = *last; page; page = page->next){ 
			lvl2[page->daddr] = 0; 
			last = &page->next; 
1999/0415    
		} 
		p->newtlb = 0; 
2001/0728    
		*last = proc->mmufree; 
		proc->mmufree = proc->mmuused; 
		proc->mmuused = 0; 
1999/0415    
	} 
2001/0728    
} 
1999/0415    
 
2001/0728    
void 
mmuswitch(Proc *proc) 
{ 
	if(proc->newtlb){ 
		mmuptefree(proc); 
		proc->newtlb = 0; 
	} 
 
1999/0415    
	/* tell processor about new page table and flush cached entries */ 
	if(p->mmutop == 0) 
2001/0728    
	if(proc->mmutop == 0) 
1999/0415    
		setptb(origlvl1); 
	else 
		setptb(p->mmutop->pa); 
2001/0728    
		setptb(proc->mmutop->pa); 
1999/0415    
	tlbflush(-1, 0); 
	icflush(); 
} 
2001/0727/sys/src/9/alphapc/mmu.c:83,1262001/0728/sys/src/9/alphapc/mmu.c:79,113
1999/0415    
 *  with palloc locked. 
 */ 
void 
mmurelease(Proc *p) 
2001/0728    
mmurelease(Proc *proc) 
1999/0415    
{ 
	Page *pg; 
	Page *next; 
2001/0728    
	Page *page, *next; 
1999/0415    
 
	if(canlock(&palloc)) 
		panic("mmurelease"); 
                 
	/* point to protoype page map */ 
	setptb(origlvl1); 
	icflush(); 
 
	/* give away page table pages */ 
	for(pg = p->mmuused; pg; pg = next){ 
		next = pg->next; 
		pg->next = p->mmufree; 
		p->mmufree = pg; 
2001/0728    
	mmuptefree(proc); 
	proc->mmuused = 0; 
	if(proc->mmutop) { 
		proc->mmutop->next = proc->mmufree; 
		proc->mmufree = proc->mmutop; 
		proc->mmutop = 0; 
1999/0415    
	} 
	p->mmuused = 0; 
	if(p->mmutop) { 
		p->mmutop->next = p->mmufree; 
		p->mmufree = p->mmutop; 
		p->mmutop = 0; 
2001/0728    
	if(proc->mmulvl2) { 
		proc->mmulvl2->next = proc->mmufree; 
		proc->mmufree = proc->mmulvl2; 
		proc->mmulvl2 = 0; 
1999/0415    
	} 
	if(p->mmulvl2) { 
		p->mmulvl2->next = p->mmufree; 
		p->mmufree = p->mmulvl2; 
		p->mmulvl2 = 0; 
2001/0728    
	for(page = proc->mmufree; page; page = next){ 
		next = page->next; 
		if(--page->ref) 
			panic("mmurelease: page->ref %d\n", page->ref); 
		pagechainhead(page); 
1999/0415    
	} 
	for(pg = p->mmufree; pg; pg = next){ 
		next = pg->next; 
		if(--pg->ref) 
			panic("mmurelease: pg->ref %d\n", pg->ref); 
		pagechainhead(pg); 
	} 
	if(p->mmufree && palloc.r.p) 
2001/0728    
	if(proc->mmufree && palloc.r.p) 
1999/0415    
		wakeup(&palloc.r); 
	p->mmufree = 0; 
2001/0728    
	proc->mmufree = 0; 
1999/0415    
} 
 
void 
2001/0728/sys/src/9/alphapc/mmu.c:251,2572001/1121/sys/src/9/alphapc/mmu.c:251,257 (short | long)
2001/0727    
	if(up) { 
		top = up->mmutop; 
		if(top != nil) 
			iprint("top %lux top[N-1] %lux\n", top->va, ((uvlong *)top->va)[PTE2PG-1]); 
2001/1121    
			iprint("top %lux top[N-1] %llux\n", top->va, ((uvlong *)top->va)[PTE2PG-1]); 
2001/0727    
		lvl2 = up->mmulvl2; 
		if(lvl2 != nil) 
			iprint("lvl2 %lux\n", lvl2->va); 
2001/1121/sys/src/9/alphapc/mmu.c:74,792002/0116/sys/src/9/alphapc/mmu.c:74,87 (short | long)
Add mmupark.
rsc Fri Mar 4 12:44:25 2005
1999/0415    
	icflush(); 
} 
 
2002/0116    
/* point to protoype page map */ 
void 
mmupark(void) 
{ 
	setptb(origlvl1); 
	icflush(); 
} 
 
1999/0415    
/* 
 *  give all page table pages back to the free pool.  This is called in sched() 
 *  with palloc locked. 
2001/1121/sys/src/9/alphapc/mmu.c:83,922002/0116/sys/src/9/alphapc/mmu.c:91,97
1999/0415    
{ 
2001/0728    
	Page *page, *next; 
1999/0415    
 
	/* point to protoype page map */ 
	setptb(origlvl1); 
	icflush(); 
                 
2002/0116    
	mmupark(); 
2001/0728    
	mmuptefree(proc); 
	proc->mmuused = 0; 
	if(proc->mmutop) { 


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