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

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

ss/main.c on 1990/1223
1990/1223    
#include	"u.h" 
1992/0321    
#include	"../port/lib.h" 
1990/1223    
#include	"mem.h" 
#include	"dat.h" 
#include	"fns.h" 
#include	"io.h" 
#include	"init.h" 
 
1992/0211    
#include	<libg.h> 
1990/1223    
#include	<gnot.h> 
 
1992/0807    
uchar	*intrreg; 
int	model; 
uchar	idprom[32]; 
ulong	romvec;		/* open boot rom vector */ 
int	cpuserver; 
ulong	romputcxsegm; 
ulong	bank[2]; 
1991/0110    
 
1990/1223    
void 
main(void) 
{ 
	u = 0; 
1992/0325    
	memset(edata, 0, (char*)end-(char*)edata); 
1990/1223    
 
	machinit(); 
1991/1113    
	active.exiting = 0; 
	active.machs = 1; 
1990/1223    
	confinit(); 
1992/0619    
	xinit(); 
1990/1226    
	mmuinit(); 
1992/0807    
	if(conf.monitor) 
		screeninit(); 
1990/1226    
	printinit(); 
	trapinit(); 
1990/1223    
	kmapinit(); 
1991/0604    
	ioinit(); 
1992/0807    
	if(!conf.monitor) 
		sccspecial(2, &printq, &kbdq, 9600); 
	pageinit(); 
1990/1226    
	cacheinit(); 
1991/0110    
	intrinit(); 
1990/1223    
	procinit0(); 
1991/0706    
	initseg(); 
1990/1223    
	chandevreset(); 
	streaminit(); 
1992/0727    
	swapinit(); 
1990/1223    
	userinit(); 
1990/1227    
	clockinit(); 
1990/1223    
	schedinit(); 
} 
 
void 
1991/0110    
intrinit(void) 
{ 
	KMap *k; 
 
1992/0101    
	k = kmappa(INTRREG, PTEIO|PTENOCACHE); 
1991/0110    
	intrreg = (uchar*)k->va; 
} 
 
void 
1991/0926    
systemreset(void) 
1990/1223    
{ 
	delay(100); 
1992/0807    
	putenab(ENABRESET); 
1990/1223    
} 
 
 
void 
machinit(void) 
{ 
	int n; 
 
	n = m->machno; 
	memset(m, 0, sizeof(Mach)); 
	m->machno = n; 
	m->mmask = 1<<m->machno; 
	m->fpstate = FPinit; 
} 
 
void 
1991/0604    
ioinit(void) 
{ 
	KMap *k; 
 
1992/0722    
	/* tell scc driver its addresses */ 
1991/0604    
	k = kmappa(KMDUART, PTEIO|PTENOCACHE); 
1991/1225    
	sccsetup((void*)(k->va), KMFREQ); 
	k = kmappa(EIADUART, PTEIO|PTENOCACHE); 
	sccsetup((void*)(k->va), EIAFREQ); 
1991/0608    
 
	/* scc port 0 is the keyboard */ 
	sccspecial(0, 0, &kbdq, 2400); 
1991/0604    
	kbdq.putc = kbdstate; 
1991/0608    
 
	/* scc port 1 is the mouse */ 
	sccspecial(1, 0, &mouseq, 2400); 
1991/0604    
} 
 
void 
1990/1223    
init0(void) 
{ 
	u->nerrlab = 0; 
	m->proc = u->p; 
	u->p->state = Running; 
	u->p->mach = m; 
	spllo(); 
1992/0722    
 
1992/0807    
	print("bank 0: %dM  1: %dM\n", bank[0], bank[1]); 
1990/1223    
	u->slash = (*devtab[0].attach)(0); 
	u->dot = clone(u->slash, 0); 
1992/0516    
 
	kproc("alarm", alarmkproc, 0); 
	chandevinit(); 
1990/1226    
 
1991/0926    
	if(!waserror()){ 
1991/1102    
		ksetterm("sun %s"); 
1991/0927    
		ksetenv("cputype", "sparc"); 
1991/0926    
		poperror(); 
	} 
 
1991/0711    
	touser(USTKTOP-(1+MAXSYSARG)*BY2WD); 
1990/1223    
} 
 
1992/0727    
FPsave	*initfpp; 
uchar	initfpa[sizeof(FPsave)+7]; 
1990/1223    
 
