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

1997/0328/pc/memory.c (diff list | history)

1997/0327/sys/src/9/pc/memory.c:21,271997/0328/sys/src/9/pc/memory.c:21,27 (short | long)
1997/0327    
	KB		= 1024, 
 
	MemMinMB	= 4,		/* minimum physical memory (<=4MB) */ 
	MemMaxMB	= 192,		/* maximum physical memory to check */ 
1997/0328    
	MemMaxMB	= 512,		/* maximum physical memory to check */ 
1997/0327    
 
	NMemBase	= 10, 
}; 
1997/0328/sys/src/9/pc/memory.c:67,731997/0329/sys/src/9/pc/memory.c:67,105 (short | long)
1997/0327    
	&mapumb[63], 
}; 
 
1997/0329    
static Map mapumbr[8]; 
static RMap rmapumbr = { 
	"UMB device memory", 
	mapumbr, 
	&mapumbr[7], 
}; 
 
#define notdef 
#ifdef notdef 
1997/0327    
void 
1997/0329    
dumpmembank(void) 
{ 
	Map *mp; 
	ulong maxpa, maxpa1, maxpa2; 
 
	maxpa = (nvramread(0x18)<<8)|nvramread(0x17); 
	maxpa1 = (nvramread(0x31)<<8)|nvramread(0x30); 
	maxpa2 = (nvramread(0x16)<<8)|nvramread(0x15); 
	print("maxpa = %uX -> %uX, maxpa1 = %uXm maxpa2 = %uX\n", 
		maxpa, MB+maxpa*KB, maxpa1, maxpa2); 
 
	for(mp = rmapram.map; mp->size; mp++) 
		print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); 
	for(mp = rmapumb.map; mp->size; mp++) 
		print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); 
	for(mp = rmapumbr.map; mp->size; mp++) 
		print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); 
	for(mp = rmapupa.map; mp->size; mp++) 
		print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); 
} 
#endif /* notdef */ 
 
void 
1997/0327    
mapfree(RMap* rmap, ulong addr, int size) 
{ 
	Map *mp; 
1997/0328/sys/src/9/pc/memory.c:98,1041997/0329/sys/src/9/pc/memory.c:130,137
1997/0327    
		} 
		else do{ 
			if(mp >= rmap->mapend){ 
				print("mapfree: losing %d, %d\n", addr, size); 
1997/0329    
				print("mapfree: %s: losing 0x%uX, %d\n", 
					rmap->name, addr, size); 
1997/0327    
				break; 
			} 
			t = mp->addr; 
1997/0328/sys/src/9/pc/memory.c:177,1931997/0329/sys/src/9/pc/memory.c:210,229
1997/0327    
	 */ 
	p = KADDR(0xC8000); 
	while(p < (uchar*)KADDR(0xE0000)){ 
		p[0] = 0x55; 
		p[1] = 0xAA; 
		p[2] = 4; 
		if(p[0] == 0x55 && p[1] == 0xAA){ 
			p += p[2]*512; 
			continue; 
		} 
		p[0] = 0xCC; 
		p[2*KB-1] = 0xCC; 
		if(p[0] != 0xCC && p[2*KB-1] != 0xCC) 
1997/0329    
		if(p[0] != 0xCC && p[2*KB-1] != 0xCC){ 
			p[0] = 0x55; 
			p[1] = 0xAA; 
			p[2] = 4; 
			if(p[0] == 0x55 && p[1] == 0xAA){ 
				p += p[2]*512; 
				continue; 
			} 
1997/0327    
			mapfree(&rmapumb, PADDR(p), 2*KB); 
1997/0329    
		} 
		else 
			mapfree(&rmapumbr, PADDR(p), 2*KB); 
1997/0327    
		p += 2*KB; 
	} 
 
1997/0328/sys/src/9/pc/memory.c:201,2071997/0329/sys/src/9/pc/memory.c:237,243
1997/0327    
} 
 
