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

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

1991/0712/sys/src/9/pc/main.c:4,2351991/0716/sys/src/9/pc/main.c:4,145 (short | long | prev | next)
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/0712    
extern ulong edata; 
                 
/* 
 *  predeclared 
 */ 
int	fdboot(void); 
int	hdboot(void); 
int	duartboot(void); 
int	parse(char*); 
int	getline(int); 
int	getstr(char*, char*, int, char*, int); 
int	menu(void); 
                 
char	file[2*NAMELEN]; 
char	server[NAMELEN]; 
char	sysname[NAMELEN]; 
char	user[NAMELEN] = "none"; 
char	linebuf[256]; 
1991/0711    
Conf	conf; 
                 
                 
1991/0712    
typedef	struct Booter	Booter; 
struct Booter 
{ 
	char	*name; 
	char	*srv; 
	int	(*func)(void); 
}; 
Booter	booter[] = { 
	{ "fd",		0,	fdboot }, 
	{ "hd",		0,	hdboot }, 
	{ "2400",	0,	duartboot }, 
	{ "1200",	0,	duartboot }, 
}; 
                 
int	bootdev; 
char	*bootchars = "fh21"; 
int	usecache; 
                 
1991/0716    
void 
1991/0702    
main(void) 
1991/0625    
{ 
1991/0712    
	char	*path;			/* file path */ 
	char	element[2*NAMELEN];	/* next element in a file path */ 
	char	def[2*NAMELEN]; 
1991/0711    
                 
	machinit(); 
	confinit(); 
1991/0703    
	screeninit(); 
1991/0716    
	printinit(); 
1991/0711    
	print("%d pages in bank0, %d pages in bank1\n", conf.npage0, conf.npage1); 
	print("edata == %lux, end == %lux\n", &edata, &end); 
1991/0703    
	trapinit(); 
1991/0711    
	mmuinit(); 
	clockinit(); 
1991/0716    
	procinit0(); 
	initseg(); 
	grpinit(); 
	chaninit(); 
1991/0711    
	alarminit(); 
1991/0703    
	kbdinit(); 
1991/0706    
	clockinit(); 
	floppyinit(); 
1991/0705    
	spllo(); 
1991/0716    
	chandevreset(); 
	streaminit(); 
	trapinit(); 
	swapinit(); 
	pageinit(); 
	userinit(); 
1991/0711    
 
1991/0712    
	for(;;){ 
		sprint(def, "%s!%s!/%s", booter[bootdev].name, booter[bootdev].srv, 
			usecache ? "9.cache" : "9.com"); 
		if(getstr("server", element, sizeof element, def, 0)<0) 
			continue; 
		if(parse(element) < 0) 
			continue; 
		if(getstr("user", user, sizeof user, 0, 0)<0) 
			continue; 
		if(*user==0) 
			continue; 
		if((*booter[bootdev].func)() < 0) 
			continue; 
		print("success\n"); 
	} 
1991/0716    
	schedinit(); 
1991/0712    
} 
1991/0706    
 
1991/0712    
/* 
 *  parse the server line.  return 0 if OK, -1 if bullshit 
1991/0716    
 *	BUG -- needs floating point support 
1991/0712    
 */ 
