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

1992/0808/ss/main.c (diff list | history)

1992/0807/sys/src/9/ss/main.c:5,101992/0808/sys/src/9/ss/main.c:5,11 (short | long | prev | next)
1990/1223    
#include	"fns.h" 
#include	"io.h" 
#include	"init.h" 
1992/0808    
#include	"rom.h" 
1990/1223    
 
1992/0211    
#include	<libg.h> 
1990/1223    
#include	<gnot.h> 
1992/0807/sys/src/9/ss/main.c:12,211992/0808/sys/src/9/ss/main.c:13,24
1992/0807    
uchar	*intrreg; 
int	model; 
uchar	idprom[32]; 
ulong	romvec;		/* open boot rom vector */ 
1992/0808    
ROM	*rom;		/* open boot rom vector */ 
1992/0807    
int	cpuserver; 
ulong	romputcxsegm; 
1992/0808    
void	(*romputcxsegm)(int, ulong, int); 
1992/0807    
ulong	bank[2]; 
1992/0808    
char	rombuf[20000]; 
char	mempres[256]; 
1991/0110    
 
1990/1223    
void 
main(void) 
1992/0807/sys/src/9/ss/main.c:114,1191992/0808/sys/src/9/ss/main.c:117,123
1992/0516    
	kproc("alarm", alarmkproc, 0); 
	chandevinit(); 
1990/1226    
 
1992/0808    
 
1991/0926    
	if(!waserror()){ 
1991/1102    
		ksetterm("sun %s"); 
1991/0927    
		ksetenv("cputype", "sparc"); 
1992/0807/sys/src/9/ss/main.c:204,2391992/0808/sys/src/9/ss/main.c:208,295
1991/0926    
	systemreset(); 
1990/1223    
} 
 