static void 
ramscan(void) 
1997/0329    
ramscan(ulong maxmem) 
1997/0327    
{ 
	ulong *k0, kzero, map, maxpa, pa, *pte, *table, *va, x; 
	int nvalid[NMemType]; 
1997/0328/sys/src/9/pc/memory.c:220,2261997/0329/sys/src/9/pc/memory.c:256,261
1997/0327    
	 * the BIOS data area. 
	 */ 
	x = PADDR(CPU0MACH+BY2PG); 
                 
	bda = (uchar*)(KZERO|0x400); 
	mapfree(&rmapram, x, ((bda[0x14]<<8)|bda[0x13])*KB-x); 
 
1997/0328/sys/src/9/pc/memory.c:230,2431997/0329/sys/src/9/pc/memory.c:265,284
1997/0327    
	 * at least 24MB in case there's a memory gap (up to 8MB) below 16MB; 
	 * in this case the memory from the gap is remapped to the top of 
	 * memory. 
	 * The value in CMOS is supposed to be the number of KB minus one. 
1997/0329    
	 * The value in CMOS is supposed to be the number of KB above 1MB. 
1997/0327    
	 */ 
	maxpa = (nvramread(0x18)<<8)|nvramread(0x17); 
	maxpa = MB+(maxpa+1)*KB; 
	if(maxpa == 0 || maxpa >= 64*MB) 
		maxpa = MemMaxMB*MB; 
	if(maxpa < 24*MB) 
		maxpa = 24*MB; 
1997/0329    
	if(maxmem == 0){ 
		x = (nvramread(0x18)<<8)|nvramread(0x17); 
		if(x == 0 || x >= (63*KB)) 
			maxpa = MemMaxMB*MB; 
		else 
			maxpa = MB+x*KB; 
		if(maxpa < 24*MB) 
			maxpa = 24*MB; 
		maxmem = MemMaxMB*MB; 
	} 
	else 
		maxpa = maxmem; 
1997/0327    
 
	/* 
	 * March up memory from the end of the loaded kernel to maxpa 
1997/0328/sys/src/9/pc/memory.c:331,3381997/0329/sys/src/9/pc/memory.c:372,379
1997/0327    
	} 
	if(map) 
		mapfree(&rmapram, map, BY2PG); 
	if(pa < MemMaxMB*MB) 
		mapfree(&rmapupa, pa, MemMaxMB*MB-pa); 
1997/0329    
	if(pa < maxmem) 
		mapfree(&rmapupa, pa, maxmem-pa); 
1997/0327    
	*k0 = kzero; 
} 
 
1997/0328/sys/src/9/pc/memory.c:373,3811997/0329/sys/src/9/pc/memory.c:414,424
1997/0327    
	mapfree(&xrmapupa, addr, pa-addr); 
} 
 
1997/0329    
 
1997/0327    
void 
memscan(void) 
1997/0329    
meminit(ulong maxmem) 
1997/0327    
{ 
1997/0329    
	Map *mp, *xmp; 
1997/0327    
	ulong pa, *pte; 
 
	/* 
1997/0328/sys/src/9/pc/memory.c:395,4291997/0329/sys/src/9/pc/memory.c:438,447
1997/0327    
	mmuflushtlb(PADDR(m->pdb)); 
 
	umbscan(); 
	ramscan(); 
1997/0329    
dumpmembank(); 
	ramscan(maxmem); 
1997/0327    
	upainit(); 
} 
 
#ifdef notdef 
void 
dumpmembank(void) 
{ 
	Map *mp; 
	ulong maxpa, maxpa1; 
                 
	maxpa = (nvramread(0x18)<<8)|nvramread(0x17); 
	maxpa1 = (nvramread(0x31)<<8)|nvramread(0x30); 
	print("maxpa = %uX -> %uX, maxpa1 = %uX\n", maxpa, MB+(maxpa+1)*KB, maxpa1); 
                 
	for(mp = rmapram.map; mp->size; mp++) 
		print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); 
	for(mp = rmapumb.map; mp->size; mp++) 
		print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); 
	for(mp = rmapupa.map; mp->size; mp++) 
		print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); 
} 
#endif /* notdef */ 
                 
void 
meminit(void) 
{ 
	Map *mp, *xmp; 
                 
	/* 
	 * Set the conf entries describing two banks of allocatable memory. 
	 * Grab the first and largest entries in rmapram as left by ramscan(). 
1997/0328/sys/src/9/pc/memory.c:460,4651997/0329/sys/src/9/pc/memory.c:478,494
1997/0327    
umbfree(ulong addr, int size) 
{ 
	mapfree(&rmapumb, addr & ~KZERO, size); 
1997/0329    
} 
 
ulong 
umbrmalloc(ulong addr, int size, int align) 
{ 
	ulong a; 
 
	if(a = mapalloc(&rmapumbr, addr, size, align)) 
		return KZERO|a; 
 
	return 0; 
1997/0327    
} 
 
ulong 
1997/0329/sys/src/9/pc/memory.c:67,771997/0331/sys/src/9/pc/memory.c:67,77 (short | long)
1997/0327    
	&mapumb[63], 
}; 
 
1997/0329    
static Map mapumbr[8]; 
static RMap rmapumbr = { 
1997/0331    
static Map mapumbrw[8]; 
static RMap rmapumbrw = { 
1997/0329    
	"UMB device memory", 
	mapumbr, 
	&mapumbr[7], 
1997/0331    
	mapumbrw, 
	&mapumbrw[7], 
1997/0329    
}; 
 
#define notdef 
1997/0329/sys/src/9/pc/memory.c:85,911997/0331/sys/src/9/pc/memory.c:85,91
1997/0329    
	maxpa = (nvramread(0x18)<<8)|nvramread(0x17); 
	maxpa1 = (nvramread(0x31)<<8)|nvramread(0x30); 
	maxpa2 = (nvramread(0x16)<<8)|nvramread(0x15); 
	print("maxpa = %uX -> %uX, maxpa1 = %uXm maxpa2 = %uX\n", 
1997/0331    
	print("maxpa = %uX -> %uX, maxpa1 = %uX maxpa2 = %uX\n", 
1997/0329    
		maxpa, MB+maxpa*KB, maxpa1, maxpa2); 
 
	for(mp = rmapram.map; mp->size; mp++) 
1997/0329/sys/src/9/pc/memory.c:92,981997/0331/sys/src/9/pc/memory.c:92,98
1997/0329    
		print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); 
	for(mp = rmapumb.map; mp->size; mp++) 
		print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); 
	for(mp = rmapumbr.map; mp->size; mp++) 
1997/0331    
	for(mp = rmapumbrw.map; mp->size; mp++) 
1997/0329    
		print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); 
	for(mp = rmapupa.map; mp->size; mp++) 
		print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); 
1997/0329/sys/src/9/pc/memory.c:212,2181997/0331/sys/src/9/pc/memory.c:212,218
1997/0327    
	while(p < (uchar*)KADDR(0xE0000)){ 
		p[0] = 0xCC; 
		p[2*KB-1] = 0xCC; 
1997/0329    
		if(p[0] != 0xCC && p[2*KB-1] != 0xCC){ 
1997/0331    
		if(p[0] != 0xCC || p[2*KB-1] != 0xCC){ 
1997/0329    
			p[0] = 0x55; 
			p[1] = 0xAA; 
			p[2] = 4; 
1997/0329/sys/src/9/pc/memory.c:223,2291997/0331/sys/src/9/pc/memory.c:223,229
1997/0327    
			mapfree(&rmapumb, PADDR(p), 2*KB); 
1997/0329    
		} 
		else 
			mapfree(&rmapumbr, PADDR(p), 2*KB); 
1997/0331    
			mapfree(&rmapumbrw, PADDR(p), 2*KB); 
1997/0327    
		p += 2*KB; 
	} 
 
1997/0329/sys/src/9/pc/memory.c:481,4941997/0331/sys/src/9/pc/memory.c:481,514
1997/0329    
} 
 
ulong 
umbrmalloc(ulong addr, int size, int align) 
1997/0331    
umbrwmalloc(ulong addr, int size, int align) 
1997/0329    
{ 
	ulong a; 
1997/0331    
	uchar *p; 
1997/0329    
 
	if(a = mapalloc(&rmapumbr, addr, size, align)) 
1997/0331    
	if(a = mapalloc(&rmapumbrw, addr, size, align)) 
1997/0329    
		return KZERO|a; 
 
1997/0331    
	/* 
	 * Perhaps the memory wasn't visible before 
	 * the interface is initialised, so try again. 
	 */ 
	if((a = umbmalloc(addr, size, align)) == 0) 
		return 0; 
	p = (uchar*)a; 
	p[0] = 0xCC; 
	p[size-1] = 0xCC; 
	if(p[0] == 0xCC && p[size-1] == 0xCC) 
		return a; 
	umbfree(a, size); 
 
1997/0329    
	return 0; 
1997/0331    
} 
 
void 
umbrwfree(ulong addr, int size) 
{ 
	mapfree(&rmapumbrw, addr & ~KZERO, size); 
1997/0327    
} 
 
ulong 
1997/0331/sys/src/9/pc/memory.c:74,801997/0401/sys/src/9/pc/memory.c:74,79 (short | long)
1997/0331    
	&mapumbrw[7], 
1997/0329    
}; 
 
#define notdef 
#ifdef notdef 
1997/0327    
void 
1997/0329    
dumpmembank(void) 
1997/0331/sys/src/9/pc/memory.c:438,4441997/0401/sys/src/9/pc/memory.c:437,442
1997/0327    
	mmuflushtlb(PADDR(m->pdb)); 
 
	umbscan(); 
