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

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

1997/0328/sys/src/9/pc/memory.c:67,731997/0329/sys/src/9/pc/memory.c:67,105 (short | long | prev | next)
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 


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