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

2000/0521/mpc/rmap.c (diff list | history)

1999/0121/sys/src/9/mpc/rmap.c:44,502000/0521/sys/src/9/mpc/rmap.c:44,50 (short | long)
1999/0121    
		} 
		else do{ 
			if(mp >= rmap->mapend){ 
				print("mapfree: %s: losing 0x%uX, %d\n", 
2000/0521    
				print("mapfree: %s: losing 0x%luX, %d\n", 
1999/0121    
					rmap->name, addr, size); 
				break; 
			} 
2000/0521/sys/src/9/mpc/rmap.c:1,1062001/0527/sys/src/9/mpc/rmap.c:0 (short | long)
Deleted.
rsc Mon Mar 7 10:28:46 2005
1999/0121    
#include "u.h" 
#include "../port/lib.h" 
#include "mem.h" 
#include "dat.h" 
#include "fns.h" 
                 
void 
mapinit(RMap *rmap, Map *map, int size) 
{ 
	lock(rmap); 
	rmap->map = map; 
	rmap->mapend = map+(size/sizeof(Map)); 
	unlock(rmap); 
} 
                 
void 
mapfree(RMap* rmap, ulong addr, int size) 
{ 
	Map *mp; 
	ulong t; 
                 
	if(size <= 0) 
		return; 
                 
	lock(rmap); 
	for(mp = rmap->map; mp->addr <= addr && mp->size; mp++) 
		; 
                 
	if(mp > rmap->map && (mp-1)->addr+(mp-1)->size == addr){ 
		(mp-1)->size += size; 
		if(addr+size == mp->addr){ 
			(mp-1)->size += mp->size; 
			while(mp->size){ 
				mp++; 
				(mp-1)->addr = mp->addr; 
				(mp-1)->size = mp->size; 
			} 
		} 
	} 
	else{ 
		if(addr+size == mp->addr && mp->size){ 
			mp->addr -= size; 
			mp->size += size; 
		} 
		else do{ 
			if(mp >= rmap->mapend){ 
2000/0521    
				print("mapfree: %s: losing 0x%luX, %d\n", 
1999/0121    
					rmap->name, addr, size); 
				break; 
			} 
			t = mp->addr; 
			mp->addr = addr; 
			addr = t; 
			t = mp->size; 
			mp->size = size; 
			mp++; 
		}while(size = t); 
	} 
	unlock(rmap); 
} 
                 
ulong 
rmapalloc(RMap* rmap, ulong addr, int size, int align) 
{ 
	Map *mp; 
	ulong maddr, oaddr; 
                 
	lock(rmap); 
	for(mp = rmap->map; mp->size; mp++){ 
		maddr = mp->addr; 
                 
		if(addr){ 
			if(maddr > addr) 
				break; 
			if(maddr+mp->size < addr) 
				continue; 
			if(addr+size > maddr+mp->size) 
				break; 
			maddr = addr; 
		} 
                 
		if(align > 0) 
			maddr = ((maddr+align-1)/align)*align; 
		if(mp->addr+mp->size-maddr < size) 
			continue; 
                 
		oaddr = mp->addr; 
		mp->addr = maddr+size; 
		mp->size -= maddr-oaddr+size; 
		if(mp->size == 0){ 
			do{ 
				mp++; 
				(mp-1)->addr = mp->addr; 
			}while((mp-1)->size = mp->size); 
		} 
                 
		unlock(rmap); 
		if(oaddr != maddr) 
			mapfree(rmap, oaddr, maddr-oaddr); 
                 
		return maddr; 
	} 
	unlock(rmap); 
                 
	return 0; 
} 


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