1997/0329    
dumpmembank(); 
	ramscan(maxmem); 
1997/0327    
	upainit(); 
 
1997/0401/sys/src/9/pc/memory.c:235,2401997/0522/sys/src/9/pc/memory.c:235,241 (short | long)
1997/0327    
	} 
} 
 
1997/0522    
 
1997/0327    
static void 
1997/0329    
ramscan(ulong maxmem) 
1997/0327    
{ 
1997/0401/sys/src/9/pc/memory.c:258,2631997/0522/sys/src/9/pc/memory.c:259,268
1997/0327    
	bda = (uchar*)(KZERO|0x400); 
	mapfree(&rmapram, x, ((bda[0x14]<<8)|bda[0x13])*KB-x); 
 
1997/0522    
	x = PADDR(PGROUND((ulong)end)); 
	pa = MemMinMB*MB; 
	mapfree(&rmapram, x, pa-x); 
 
1997/0327    
	/* 
	 * Check if the extended memory size can be obtained from the CMOS. 
	 * If it's 0 then it's either not known or >= 64MB. Always check 
1997/0401/sys/src/9/pc/memory.c:280,2921997/0522/sys/src/9/pc/memory.c:285,294
1997/0329    
		maxpa = maxmem; 
1997/0327    
 
	/* 
	 * March up memory from the end of the loaded kernel to maxpa 
	 * a page at a time, mapping the page and checking the page can 
1997/0522    
	 * March up memory from MemMinMB to maxpa 1MB at a time, 
	 * mapping the first page and checking the page can 
1997/0327    
	 * be written and read correctly. The page tables are created here 
	 * on the fly, allocating from low memory as necessary. 
	 * Nvalid must be initialised to include some UMB's to prevent the 
	 * first 4MB being mapped with a 4MB page extension, it's already 
	 * partly mapped. 
	 */ 
	k0 = (ulong*)KZERO; 
	kzero = *k0; 
1997/0401/sys/src/9/pc/memory.c:293,3011997/0522/sys/src/9/pc/memory.c:295,301
1997/0327    
	map = 0; 
	x = 0x12345678; 
	memset(nvalid, 0, sizeof(nvalid)); 
	nvalid[MemUMB] = (0x100000-0xC8000)/BY2PG; 
	nvalid[MemRAM] = PADDR(PGROUND((ulong)end))/BY2PG - nvalid[MemUMB]; 
	for(pa = PADDR(PGROUND((ulong)end)); pa < maxpa; pa += BY2PG){ 
1997/0522    
	while(pa < maxpa){ 
1997/0327    
		/* 
		 * Map the page. Use mapalloc(&rmapram, ...) to make 
		 * the page table if necessary, it will be returned to the 
1997/0401/sys/src/9/pc/memory.c:319,3481997/0522/sys/src/9/pc/memory.c:319,358
1997/0327    
		/* 
		 * Write a pattern to the page and write a different 
		 * pattern to a possible mirror at KZER0. If the data 
		 * reads back correctly the page is some type of RAM (possibly 
1997/0522    
		 * reads back correctly the chunk is some type of RAM (possibly 
1997/0327    
		 * a linearly-mapped VGA framebuffer, for instance...) and 
		 * can be cleared and added to the memory pool. If not, the 
		 * page is marked invalid and added to the UMB or NOT pool 
		 * depending on whether it is <16MB or not. 
1997/0522    
		 * chunk is marked uncached and added to the UMB pool if <16MB 
		 * or is marked invalid and added to the UPA pool. 
1997/0327    
		 */ 
		*va = x; 
		*k0 = ~x; 
		if(*va == x){ 
			*pte &= ~PTEUNCACHED; 
			nvalid[MemRAM]++; 
			mapfree(&rmapram, pa, BY2PG); 
			memset(va, 0, BY2PG); 
1997/0522    
			nvalid[MemRAM] += MB/BY2PG; 
			mapfree(&rmapram, pa, MB); 
 
			do{ 
				*pte++ = pa|PTEWRITE|PTEVALID; 
				pa += BY2PG; 
			}while(pa % MB); 
			mmuflushtlb(PADDR(m->pdb)); 
			//memset(va, 0, MB); 
1997/0327    
		} 
1997/0522    
		else if(pa < 16*MB){ 
			nvalid[MemUMB] += MB/BY2PG; 
			mapfree(&rmapumb, pa, MB); 
 
			do{ 
				*pte++ = pa|PTEWRITE|PTEUNCACHED|PTEVALID; 
				pa += BY2PG; 
			}while(pa % MB); 
		} 
1997/0327    
		else{ 
			if(pa < 16*MB){ 
				nvalid[MemUMB]++; 
				mapfree(&rmapumb, pa, BY2PG); 
			} 
			else{ 
				*pte = 0; 
				nvalid[MemUPA]++; 
				mapfree(&rmapupa, pa, BY2PG); 
			} 
1997/0522    
			nvalid[MemUPA] += MB/BY2PG; 
			mapfree(&rmapupa, pa, MB); 
 
			*pte = 0; 
			pa += MB; 
1997/0327    
		} 
 
		/* 
1997/0401/sys/src/9/pc/memory.c:354,3671997/0522/sys/src/9/pc/memory.c:364,377
1997/0327    
		 * 4) mixed or no 4MB page extension - commit the already 
		 *    initialised space for the page table. 
		 */ 
		if(((pa+BY2PG) % (4*MB)) == 0){ 
1997/0522    
		if((pa % (4*MB)) == 0){ 
1997/0327    
			table = &((ulong*)m->pdb)[PDX(va)]; 
			if(nvalid[MemUPA] == 1024) 
1997/0522    
			if(nvalid[MemUPA] == (4*MB)/BY2PG) 
1997/0327    
				*table = 0; 
			else if(nvalid[MemRAM] == 1024 && (m->cpuiddx & 0x08)) 
				*table = (pa & ~(4*MB-1))|PTESIZE|PTEWRITE|PTEVALID; 
			else if(nvalid[MemUMB] == 1024 && (m->cpuiddx & 0x08)) 
				*table = (pa & ~(4*MB-1))|PTESIZE|PTEWRITE|PTEUNCACHED|PTEVALID; 
1997/0522    
			else if(nvalid[MemRAM] == (4*MB)/BY2PG && (m->cpuiddx & 0x08)) 
				*table = (pa - 4*MB)|PTESIZE|PTEWRITE|PTEVALID; 
			else if(nvalid[MemUMB] == (4*MB)/BY2PG && (m->cpuiddx & 0x08)) 
				*table = (pa - 4*MB)|PTESIZE|PTEWRITE|PTEUNCACHED|PTEVALID; 
1997/0327    
			else 
				map = 0; 
		} 
1997/0522/sys/src/9/pc/memory.c:336,3421997/0612/sys/src/9/pc/memory.c:336,342 (short | long)
1997/0522    
				pa += BY2PG; 
			}while(pa % MB); 
			mmuflushtlb(PADDR(m->pdb)); 
			//memset(va, 0, MB); 
1997/0612    
//			memset(va, 0, MB); 
1997/0327    
		} 
1997/0522    
		else if(pa < 16*MB){ 
			nvalid[MemUMB] += MB/BY2PG; 
1997/0612/sys/src/9/pc/memory.c:392,4051997/0717/sys/src/9/pc/memory.c:392,405 (short | long)
1997/0327    
	ulong addr, pa, pae, *table, *va, x; 
 
	/* 
	 * Allocate an 8MB chunk aligned to 16MB. Later can 
1997/0717    
	 * Allocate an 64MB chunk aligned to 64MB. Later can 
1997/0327    
	 * make the region selectable via conf if necessary. 
	 */ 
	if((addr = mapalloc(&rmapupa, 0, 8*MB, 16*MB)) == 0) 
1997/0717    
	if((addr = mapalloc(&rmapupa, 0, 64*MB, 64*MB)) == 0) 
1997/0327    
		return; 
 
	pa = addr; 
	pae = pa+(16*MB); 
1997/0717    
	pae = pa+(64*MB); 
1997/0327    
	while(pa < pae){ 
		va = KADDR(pa); 
		table = &((ulong*)m->pdb)[PDX(va)]; 
1997/0717/sys/src/9/pc/memory.c:21,271997/0805/sys/src/9/pc/memory.c:21,27 (short | long)
1997/0327    
	KB		= 1024, 
 
	MemMinMB	= 4,		/* minimum physical memory (<=4MB) */ 
1997/0328    
	MemMaxMB	= 512,		/* maximum physical memory to check */ 
1997/0805    
	MemMaxMB	= 768,		/* maximum physical memory to check */ 
1997/0327    
 
	NMemBase	= 10, 
}; 
1997/0805/sys/src/9/pc/memory.c:392,4011997/0811/sys/src/9/pc/memory.c:392,401 (short | long)
1997/0327    
	ulong addr, pa, pae, *table, *va, x; 
 
	/* 
1997/0717    
	 * Allocate an 64MB chunk aligned to 64MB. Later can 
1997/0811    
	 * Allocate an 8MB chunk aligned to 16MB. Later can 
1997/0327    
	 * make the region selectable via conf if necessary. 
	 */ 
1997/0717    
	if((addr = mapalloc(&rmapupa, 0, 64*MB, 64*MB)) == 0) 
1997/0811    
	if((addr = mapalloc(&rmapupa, 0, 8*MB, 16*MB)) == 0) 
1997/0327    
		return; 
 
	pa = addr; 
1997/0811/sys/src/9/pc/memory.c:399,4051997/0823/sys/src/9/pc/memory.c:399,405 (short | long)
1997/0327    
		return; 
 
	pa = addr; 
1997/0717    
	pae = pa+(64*MB); 
1997/0823    
	pae = pa+(8*MB); 
1997/0327    
	while(pa < pae){ 
		va = KADDR(pa); 
		table = &((ulong*)m->pdb)[PDX(va)]; 
1997/0823/sys/src/9/pc/memory.c:99,1051997/1011/sys/src/9/pc/memory.c:99,105 (short | long)
1997/0329    
#endif /* notdef */ 
 
void 
1997/0327    
mapfree(RMap* rmap, ulong addr, int size) 
1997/1011    
mapfree(RMap* rmap, ulong addr, ulong size) 
1997/0327    
{ 
	Map *mp; 
	ulong t; 
1997/0823/sys/src/9/pc/memory.c:256,2621997/1011/sys/src/9/pc/memory.c:256,262
1997/0327    
	 * the BIOS data area. 
	 */ 
	x = PADDR(CPU0MACH+BY2PG); 
	bda = (uchar*)(KZERO|0x400); 
1997/1011    
	bda = (uchar*)KADDR(0x400); 
1997/0327    
	mapfree(&rmapram, x, ((bda[0x14]<<8)|bda[0x13])*KB-x); 
 
1997/0522    
	x = PADDR(PGROUND((ulong)end)); 
1997/0823/sys/src/9/pc/memory.c:290,2961997/1011/sys/src/9/pc/memory.c:290,296
1997/0327    
	 * be written and read correctly. The page tables are created here 
	 * on the fly, allocating from low memory as necessary. 
	 */ 
	k0 = (ulong*)KZERO; 
1997/1011    
	k0 = (ulong*)KADDR(0); 
1997/0327    
	kzero = *k0; 
	map = 0; 
	x = 0x12345678; 
1997/0823/sys/src/9/pc/memory.c:383,4291997/1011/sys/src/9/pc/memory.c:383,393
1997/0327    
		mapfree(&rmapram, map, BY2PG); 
1997/0329    
	if(pa < maxmem) 
		mapfree(&rmapupa, pa, maxmem-pa); 
1997/1011    
	if(maxmem < 0xFEC00000) 
		mapfree(&rmapupa, maxmem, 0xFEC00000-maxmem); 
1997/0327    
	*k0 = kzero; 
} 
 
static void 
upainit(void) 
{ 
	ulong addr, pa, pae, *table, *va, x; 
                 
	/* 
1997/0811    
	 * Allocate an 8MB chunk aligned to 16MB. Later can 
1997/0327    
	 * make the region selectable via conf if necessary. 
	 */ 
1997/0811    
	if((addr = mapalloc(&rmapupa, 0, 8*MB, 16*MB)) == 0) 
1997/0327    
		return; 
                 
	pa = addr; 
1997/0823    
	pae = pa+(8*MB); 
1997/0327    
	while(pa < pae){ 
		va = KADDR(pa); 
		table = &((ulong*)m->pdb)[PDX(va)]; 
		if((pa % (4*MB)) == 0 && (m->cpuiddx & 0x08)){ 
			*table = pa|PTESIZE|PTEWRITE|PTEUNCACHED|PTEVALID; 
			pa += (4*MB); 
		} 
		else{ 
			if(*table == 0){ 
				if((x = mapalloc(&rmapram, 0, BY2PG, BY2PG)) == 0) 
					break; 
				memset(KADDR(x), 0, BY2PG); 
				*table = x|PTEWRITE|PTEVALID; 
			} 
			table = (ulong*)(KZERO|PPN(*table)); 
			table[PTX(va)] = pa|PTEWRITE|PTEUNCACHED|PTEVALID; 
			pa += BY2PG; 
		} 
	} 
                 
	mapfree(&xrmapupa, addr, pa-addr); 
} 
                 
1997/0329    
                 
1997/0327    
void 
1997/0329    
meminit(ulong maxmem) 
1997/0327    
{ 
1997/0823/sys/src/9/pc/memory.c:448,4541997/1011/sys/src/9/pc/memory.c:412,417
1997/0327    
 
	umbscan(); 
1997/0329    
	ramscan(maxmem); 
1997/0327    
	upainit(); 
 
	/* 
	 * Set the conf entries describing two banks of allocatable memory. 
1997/0823/sys/src/9/pc/memory.c:477,4831997/1011/sys/src/9/pc/memory.c:440,446
1997/0327    
	ulong a; 
 
	if(a = mapalloc(&rmapumb, addr, size, align)) 
		return KZERO|a; 
1997/1011    
		return (ulong)KADDR(a); 
1997/0327    
 
	return 0; 
} 
1997/0823/sys/src/9/pc/memory.c:485,4911997/1011/sys/src/9/pc/memory.c:448,454
1997/0327    
void 
umbfree(ulong addr, int size) 
{ 
	mapfree(&rmapumb, addr & ~KZERO, size); 
1997/1011    
	mapfree(&rmapumb, PADDR(addr), size); 
1997/0329    
} 
 
ulong 
1997/0823/sys/src/9/pc/memory.c:495,5011997/1011/sys/src/9/pc/memory.c:458,464
1997/0331    
	uchar *p; 
1997/0329    
 
1997/0331    
	if(a = mapalloc(&rmapumbrw, addr, size, align)) 
1997/0329    
		return KZERO|a; 
1997/1011    
		return(ulong)KADDR(a); 
1997/0329    
 
1997/0331    
	/* 
	 * Perhaps the memory wasn't visible before 
1997/0823/sys/src/9/pc/memory.c:516,5371997/1011/sys/src/9/pc/memory.c:479,514
1997/0331    
void 
umbrwfree(ulong addr, int size) 
{ 
	mapfree(&rmapumbrw, addr & ~KZERO, size); 
1997/1011    
	mapfree(&rmapumbrw, PADDR(addr), size); 
1997/0327    
} 
 
ulong 
upamalloc(ulong addr, int size, int align) 
{ 
	ulong a; 
1997/1011    
	ulong a, ae; 
1997/0327    
 
	if(a = mapalloc(&xrmapupa, addr, size, align)) 
		return KZERO|a; 
1997/1011    
		return (ulong)KADDR(a); 
1997/0327    
 
	return 0; 
1997/1011    
	if((a = mapalloc(&rmapupa, addr, size, align)) == 0) 
		return 0; 
 
	ae = mmukmap(a, 0, size); 
 
	/* 
	 * Should check here that it was all delivered 
	 * and put it back and barf if not. 
	 */ 
	USED(ae); 
 
	/* 
	 * Be very careful this returns a PHYSICAL address. 
	 */ 
	return a; 
1997/0327    
} 
 
void 
upafree(ulong addr, int size) 
{ 
	mapfree(&xrmapupa, addr & ~KZERO, size); 
1997/1011    
	mapfree(&xrmapupa, addr, size); 
1997/0327    
} 
1997/1011/sys/src/9/pc/memory.c:74,791997/1101/sys/src/9/pc/memory.c:74,80 (short | long)
1997/0331    
	&mapumbrw[7], 
1997/0329    
}; 
 
1997/1101    
#define notdef 
1997/0329    
#ifdef notdef 
1997/0327    
void 
1997/0329    
dumpmembank(void) 
1997/1011/sys/src/9/pc/memory.c:302,3081997/1101/sys/src/9/pc/memory.c:303,309
1997/0327    
		 * pool later if it isn't needed. 
		 */ 
		va = KADDR(pa); 
		table = &((ulong*)m->pdb)[PDX(va)]; 
1997/1101    
		table = &m->pdb[PDX(va)]; 
1997/0327    
		if(*table == 0){ 
			if(map == 0 && (map = mapalloc(&rmapram, 0, BY2PG, BY2PG)) == 0) 
				break; 
1997/1011/sys/src/9/pc/memory.c:365,3711997/1101/sys/src/9/pc/memory.c:366,372
1997/0327    
		 *    initialised space for the page table. 
		 */ 
1997/0522    
		if((pa % (4*MB)) == 0){ 
1997/0327    
			table = &((ulong*)m->pdb)[PDX(va)]; 
1997/1101    
			table = &m->pdb[PDX(va)]; 
1997/0522    
			if(nvalid[MemUPA] == (4*MB)/BY2PG) 
1997/0327    
				*table = 0; 
1997/0522    
			else if(nvalid[MemRAM] == (4*MB)/BY2PG && (m->cpuiddx & 0x08)) 
1997/1011/sys/src/9/pc/memory.c:383,3901997/1101/sys/src/9/pc/memory.c:384,392
1997/0327    
		mapfree(&rmapram, map, BY2PG); 
1997/0329    
	if(pa < maxmem) 
		mapfree(&rmapupa, pa, maxmem-pa); 
1997/1011    
	if(maxmem < 0xFEC00000) 
		mapfree(&rmapupa, maxmem, 0xFEC00000-maxmem); 
1997/1101    
	if(maxmem < 0xFFE00000) 
		mapfree(&rmapupa, maxmem, 0xFFE00000-maxmem); 
print("maxmem %uX %uX\n", maxmem, 0xFFE00000-maxmem); 
1997/0327    
	*k0 = kzero; 
} 
 
1997/1011/sys/src/9/pc/memory.c:401,4111997/1101/sys/src/9/pc/memory.c:403,413
1997/0327    
	 * then scan for useful memory. 
	 */ 
	for(pa = 0xA0000; pa < 0xC0000; pa += BY2PG){ 
		pte = mmuwalk(m->pdb, (ulong)KADDR(pa), 0); 
1997/1101    
		pte = mmuwalk(m->pdb, (ulong)KADDR(pa), 2, 0); 
1997/0327    
		*pte |= PTEWT; 
	} 
	for(pa = 0xC0000; pa < 0x100000; pa += BY2PG){ 
		pte = mmuwalk(m->pdb, (ulong)KADDR(pa), 0); 
1997/1101    
		pte = mmuwalk(m->pdb, (ulong)KADDR(pa), 2, 0); 
1997/0327    
		*pte |= PTEUNCACHED; 
	} 
	mmuflushtlb(PADDR(m->pdb)); 
1997/1011/sys/src/9/pc/memory.c:432,4371997/1101/sys/src/9/pc/memory.c:434,440
1997/0327    
		conf.base1 = xmp->addr; 
		conf.npage1 = xmp->size/BY2PG; 
	} 
1997/1101    
dumpmembank(); 
1997/0327    
} 
 
ulong 
1997/1101/sys/src/9/pc/memory.c:9,141997/1213/sys/src/9/pc/memory.c:9,16 (short | long)
1997/0327    
#include "fns.h" 
#include "io.h" 
 
1997/1213    
#define MEMDEBUG	0 
 
1997/0327    
#define PDX(va)		((((ulong)(va))>>22) & 0x03FF) 
#define PTX(va)		((((ulong)(va))>>12) & 0x03FF) 
 
1997/1101/sys/src/9/pc/memory.c:74,871997/1213/sys/src/9/pc/memory.c:76,90
1997/0331    
	&mapumbrw[7], 
1997/0329    
}; 
 
1997/1101    
#define notdef 
1997/0329    
#ifdef notdef 
1997/0327    
void 
1997/0329    
dumpmembank(void) 
1997/1213    
memdebug(void) 
1997/0329    
{ 
	Map *mp; 
	ulong maxpa, maxpa1, maxpa2; 
 
1997/1213    
	if(MEMDEBUG == 0) 
		return; 
 
1997/0329    
	maxpa = (nvramread(0x18)<<8)|nvramread(0x17); 
	maxpa1 = (nvramread(0x31)<<8)|nvramread(0x30); 
	maxpa2 = (nvramread(0x16)<<8)|nvramread(0x15); 
1997/1101/sys/src/9/pc/memory.c:97,1031997/1213/sys/src/9/pc/memory.c:100,105
1997/0329    
	for(mp = rmapupa.map; mp->size; mp++) 
		print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); 
} 
#endif /* notdef */ 
 
