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

1991/0720/pc/main.c (diff list | history)

1991/0720/sys/src/9/pc/main.c:1,2751991/0723/sys/src/9/pc/main.c:1,311 (short | long | prev | next)
1991/0702    
#include	"u.h" 
#include	"lib.h" 
1991/0706    
#include	"mem.h" 
1991/0702    
#include	"dat.h" 
#include	"fns.h" 
1991/0706    
#include	"io.h" 
1991/0716    
#include	"ureg.h" 
#include	"init.h" 
1991/0629    
 
1991/0716    
char	user[NAMELEN] = "bootes"; 
extern long edata; 
1991/0711    
 
1991/0716    
void 
1991/0702    
main(void) 
1991/0625    
{ 
1991/0719    
	a20enable(); 
1991/0711    
	machinit(); 
	confinit(); 
1991/0703    
	screeninit(); 
1991/0716    
	printinit(); 
1991/0711    
	mmuinit(); 
1991/0723    
	vgainit(); 
1991/0718    
	trapinit(); 
1991/0719    
	kbdinit(); 
1991/0718    
	clockinit(); 
	faultinit(); 
1991/0716    
	procinit0(); 
	initseg(); 
	grpinit(); 
	chaninit(); 
1991/0711    
	alarminit(); 
1991/0716    
	chandevreset(); 
	streaminit(); 
	swapinit(); 
	pageinit(); 
	userinit(); 
1991/0711    
 
1991/0716    
	schedinit(); 
1991/0712    
} 
1991/0706    
 
1991/0712    
/* 
1991/0716    
 *	BUG -- needs floating point support 
1991/0712    
 */ 
1991/0716    
void 
machinit(void) 
1991/0712    
{ 
1991/0716    
	int n; 
1991/0712    
 
1991/0716    
	n = m->machno; 
	memset(m, 0, sizeof(Mach)); 
	m->machno = n; 
	m->mmask = 1<<m->machno; 
	m->fpstate = FPinit; 
	active.machs = 1; 
1991/0625    
} 
 
1991/0719    
ulong garbage; 
1991/0718    
 
1991/0716    
void 
init0(void) 
1991/0712    
{ 
1991/0716    
	Chan *c; 
1991/0712    
 
1991/0716    
	u->nerrlab = 0; 
	m->proc = u->p; 
	u->p->state = Running; 
	u->p->mach = m; 
1991/0712    
 
1991/0720    
print("go low\n"); 
	spllo(); 
 
1991/0716    
	/* 
	 * These are o.k. because rootinit is null. 
	 * Then early kproc's will have a root and dot. 
	 */ 
	u->slash = (*devtab[0].attach)(0); 
	u->dot = clone(u->slash, 0); 
1991/0712    
 
1991/0716    
	chandevinit(); 
 
1991/0720    
print("going to user\n"); 
delay(1000); 
1991/0718    
 
1991/0716    
	touser(); 
1991/0712    
} 
 
1991/0629    
void 
1991/0716    
userinit(void) 
1991/0711    
{ 
1991/0716    
	Proc *p; 
	Segment *s; 
	User *up; 
	KMap *k; 
1991/0711    
 
1991/0716    
	p = newproc(); 
	p->pgrp = newpgrp(); 
	p->egrp = newegrp(); 
	p->fgrp = newfgrp(); 
 
	strcpy(p->text, "*init*"); 
	p->fpstate = FPinit; 
 
	/* 
	 * Kernel Stack 
1991/0717    
	 * 
1991/0719    
	 * N.B. The -12 for the stack pointer is important. 
	 *	4 bytes for gotolabel's return PC 
1991/0716    
	 */ 
	p->sched.pc = (ulong)init0; 
1991/0720    
	p->sched.sp = USERADDR + BY2PG - 4; 
1991/0716    
	p->upage = newpage(1, 0, USERADDR|(p->pid&0xFFFF)); 
 
	/* 
	 * User 
	 */ 
	k = kmap(p->upage); 
	up = (User*)VA(k); 
	up->p = p; 
	kunmap(k); 
 
	/* 
	 * User Stack 
	 */ 
	s = newseg(SG_STACK, USTKTOP-BY2PG, 1); 
	p->seg[SSEG] = s; 
 
	/* 
	 * Text 
	 */ 
	s = newseg(SG_TEXT, UTZERO, 1); 
	p->seg[TSEG] = s; 
	segpage(s, newpage(1, 0, UTZERO)); 
	k = kmap(s->map[0]->pages[0]); 
	memmove((ulong*)VA(k), initcode, sizeof initcode); 
	kunmap(k); 
 
	ready(p); 
1991/0711    
} 
 
1991/0716    
Conf	conf; 
 