void 
userinit(void) 
{ 
	Proc *p; 
1991/0706    
	Segment *s; 
1990/1223    
	User *up; 
	KMap *k; 
1992/0727    
	ulong l; 
1990/1223    
 
	p = newproc(); 
	p->pgrp = newpgrp(); 
1992/0623    
	p->egrp = smalloc(sizeof(Egrp)); 
	p->egrp->ref = 1; 
	p->fgrp = smalloc(sizeof(Fgrp)); 
	p->fgrp->ref = 1; 
1991/1112    
	p->procmode = 0640; 
1991/0706    
 
1990/1223    
	strcpy(p->text, "*init*"); 
1991/1109    
	strcpy(p->user, eve); 
1992/0727    
	/* must align initfpp to an ODD word boundary */ 
	l = (ulong)initfpa; 
	l += 3; 
	l &= ~7; 
	l += 4; 
	initfpp = (FPsave*)l; 
	savefpregs(initfpp); 
1990/1223    
	p->fpstate = FPinit; 
 
	/* 
	 * Kernel Stack 
	 */ 
1991/0110    
	p->sched.pc = (((ulong)init0) - 8);	/* 8 because of RETURN in gotolabel */ 
1991/0711    
	p->sched.sp = USERADDR+BY2PG-(1+MAXSYSARG)*BY2WD; 
1992/0802    
	p->sched.sp &= ~7;		/* SP must be 8-byte aligned */ 
1991/1222    
	p->upage = newpage(1, 0, USERADDR|(p->pid&0xFFFF)); 
1990/1223    
 
	/* 
	 * User 
	 */ 
	k = kmap(p->upage); 
	up = (User*)VA(k); 
	up->p = p; 
	kunmap(k); 
 
	/* 
	 * User Stack 
	 */ 
1991/0706    
	s = newseg(SG_STACK, USTKTOP-BY2PG, 1); 
	p->seg[SSEG] = s; 
1990/1223    
 
	/* 
	 * Text 
	 */ 
1991/0706    
	s = newseg(SG_TEXT, UTZERO, 1); 
	p->seg[TSEG] = s; 
	segpage(s, newpage(1, 0, UTZERO)); 
	k = kmap(s->map[0]->pages[0]); 
1991/0318    
	memmove((ulong*)VA(k), initcode, sizeof initcode); 
1990/1223    
	kunmap(k); 
 
	ready(p); 
} 
 
void 
exit(void) 
{ 
	int i; 
 
	u = 0; 
1991/0608    
	spllo(); 
	print("cpu %d exiting\n", m->machno); 
	while(consactive()) 
		for(i=0; i<1000; i++) 
			; 
1990/1223    
	splhi(); 
1991/0926    
	systemreset(); 
1990/1223    
} 
 
1992/0807    
int 
banksize(ulong addr, ulong nbytes) 
{ 
	int i; 
	ulong min, max, t; 
	ulong va, pa; 
	ulong nmeg; 
 
	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; 
	} 
	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; 
	} 
	putw4(va, INVALIDPTE); 
	return (max-min)/MB+1; 
} 
 
1990/1223    
Conf	conf; 
 