void 
1997/1011    
mapfree(RMap* rmap, ulong addr, ulong size) 
1997/1101/sys/src/9/pc/memory.c:156,1621997/1213/sys/src/9/pc/memory.c:158,177
1997/0327    
		maddr = mp->addr; 
 
		if(addr){ 
1997/1213    
			/* 
			 * A specific address range has been given: 
			 *   if the current map entry is greater then 
			 *   the address is not in the map; 
			 *   if the current map entry does not overlap 
			 *   the beginning of the requested range then 
			 *   continue on to the next map entry; 
			 *   if the current map entry does not entirely 
			 *   contain the requested range then the range 
			 *   is not in the map. 
			 */ 
1997/0327    
			if(maddr > addr) 
1997/1213    
				break; 
			if(maddr+mp->size < addr) 
1997/0327    
				continue; 
			if(addr+size > maddr+mp->size) 
				break; 
1997/1101/sys/src/9/pc/memory.c:386,3921997/1213/sys/src/9/pc/memory.c:401,408
1997/0329    
		mapfree(&rmapupa, pa, maxmem-pa); 
1997/1101    
	if(maxmem < 0xFFE00000) 
		mapfree(&rmapupa, maxmem, 0xFFE00000-maxmem); 
print("maxmem %uX %uX\n", maxmem, 0xFFE00000-maxmem); 
1997/1213    
	if(MEMDEBUG) 
		print("maxmem %uX %uX\n", maxmem, 0xFFE00000-maxmem); 
1997/0327    
	*k0 = kzero; 
} 
 