int 
parse(char *line) 
1991/0716    
void 
machinit(void) 
1991/0712    
{ 
	char *def[3]; 
	char **d; 
	char *s; 
	int i; 
1991/0716    
	int n; 
1991/0712    
 
	def[0] = booter[bootdev].name; 
	def[1] = booter[bootdev].srv; 
	def[2] = "/9.com"; 
                 
	d = &def[2]; 
	s = line + strlen(line); 
	while((*d = s) > line) 
		if(*--s == '!'){ 
			if(d-- == def) 
				return -1; 
			*s = '\0'; 
		} 
                 
	for(i = 0; i < strlen(bootchars); i++){ 
		if(strcmp(def[0], booter[i].name)==0){ 
			strcpy(server, def[1]); 
			strcpy(file, def[2]); 
			bootdev = i; 
			return 0; 
		} 
1991/0706    
	} 
1991/0712    
                 
	return -1; 
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/0712    
/* 
 *  read a line from the keyboard. 
 */ 
int 
getline(int quiet) 
1991/0716    
void 
init0(void) 
1991/0712    
{ 
	int c, i=0; 
	long start; 
1991/0716    
	Chan *c; 
1991/0712    
 
	for (start=m->ticks;;) { 
	    	do{ 
			if(TK2SEC(m->ticks - start) > 60) 
				return -2; 
			c = getc(&kbdq); 
		} while(c==-1); 
		if(c == '\r') 
			c = '\n'; /* turn carriage return into newline */ 
		if(c == '\177') 
			c = '\010';	/* turn delete into backspace */ 
		if(!quiet){ 
			if(c == '\033'){ 
				menu(); 
				return -1; 
			} 
			if(c == '\025') 
				screenputc('\n');	/* echo ^U as a newline */ 
			else 
				screenputc(c); 
		} 
		if(c == '\010'){ 
			if(i > 0) 
				i--; /* bs deletes last character */ 
			continue; 
		} 
		/* a newline ends a line */ 
		if (c == '\n') 
			break; 
		/* ^U wipes out the line */ 
		if (c =='\025') 
			return -1; 
		linebuf[i++] = c; 
	} 
	linebuf[i] = 0; 
	return i; 
} 
1991/0716    
	u->nerrlab = 0; 
	m->proc = u->p; 
	u->p->state = Running; 
	u->p->mach = m; 
1991/0712    
 
/* 
 *  prompt for a string from the keyboard.  <cr> returns the default. 
 */ 
int 
getstr(char *prompt, char *buf, int size, char *def, int quiet) 
{ 
	int len; 
	char *cp; 
1991/0716    
	spllo(); 
1991/0712    
 
	for (;;) { 
		if(def) 
			print("%s[default==%s]: ", prompt, def); 
		else 
			print("%s: ", prompt); 
		len = getline(quiet); 
		switch(len){ 
		case -1: 
			/* ^U typed */ 
			continue; 
		case -2: 
			/* timeout */ 
			return -1; 
		default: 
			break; 
		} 
		if(len >= size){ 
			print("line too long\n"); 
			continue; 
		} 
		break; 
	} 
	if(*linebuf==0 && def) 
		strcpy(buf, def); 
	else 
		strcpy(buf, linebuf); 
	return 0; 
} 
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    
 
int 
menu(void) 
{ 
1991/0716    
	chandevinit(); 
 
/*	kickpager();	/* BUG */ 
	touser(); 
1991/0712    
} 
 
1991/0629    
void 
1991/0711    
machinit(void) 
1991/0716    
userinit(void) 
1991/0711    
{ 
	int n; 
1991/0716    
	Proc *p; 
	Segment *s; 
	User *up; 
	KMap *k; 
1991/0711    
 
	n = m->machno; 
	memset(m, 0, sizeof(Mach)); 
	m->machno = n; 
	m->mmask = 1<<m->machno; 
	active.machs = 1; 
1991/0716    
	p = newproc(); 
	p->pgrp = newpgrp(); 
	p->egrp = newegrp(); 
	p->fgrp = newfgrp(); 
 
	strcpy(p->text, "*init*"); 
	p->fpstate = FPinit; 
 
	/* 
	 * Kernel Stack 
	 */ 
	p->sched.pc = (ulong)init0; 
	p->sched.sp = USERADDR + BY2PG - 24; 
	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    
} 
 
void 
1991/0702    
delay(int l) 
1991/0716    
exit(void) 
1991/0625    
{ 
1991/0702    
	int i; 
1991/0625    
 
1991/0702    
	while(--l){ 
1991/0711    
		for(i=0; i < 404; i++) 
1991/0702    
			; 
	} 
1991/0716    
	u = 0; 
	splhi(); 
	print("exiting\n"); 
	for(;;) 
		; 
1991/0625    
} 
 
1991/0716    
Conf	conf; 
 
1991/0711    
void 
confinit(void) 
{ 
1991/0712/sys/src/9/pc/main.c:314,4371991/0716/sys/src/9/pc/main.c:224,271
1991/0711    
	conf.cntrlp = 0; 
} 
 
1991/0702    
int 
sprint(char *s, char *fmt, ...) 
1991/0625    
{ 
1991/0702    
	return doprint(s, s+PRINTSIZE, fmt, (&fmt+1)) - s; 
1991/0625    
} 
1991/0629    
                 
1991/0702    
int 
print(char *fmt, ...) 
1991/0629    
{ 
1991/0702    
	char buf[PRINTSIZE]; 
	int n; 
1991/0629    
                 
1991/0702    
	n = doprint(buf, buf+sizeof(buf), fmt, (&fmt+1)) - buf; 
	screenputs(buf, n); 
	return n; 
1991/0703    
} 
                 
1991/0716    
/* 
 *  set up floating point for a new process 
 *	BUG -- needs floating point support 
 */ 
1991/0703    
void 
panic(char *fmt, ...) 
1991/0716    
procsetup(Proc *p) 
1991/0703    
{ 
	char buf[PRINTSIZE]; 
	int n; 
                 
	screenputs("panic: ", 7); 
	n = doprint(buf, buf+sizeof(buf), fmt, (&fmt+1)) - buf; 
	screenputs(buf, n); 
1991/0706    
	screenputs("\n", 1); 
	spllo(); 
	for(;;) 
		idle(); 
1991/0716    
	p->fpstate = FPinit; 
	m->fpstate = FPinit; 
1991/0705    
} 
 
1991/0711    
int 
kbdputc(IOQ* q, int c) 
{ 
	if(c==0x10) 
		panic("^p"); 
	putc(q, c); 
} 
                 
struct Palloc palloc; 
                 
void* 
ialloc(ulong n, int align) 
{ 
	ulong p; 
                 
	if(palloc.active && n!=0) 
		print("ialloc bad\n"); 
	if(palloc.addr == 0) 
		palloc.addr = ((ulong)&end)&~KZERO; 
	if(align) 
		palloc.addr = PGROUND(palloc.addr); 
                 
	memset((void*)(palloc.addr|KZERO), 0, n); 
	p = palloc.addr; 
	palloc.addr += n; 
	if(align) 
		palloc.addr = PGROUND(palloc.addr); 
                 
	if(palloc.addr >= conf.maxialloc) 
		panic("keep bill joy away"); 
                 
	return (void*)(p|KZERO); 
} 
                 
1991/0712    
/* 
 *  some dummy's so we can use kernel code 
1991/0716    
 * Save the part of the process state. 
 *	BUG -- needs floating point support 
1991/0712    
 */ 
1991/0705    
void 
sched(void) 
1991/0711    
{ } 
                 
void 
ready(Proc*p) 
{ } 
                 
int 
postnote(Proc*p, int x, char* y, int z) 
1991/0716    
procsave(uchar *state, int len) 
1991/0705    
{ 
1991/0711    
	panic("postnote"); 
1991/0712    
} 
 
                 
/* 
 *  boot from hard disk 
1991/0716    
 *  Restore what procsave() saves 
 *	BUG -- needs floating point support 
1991/0712    
 */ 
int 
hdboot(void) 
1991/0716    
void 
procrestore(Proc *p, uchar *state) 
1991/0712    
{ 
	print("hdboot unimplemented\n"); 
	return -1; 
} 
 
/* 
 *  boot from the duart 
 */ 
int 
duartboot(void) 
1991/0716    
void 
firmware(void) 
1991/0712    
{ 
	print("duartboot unimplemented\n"); 
	return -1; 
1991/0716    
	panic("firmware"); 
1991/0712    
} 
 
#include "dosfs.h" 
 
/* 
 *  boot from the floppy 
 */ 
int 
fdboot(void) 
1991/0716    
void 
buzz(int f, int d) 
1991/0712    
{ 
	Dosbpb b; 
	extern int dosboot(Dosbpb*); 
1991/0716    
} 
1991/0712    
 
	print("booting from floppy 0\n"); 
	b.seek = floppyseek; 
	b.read = floppyread; 
	b.dev = 0; 
	return dosboot(&b); 
1991/0716    
void 
lights(int val) 
{ 
1991/0702    
} 


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