void 
confinit(void) 
{ 
	int mul; 
1992/0807    
	ulong i; 
	ulong ktop, va, mbytes; 
1990/1226    
 
1990/1223    
	conf.nmach = 1; 
	if(conf.nmach > MAXMACH) 
		panic("confinit"); 
1992/0619    
 
1992/0807    
	/* map id prom */ 
	va = 1*MB-BY2PG; 
	putw4(va, PPN(EEPROM)|PTEVALID|PTEKERNEL|PTENOCACHE|PTEIO); 
	memmove(idprom, (char*)(va+0x7d8), 32); 
	if(idprom[0]!=1 || (idprom[1]&0xF0)!=0x50) 
		*(ulong*)va = 0; 
	putw4(va, INVALIDPTE); 
1992/0619    
 
1992/0807    
	switch(idprom[1]){ 
	case 0x51:		/* sparcstation 1 */ 
	case 0x54:		/* slc */ 
	default: 
		conf.ss2 = 0; 
		conf.vacsize = 65536; 
		conf.vaclinesize = 16; 
		conf.ncontext = 8; 
		conf.npmeg = 128; 
		conf.ss2cachebug = 0; 
		conf.monitor = 1;		/* BUG */ 
		conf.base0 = 0; 
		conf.base1 = 32*MB; 
		break; 
1992/0715    
 
1992/0807    
	case 0x55:		/* sparcstation 2 */ 
		conf.ss2 = 1; 
		conf.vacsize = 65536; 
		conf.vaclinesize = 32; 
		conf.ncontext = 16; 
		conf.npmeg = 256; 
		conf.ss2cachebug = 1; 
		conf.monitor = 0;		/* BUG */ 
		conf.base0 = 0; 
		conf.base1 = 16*MB; 
		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; 
 
	romputcxsegm = *(ulong*)(romvec+260); 
 
	conf.npage = conf.npage0+conf.npage1; 
	conf.upages = (conf.npage*70)/100; 
	if(cpuserver){ 
		i = conf.npage-conf.upages; 
		if(i > (6*MB)/BY2PG) 
			conf.upages +=  i - ((6*MB)/BY2PG); 
	} 
 
1992/0715    
	ktop = PGROUND((ulong)end); 
	ktop = PADDR(ktop); 
	conf.npage0 -= ktop/BY2PG; 
	conf.base0 += ktop; 
1992/0619    
 
1992/0807    
	mbytes = (conf.npage*BY2PG)>>20; 
	mul = 1 + (mbytes+11)/12; 
	if(mul > 2) 
		mul = 2; 
1992/0620    
 
1990/1223    
	conf.nproc = 50*mul; 
1992/0807    
	if(cpuserver) 
		conf.nswap = conf.npage*2; 
	else 
		conf.nswap = 4096; 
1991/0706    
	conf.nimage = 50; 
1990/1223    
	conf.copymode = 0;		/* copy on write */ 
1991/0926    
	conf.ipif = 8; 
	conf.ip = 64; 
	conf.arp = 32; 
	conf.frag = 32; 
1992/0807    
	if(cpuserver) 
		conf.nproc = 500; 
1990/1231    
} 
 
/* 
 *  set up the lance 
 */ 
void 
lancesetup(Lance *lp) 
{ 
	KMap *k; 
	uchar *cp; 
1992/0711    
	ulong pa, va; 
1991/0108    
	int i, j; 
1990/1231    
 
1992/0101    
	k = kmappa(ETHER, PTEIO|PTENOCACHE); 
1990/1231    
	lp->rdp = (void*)(k->va+0); 
	lp->rap = (void*)(k->va+2); 
1992/0101    
	k = kmappa(EEPROM, PTEIO|PTENOCACHE); 
1990/1231    
	cp = (uchar*)(k->va+0x7da); 
	for(i=0; i<6; i++) 
		lp->ea[i] = *cp++; 
	kunmap(k); 
 
1991/1030    
	lp->lognrrb = 7; 
1991/0109    
	lp->logntrb = 5; 
1990/1231    
	lp->nrrb = 1<<lp->lognrrb; 
	lp->ntrb = 1<<lp->logntrb; 
	lp->sep = 1; 
1991/0109    
	lp->busctl = BSWP | ACON | BCON; 
1990/1231    
 
	/* 
1991/0108    
	 * Allocate area for lance init block and descriptor rings 
1990/1231    
	 */ 
1992/0621    
	pa = (ulong)xspanalloc(BY2PG, BY2PG, 0); 
 
1991/0108    
	/* map at LANCESEGM */ 
1992/0101    
	k = kmappa(pa, PTEMAINMEM|PTENOCACHE); 
1990/1231    
	lp->lanceram = (ushort*)k->va; 
	lp->lm = (Lancemem*)k->va; 
 
	/* 
1991/0108    
	 * Allocate space in host memory for the io buffers. 
	 * Allocate a block and kmap it page by page.  kmap's are initially 
	 * in reverse order so rearrange them. 
1990/1231    
	 */ 
1991/0108    
	i = (lp->nrrb+lp->ntrb)*sizeof(Etherpkt); 
1990/1231    
	i = (i+(BY2PG-1))/BY2PG; 
1992/0622    
	pa = (ulong)xspanalloc(i*BY2PG, BY2PG, 0)&~KZERO; 
1991/0108    
	va = 0; 
	for(j=i-1; j>=0; j--){ 
1992/0101    
		k = kmappa(pa+j*BY2PG, PTEMAINMEM|PTENOCACHE); 
1991/0108    
		if(va){ 
			if(va != k->va+BY2PG) 
				panic("lancesetup va unordered"); 
			va = k->va; 
		} 
	} 
	/* 
	 * k->va is the base of the region 
	 */ 
1990/1231    
	lp->lrp = (Etherpkt*)k->va; 
	lp->rp = (Etherpkt*)k->va; 
1991/0108    
	lp->ltp = lp->lrp+lp->nrrb; 
	lp->tp = lp->rp+lp->nrrb; 
1991/0604    
} 


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