1997/1101/sys/src/9/pc/memory.c:434,4401997/1213/sys/src/9/pc/memory.c:450,457
1997/0327    
		conf.base1 = xmp->addr; 
		conf.npage1 = xmp->size/BY2PG; 
	} 
1997/1101    
dumpmembank(); 
1997/1213    
	if(MEMDEBUG) 
		memdebug(); 
1997/0327    
} 
 
ulong 
1997/1101/sys/src/9/pc/memory.c:491,4971997/1213/sys/src/9/pc/memory.c:508,514
1997/1011    
	ulong a, ae; 
1997/0327    
 
	if(a = mapalloc(&xrmapupa, addr, size, align)) 
1997/1011    
		return (ulong)KADDR(a); 
1997/1213    
		return a; 
1997/0327    
 
1997/1011    
	if((a = mapalloc(&rmapupa, addr, size, align)) == 0) 
		return 0; 
1997/1213/sys/src/9/pc/memory.c:251,2571998/0221/sys/src/9/pc/memory.c:251,256 (short | long)
1997/0327    
	} 
} 
 
1997/0522    
                 
1997/0327    
static void 
1997/0329    
ramscan(ulong maxmem) 
1997/0327    
{ 
1998/0221/sys/src/9/pc/memory.c:223,2291998/0312/sys/src/9/pc/memory.c:223,229 (short | long)
1997/0327    
	 * at 0xE0000 then the whole 64KB up to 0xF0000 is theoretically up 
	 * for grabs; check anyway. 
	 */ 
	p = KADDR(0xC8000); 
1998/0312    
	p = KADDR(0xC0000); 
1997/0327    
	while(p < (uchar*)KADDR(0xE0000)){ 
		p[0] = 0xCC; 
		p[2*KB-1] = 0xCC; 
1998/0221/sys/src/9/pc/memory.c:235,2411998/0312/sys/src/9/pc/memory.c:235,242
1997/0329    
				p += p[2]*512; 
				continue; 
			} 
1997/0327    
			mapfree(&rmapumb, PADDR(p), 2*KB); 
1998/0312    
			if(p[0] == 0xFF && p[1] == 0xFF) 
				mapfree(&rmapumb, PADDR(p), 2*KB); 
1997/0329    
		} 
		else 