1992/0807    
int 
banksize(ulong addr, ulong nbytes) 
1992/0808    
void 
scanmem(char *mempres, int n) 
1992/0807    
{ 
	int i; 
	ulong min, max, t; 
	ulong va, pa; 
	ulong nmeg; 
1992/0808    
	ulong va, addr; 
1992/0807    
 
	nmeg = nbytes/MB; 
	va = 1*MB-2*BY2PG; 
	for(i=0; i<nmeg; i++){ 
		pa = addr+i*MB; 
		putw4(va, PPN(pa)|PTEVALID|PTEKERNEL|PTENOCACHE|PTEWRITE|PTEMAINMEM); 
		*(ulong*)va = pa; 
1992/0808    
	for(i=0; i<n; i++){ 
		mempres[i] = 0; 
		addr = i*MB; 
		putw4(va, PPN(addr)|PTEVALID|PTEKERNEL|PTENOCACHE|PTEWRITE|PTEMAINMEM); 
		*(ulong*)va = addr; 
		if(*(ulong*)va == addr){ 
			addr = ~addr; 
			*(ulong*)va = addr; 
			if(*(ulong*)va == addr){ 
				mempres[i] = 1; 
				*(ulong*)va = i + '0'; 
			} 
		} 
1992/0807    
	} 
	min = ~0; 
	max = 0; 
	for(i=0; i<nmeg; i++){ 
		pa = addr+i*MB; 
		putw4(va, PPN(pa)|PTEVALID|PTEKERNEL|PTENOCACHE|PTEWRITE|PTEMAINMEM); 
		t = *(ulong*)va; 
		if(min > t) 
			min = t; 
		if(max < t) 
			max = t; 
1992/0808    
	for(i=0; i<n; i++) 
		if(mempres[i]){ 
			addr = i*MB; 
			putw4(va, PPN(addr)|PTEVALID|PTEKERNEL|PTENOCACHE|PTEWRITE|PTEMAINMEM); 
			mempres[i] = *(ulong*)va; 
		}else 
			mempres[i] = 0; 
} 
 
char name[1024]; 
 
void 
romprops(ulong d, char *namep, ulong p) 
{ 
	static ulong romp; 
	uchar buf[128]; 
	int i, n; 
 
	romp += sprint(rombuf+romp, "romprops %lux %lux\n", d, p); 
	while(p && *(char*)p){ 
		n = call(rom->conf->getproplen, d, p); 
		if(n>=0 && n<sizeof buf){ 
			call(rom->conf->getprop, d, p, buf); 
			if(strcmp((char*)p, "name")==0){ 
				strcpy(namep, (char*)buf); 
				romp += sprint(rombuf+romp, "`%s'\n", name); 
			}else{ 
				romp += sprint(rombuf+romp, "%lux: %s: ", d, p); 
				for(i=0; i<n; i++) 
					romp += sprint(rombuf+romp, "%.2ux ", buf[i]); 
				romp += sprint(rombuf+romp, "\n"); 
			} 
		}else 
			romp += sprint(rombuf+romp, "%lux: %s(%d)\n", d, p, n); 
		p = call(rom->conf->nextprop, d, p); 
1992/0807    
	} 
	putw4(va, INVALIDPTE); 
	return (max-min)/MB+1; 
} 
 
1992/0808    
void 
romwalk(ulong d, char* namep) 
{ 
	char *endp; 
 
	*namep++ = '/'; 
	*namep = 0; 
	while(d){ 
		romprops(d, namep, call(rom->conf->nextprop, d, 0)); 
		endp = namep+strlen(namep); 
		romwalk(call(rom->conf->child, d), endp); 
		*endp = 0; 
		d = call(rom->conf->next, d); 
	} 
} 
 
void 
fuck(void) 
{ 
	name[0] = 0; 
	romwalk(call(rom->conf->next, 0), name); 
} 
 
1990/1223    
Conf	conf; 
 
void 
1992/0807/sys/src/9/ss/main.c:240,2471992/0808/sys/src/9/ss/main.c:296,303
1990/1223    
confinit(void) 
{ 
	int mul; 
1992/0807    
	ulong i; 
	ulong ktop, va, mbytes; 
1992/0808    
	ulong i, j; 
	ulong ktop, va, mbytes, nmeg, npg, v; 
1990/1226    
 
1990/1223    
	conf.nmach = 1; 
	if(conf.nmach > MAXMACH) 
1992/0807/sys/src/9/ss/main.c:256,2631992/0808/sys/src/9/ss/main.c:312,325
1992/0807    
	putw4(va, INVALIDPTE); 
1992/0619    
 
1992/0807    
	switch(idprom[1]){ 
	case 0x51:		/* sparcstation 1 */ 
	case 0x54:		/* slc */ 
1992/0808    
 
	/* sparcstation 1+ BUG: unknown! */ 
	case 0x52:		/* IPC 4/40 */ 
	case 0x53:		/* sparcstation 1+ 4/65 */ 
		/* fall through */ 
	/* sparcstation 1 */ 
	case 0x51:		/* sparcstation 1 4/60 */ 
	case 0x54:		/* slc 4/20 */ 
1992/0807    
	default: 
		conf.ss2 = 0; 
		conf.vacsize = 65536; 
1992/0807/sys/src/9/ss/main.c:266,2761992/0808/sys/src/9/ss/main.c:328,340
1992/0807    
		conf.npmeg = 128; 
		conf.ss2cachebug = 0; 
		conf.monitor = 1;		/* BUG */ 
		conf.base0 = 0; 
		conf.base1 = 32*MB; 
1992/0808    
		nmeg = 64; 
1992/0807    
		break; 
1992/0715    
 
1992/0807    
	case 0x55:		/* sparcstation 2 */ 
1992/0808    
	/* sparcstation 2 */ 
	case 0x55:		/* sparcstation 2 4/75 */ 
	case 0x56:		/* ELC 4/25 */ 
	case 0x57:		/* IPX 4/50 */ 
1992/0807    
		conf.ss2 = 1; 
		conf.vacsize = 65536; 
		conf.vaclinesize = 32; 
1992/0807/sys/src/9/ss/main.c:278,2951992/0808/sys/src/9/ss/main.c:342,371
1992/0807    
		conf.npmeg = 256; 
		conf.ss2cachebug = 1; 
		conf.monitor = 0;		/* BUG */ 
		conf.base0 = 0; 
		conf.base1 = 16*MB; 
1992/0808    
		nmeg = 64; 
1992/0807    
		break; 
	} 
 
	bank[0] = banksize(conf.base0, 16*MB); 
	bank[1] = banksize(conf.base1, 16*MB); 
	conf.npage0 = (bank[0]*MB)/BY2PG; 
	conf.npage1 = (bank[1]*MB)/BY2PG; 
1992/0808    
	scanmem(mempres, nmeg); 
	for(i=0; i<nmeg; i++) 
		if(mempres[i]){ 
			v = mempres[i]; 
			for(j=i+1; j<nmeg && mempres[j]>v; j++) 
				v = mempres[j]; 
			npg = ((v+1)-mempres[i])*MB/BY2PG; 
			if(conf.npage0 == 0){ 
				conf.base0 = i*MB; 
				conf.npage0 = npg; 
			}else if(conf.npage1 < npg){ 
				conf.base1 = i*MB; 
				conf.npage1 = npg; 
			} 
			i = v-'0'; 
		} 
1992/0807    
 
	romputcxsegm = *(ulong*)(romvec+260); 
                 
1992/0808    
	bank[0] = conf.npage0*BY2PG/MB; 
	bank[1] = conf.npage1*BY2PG/MB; 
	 
1992/0807    
	conf.npage = conf.npage0+conf.npage1; 
	conf.upages = (conf.npage*70)/100; 
	if(cpuserver){ 
1992/0807/sys/src/9/ss/main.c:297,3021992/0808/sys/src/9/ss/main.c:373,380
1992/0807    
		if(i > (6*MB)/BY2PG) 
			conf.upages +=  i - ((6*MB)/BY2PG); 
	} 
1992/0808    
 
	romputcxsegm = rom->putcxsegm; 
1992/0807    
 
1992/0715    
	ktop = PGROUND((ulong)end); 
	ktop = PADDR(ktop); 


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