1991/0711    
void 
confinit(void) 
{ 
	long x, i, j, *l; 
	int mul; 
 
	/* 
	 *  size memory 
	 */ 
	x = 0x12345678; 
	for(i=1; i<16; i++){ 
		/* 
		 *  write the word 
		 */ 
		l = (long*)(KZERO|(i*1024L*1024L)); 
		*l = x; 
		/* 
		 *  take care of wraps 
		 */ 
		for(j = 0; j < i; j++){ 
			l = (long*)(KZERO|(j*1024L*1024L)); 
			*l = 0; 
		} 
		/* 
		 *  check 
		 */ 
		l = (long*)(KZERO|(i*1024L*1024L)); 
		if(*l != x) 
			break; 
		x += 0x3141526; 
	} 
 
	/* 
	 *  the first 640k is the standard useful memory 
	 */ 
	conf.npage0 = 640/4; 
	conf.base0 = 0; 
 
	/* 
	 *  the last 128k belongs to the roms 
	 */ 
	conf.npage1 = (i)*1024/4; 
1991/0719    
	conf.base1 = 1024*1024; 
1991/0711    
 
	conf.npage = conf.npage0 + conf.npage1; 
1991/0717    
	conf.maxialloc = (conf.npage0*BY2PG-PGROUND((ulong)&end)); 
1991/0711    
 
	mul = 1; 
1991/0719    
	conf.nproc = 20 + 20*mul; 
1991/0711    
	conf.npgrp = conf.nproc/2; 
	conf.nseg = conf.nproc*3; 
	conf.npagetab = (conf.nseg*14)/10; 
	conf.nswap = conf.nproc*80; 
	conf.nimage = 50; 
	conf.nalarm = 1000; 
	conf.nchan = 4*conf.nproc; 
	conf.nenv = 4*conf.nproc; 
	conf.nenvchar = 8000*mul; 
	conf.npgenv = 200*mul; 
	conf.nmtab = 50*mul; 
	conf.nmount = 80*mul; 
	conf.nmntdev = 15*mul; 
	conf.nmntbuf = conf.nmntdev+3; 
	conf.nmnthdr = 2*conf.nmntdev; 
	conf.nsrv = 16*mul;			/* was 32 */ 
	conf.nbitmap = 512*mul; 
	conf.nbitbyte = conf.nbitmap*1024*screenbits(); 
	conf.nfont = 10*mul; 
	conf.nnoifc = 1; 
	conf.nnoconv = 32; 
	conf.nurp = 32; 
	conf.nasync = 1; 
	conf.nstream = (conf.nproc*3)/2; 
	conf.nqueue = 5 * conf.nstream; 
	conf.nblock = 24 * conf.nstream; 
	conf.npipe = conf.nstream/2; 
	conf.copymode = 0;			/* copy on write */ 
	conf.ipif = 8; 
	conf.ip = 64; 
	conf.arp = 32; 
	conf.frag = 32; 
	conf.cntrlp = 0; 
} 
 
1991/0716    
/* 
 *  set up floating point for a new process 
 *	BUG -- needs floating point support 
 */ 
1991/0703    
void 
1991/0716    
procsetup(Proc *p) 
1991/0703    
{ 
1991/0716    
	p->fpstate = FPinit; 
	m->fpstate = FPinit; 
1991/0705    
} 
 
1991/0712    
/* 
1991/0716    
 * Save the part of the process state. 
 *	BUG -- needs floating point support 
1991/0712    
 */ 
1991/0705    
void 
1991/0716    
procsave(uchar *state, int len) 
1991/0705    
{ 
1991/0712    
} 
 
/* 
1991/0716    
 *  Restore what procsave() saves 
 *	BUG -- needs floating point support 
1991/0712    
 */ 
1991/0716    
void 
procrestore(Proc *p, uchar *state) 
1991/0712    
{ 
} 
 
1991/0716    
void 
firmware(void) 
1991/0712    
{ 
1991/0716    
	panic("firmware"); 
1991/0712    
} 
 
 
1991/0716    
void 
buzz(int f, int d) 
1991/0712    
{ 
1991/0716    
} 
1991/0712    
 
1991/0716    
void 
lights(int val) 
{ 
1991/0702    
} 
1991/0717    
 
int 
mouseputc(IOQ *q, int c) 
{ 
	return c; 
1991/0723    
} 
 
/* 
 *  headland hip set for the safari. 
 *   
 *  serious magic!!! 
 */ 
 
enum 
{ 
	Head=		0x92,		/* control port */ 
	 Reset=		(1<<0),		/* reset the 386 */ 
	 A20ena=	(1<<1),		/* enable address line 20 */ 
}; 
 
/* 
 *  enable address bit 20 
 */ 
void 
a20enable(void) 
{ 
	outb(Head, A20ena); 
} 
 
/* 
 *  reset the chip 
 */ 
void 
exit(void) 
{ 
	int i; 
 
	u = 0; 
	print("exiting\n"); 
	outb(Head, Reset); 
1991/0717    
} 


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