1997/0331    
			mapfree(&rmapumbrw, PADDR(p), 2*KB); 
1998/0312/sys/src/9/pc/memory.c:88,1041998/0825/sys/src/9/pc/memory.c:88,104 (short | long)
Bug fix: print format.
rsc Fri Mar 4 12:44:25 2005
1997/0329    
	maxpa = (nvramread(0x18)<<8)|nvramread(0x17); 
	maxpa1 = (nvramread(0x31)<<8)|nvramread(0x30); 
	maxpa2 = (nvramread(0x16)<<8)|nvramread(0x15); 
1997/0331    
	print("maxpa = %uX -> %uX, maxpa1 = %uX maxpa2 = %uX\n", 
1998/0825    
	print("maxpa = %luX -> %luX, maxpa1 = %luX maxpa2 = %luX\n", 
1997/0329    
		maxpa, MB+maxpa*KB, maxpa1, maxpa2); 
 
	for(mp = rmapram.map; mp->size; mp++) 
		print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); 
1998/0825    
		print("%8.8luX %8.8uX %8.8luX\n", mp->addr, mp->size, mp->addr+mp->size); 
1997/0329    
	for(mp = rmapumb.map; mp->size; mp++) 
		print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); 
1998/0825    
		print("%8.8luX %8.8uX %8.8luX\n", mp->addr, mp->size, mp->addr+mp->size); 
1997/0331    
	for(mp = rmapumbrw.map; mp->size; mp++) 
1997/0329    
		print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); 
1998/0825    
		print("%8.8luX %8.8uX %8.8luX\n", mp->addr, mp->size, mp->addr+mp->size); 
1997/0329    
	for(mp = rmapupa.map; mp->size; mp++) 
		print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); 
1998/0825    
		print("%8.8luX %8.8uX %8.8luX\n", mp->addr, mp->size, mp->addr+mp->size); 
1997/0329    
} 
 
void 
1998/0312/sys/src/9/pc/memory.c:132,1381998/0825/sys/src/9/pc/memory.c:132,138
1997/0327    
		} 
		else do{ 
			if(mp >= rmap->mapend){ 
1997/0329    
				print("mapfree: %s: losing 0x%uX, %d\n", 
1998/0825    
				print("mapfree: %s: losing 0x%luX, %ld\n", 
1997/0329    
					rmap->name, addr, size); 
1997/0327    
				break; 
			} 
1998/0312/sys/src/9/pc/memory.c:402,4081998/0825/sys/src/9/pc/memory.c:402,408
1997/1101    
	if(maxmem < 0xFFE00000) 
		mapfree(&rmapupa, maxmem, 0xFFE00000-maxmem); 
1997/1213    
	if(MEMDEBUG) 
		print("maxmem %uX %uX\n", maxmem, 0xFFE00000-maxmem); 
1998/0825    
		print("maxmem %luX %luX\n", maxmem, 0xFFE00000-maxmem); 
1997/0327    
	*k0 = kzero; 
} 
 
1998/0825/sys/src/9/pc/memory.c:41,651998/0906/sys/src/9/pc/memory.c:41,65 (short | long)
1997/0327    
	Lock; 
} RMap; 
 
static Map mapupa[8]; 
1998/0906    
static Map mapupa[16]; 
1997/0327    
static RMap rmapupa = { 
	"unallocated unbacked physical memory", 
	mapupa, 
	&mapupa[7], 
1998/0906    
	&mapupa[nelem(mapupa)-1], 
1997/0327    
}; 
 
static Map xmapupa[8]; 
1998/0906    
static Map xmapupa[16]; 
1997/0327    
static RMap xrmapupa = { 
	"unbacked physical memory", 
	xmapupa, 
	&xmapupa[7], 
1998/0906    
	&xmapupa[nelem(xmapupa)-1], 
1997/0327    
}; 
 
static Map mapram[8]; 
1998/0906    
static Map mapram[16]; 
1997/0327    
static RMap rmapram = { 
	"physical memory", 
	mapram, 
	&mapram[7], 
1998/0906    
	&mapram[nelem(mapram)-1], 
1997/0327    
}; 
 
static Map mapumb[64]; 
1998/0825/sys/src/9/pc/memory.c:66,791998/0906/sys/src/9/pc/memory.c:66,79
1997/0327    
static RMap rmapumb = { 
	"upper memory block", 
	mapumb, 
	&mapumb[63], 
1998/0906    
	&mapumb[nelem(mapumb)-1], 
1997/0327    
}; 
 
1997/0331    
static Map mapumbrw[8]; 
1998/0906    
static Map mapumbrw[16]; 
1997/0331    
static RMap rmapumbrw = { 
1997/0329    
	"UMB device memory", 
1997/0331    
	mapumbrw, 
	&mapumbrw[7], 
1998/0906    
	&mapumbrw[nelem(mapumbrw)-1], 
1997/0329    
}; 
 
1997/0327    
void 
1998/0906/sys/src/9/pc/memory.c:503,5191998/0924/sys/src/9/pc/memory.c:503,527 (short | long)
1997/0327    
} 
 
ulong 
upamalloc(ulong addr, int size, int align) 
1998/0924    
upamalloc(ulong pa, int size, int align) 
1997/0327    
{ 
1997/1011    
	ulong a, ae; 
1997/0327    
 
	if(a = mapalloc(&xrmapupa, addr, size, align)) 
1998/0924    
	if(a = mapalloc(&xrmapupa, pa, size, align)) 
1997/1213    
		return a; 
1997/0327    
 
1997/1011    
	if((a = mapalloc(&rmapupa, addr, size, align)) == 0) 
1998/0924    
	if((a = mapalloc(&rmapupa, pa, size, align)) == 0){ 
		memdebug(); 
1997/1011    
		return 0; 
1998/0924    
	} 
1997/1011    
 
	ae = mmukmap(a, 0, size); 
1998/0924    
	/* 
	 * Upamalloc is a request to map a range of physical addresses. 
	 * Therefore, if pa is 0 mapalloc will choose the base address. 
	 * Note, however, mmukmap is always asked to give a 1-to-1 mapping 
	 * of va to pa. 
	 */ 
	ae = mmukmap(a, a, size); 
1997/1011    
 
	/* 
	 * Should check here that it was all delivered 
1998/0906/sys/src/9/pc/memory.c:528,5341998/0924/sys/src/9/pc/memory.c:536,542
1997/0327    
} 
 
void 
upafree(ulong addr, int size) 
1998/0924    
upafree(ulong pa, int size) 
1997/0327    
{ 
1997/1011    
	mapfree(&xrmapupa, addr, size); 
1998/0924    
	mapfree(&xrmapupa, pa, size); 
1997/0327    
} 
1998/0924/sys/src/9/pc/memory.c:520,5271998/0926/sys/src/9/pc/memory.c:520,529 (short | long)
1998/0924    
	 * Therefore, if pa is 0 mapalloc will choose the base address. 
	 * Note, however, mmukmap is always asked to give a 1-to-1 mapping 
	 * of va to pa. 
	 */ 
	ae = mmukmap(a, a, size); 
1998/0926    
	 * ...but for the moment go back to the old scheme for VLB cards. 
	 */ 
	ae = mmukmap(a, 0, size); 
1997/1011    
 
	/* 
	 * Should check here that it was all delivered 
1998/0924/sys/src/9/pc/memory.c:530,5361998/0926/sys/src/9/pc/memory.c:532,541
1997/1011    
	USED(ae); 
 
	/* 
	 * Be very careful this returns a PHYSICAL address. 
1998/0926    
	 * Be very careful this returns a PHYSICAL address 
	 * mapped 1-to-1 with the virtual address. 
	 * If a < KZERO it's probably not a good idea to 
	 * try KADDR(a)... 
1997/1011    
	 */ 
	return a; 
1997/0327    
} 
1998/0926/sys/src/9/pc/memory.c:76,811999/0713/sys/src/9/pc/memory.c:76,88 (short | long)
1998/0906    
	&mapumbrw[nelem(mapumbrw)-1], 
1997/0329    
}; 
 
1999/0713    
static Map mapiospace[256]; 
static RMap rmapiospace = { 
	"x86 IO port space", 
	mapiospace, 
	&mapiospace[nelem(mapiospace)-1], 
}; 
 
1997/0327    
void 
1997/1213    
memdebug(void) 
1997/0329    
{ 
1998/0926/sys/src/9/pc/memory.c:544,5471999/0713/sys/src/9/pc/memory.c:551,582
1998/0924    
upafree(ulong pa, int size) 
1997/0327    
{ 
1998/0924    
	mapfree(&xrmapupa, pa, size); 
1999/0713    
} 
 
 
/* 
 *  since mapalloc uses 0 to mean no allocation, add one to pa 
 *  to shift the whole io range up one in the map. 
 */ 
void 
ioinit(void) 
{ 
	mapfree(&rmapiospace, 1, (1<<24)+1); 
} 
 
ulong 
ioalloc(ulong pa, int size, int align) 
{ 
	ulong a; 
 
	if((a = mapalloc(&rmapiospace, ++pa, size, align)) == 0) 
		return 0; 
 
	return --a; 
} 
 
void 
iofree(ulong pa, int size) 
{ 
	mapfree(&rmapiospace, ++pa, size); 
1997/0327    
} 
1999/0713/sys/src/9/pc/memory.c:76,881999/0714/sys/src/9/pc/memory.c:76,81 (short | long)
Remove ioalloc etc. (Now in port? XXX) Remove rmapiospace.
rsc Fri Mar 4 12:44:25 2005
1998/0906    
	&mapumbrw[nelem(mapumbrw)-1], 
1997/0329    
}; 
 
1999/0713    
static Map mapiospace[256]; 
static RMap rmapiospace = { 
	"x86 IO port space", 
	mapiospace, 
	&mapiospace[nelem(mapiospace)-1], 
}; 
                 
1997/0327    
void 
1997/1213    
memdebug(void) 
1997/0329    
{ 
1999/0713/sys/src/9/pc/memory.c:553,5821999/0714/sys/src/9/pc/memory.c:546,548
1998/0924    
	mapfree(&xrmapupa, pa, size); 
1999/0713    
} 
 
                 
/* 
 *  since mapalloc uses 0 to mean no allocation, add one to pa 
 *  to shift the whole io range up one in the map. 
 */ 
void 
ioinit(void) 
{ 
	mapfree(&rmapiospace, 1, (1<<24)+1); 
} 
                 
ulong 
ioalloc(ulong pa, int size, int align) 
{ 
	ulong a; 
                 
	if((a = mapalloc(&rmapiospace, ++pa, size, align)) == 0) 
		return 0; 
                 
	return --a; 
} 
                 
void 
iofree(ulong pa, int size) 
{ 
	mapfree(&rmapiospace, ++pa, size); 
1997/0327    
} 
1999/0714/sys/src/9/pc/memory.c:171,1792000/0630/sys/src/9/pc/memory.c:171,179 (short | long)
1997/1213    
			 */ 
1997/0327    
			if(maddr > addr) 
1997/1213    
				break; 
			if(maddr+mp->size < addr) 
2000/0630    
			if(mp->size < addr - maddr)	/* maddr+mp->size < addr, but no overflow */ 
1997/0327    
				continue; 
			if(addr+size > maddr+mp->size) 
2000/0630    
			if(addr - maddr > mp->size - size)	/* addr+size > maddr+mp->size, but no overflow */ 
1997/0327    
				break; 
			maddr = addr; 
		} 
1999/0714/sys/src/9/pc/memory.c:400,4082000/0630/sys/src/9/pc/memory.c:400,408
1997/0329    
	if(pa < maxmem) 
		mapfree(&rmapupa, pa, maxmem-pa); 
1997/1101    
	if(maxmem < 0xFFE00000) 
		mapfree(&rmapupa, maxmem, 0xFFE00000-maxmem); 
2000/0630    
		mapfree(&rmapupa, maxmem, 0x00000000-maxmem); 
1997/1213    
	if(MEMDEBUG) 
1998/0825    
		print("maxmem %luX %luX\n", maxmem, 0xFFE00000-maxmem); 
2000/0630    
		print("maxmem %luX %luX\n", maxmem, 0x00000000-maxmem); 
1997/0327    
	*k0 = kzero; 
} 
 
2000/0630/sys/src/9/pc/memory.c:225,2302001/0523/sys/src/9/pc/memory.c:225,238 (short | long)
1997/0327    
	 */ 
1998/0312    
	p = KADDR(0xC0000); 
1997/0327    
	while(p < (uchar*)KADDR(0xE0000)){ 
2001/0523    
		if (p[0] == 0x55 && p[1] == 0xAA) { 
			/* Skip p[2] chunks of 512 bytes.  Test for 0x55 AA before 
			     poking obtrusively, or else the Thinkpad X20 dies when 
			     setting up the cardbus (PB) */ 
			p += p[2] * 512; 
			continue; 
		} 
 
1997/0327    
		p[0] = 0xCC; 
		p[2*KB-1] = 0xCC; 
1997/0331    
		if(p[0] != 0xCC || p[2*KB-1] != 0xCC){ 
2001/0523/sys/src/9/pc/memory.c:225,2352001/0527/sys/src/9/pc/memory.c:225,238 (short | long)
1997/0327    
	 */ 
1998/0312    
	p = KADDR(0xC0000); 
1997/0327    
	while(p < (uchar*)KADDR(0xE0000)){ 
2001/0523    
		if (p[0] == 0x55 && p[1] == 0xAA) { 
			/* Skip p[2] chunks of 512 bytes.  Test for 0x55 AA before 
			     poking obtrusively, or else the Thinkpad X20 dies when 
			     setting up the cardbus (PB) */ 
			p += p[2] * 512; 
2001/0527    
		/* 
		 * Test for 0x55 AA before poking obtrusively, 
		 * some machines (e.g. Thinkpad X20) seem to map 
		 * something dynamic here (cardbus?) causing weird 
		 * problems if it is changed. 
		 */ 
		if(p[0] == 0x55 && p[1] == 0xAA){ 
			p += p[2]*512; 
2001/0523    
			continue; 
		} 
 
2001/0527/sys/src/9/pc/memory.c:225,2382001/0609/sys/src/9/pc/memory.c:225,235 (short | long)
1997/0327    
	 */ 
1998/0312    
	p = KADDR(0xC0000); 
1997/0327    
	while(p < (uchar*)KADDR(0xE0000)){ 
2001/0527    
		/* 
		 * Test for 0x55 AA before poking obtrusively, 
		 * some machines (e.g. Thinkpad X20) seem to map 
		 * something dynamic here (cardbus?) causing weird 
		 * problems if it is changed. 
		 */ 
		if(p[0] == 0x55 && p[1] == 0xAA){ 
			p += p[2]*512; 
2001/0609    
		if (p[0] == 0x55 && p[1] == 0xAA) { 
			/* Skip p[2] chunks of 512 bytes.  Test for 0x55 AA before 
			     poking obtrusively, or else the Thinkpad X20 dies when 
			     setting up the cardbus (PB) */ 
			p += p[2] * 512; 
2001/0523    
			continue; 
		} 
 
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)