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

1990/0504/power/bboot.c (diff list | history)

1990/0424/sys/src/9/power/bboot.c:3,111990/0427/sys/src/9/power/bboot.c:3,25 (short | long)
1990/0424    
 
#include <fcall.h> 
 
void	error(char *); 
1990/0427    
#define DEFFILE "/mips/9" 
#define DEFSYS "bitbootes" 
 
Fcall	hdr; 
char	*sys; 
char	*scmd; 
char	*bootfile; 
 
char	sbuf[2*NAMELEN]; 
char	bbuf[5*NAMELEN]; 
1990/0424    
char	buf[4*1024]; 
 
1990/0427    
int fd; 
int cfd; 
int efd; 
 
 
1990/0424    
typedef 
struct address { 
	char *name; 
1990/0424/sys/src/9/power/bboot.c:22,761990/0427/sys/src/9/power/bboot.c:36,41
1990/0424    
	{ 0 } 
}; 
 
#define DEFFILE "/sys/src/9/mips/9" 
                 
char * 
lookup(char *arg) 
{ 
	Address *a; 
                 
	if(strcmp(arg, "?")==0 || strcmp(arg, "help")==0){ 
		for(a = addr; a->name; a++) 
			print("%s\n", a->name); 
		return 0; 
	} 
	for(a = addr; a->name; a++){ 
		if(strcmp(a->name, arg) == 0) 
			return a->cmd; 
	} 
	return 0; 
} 
                 
/* 
 *  read a segment into memory 
 */ 
int 
readseg(int in, int out, long inoff, long outoff, int len) 
{ 
	long	n; 
                 
	if(seek(in, inoff, 0) < 0){ 
		error("seeking bootfile"); 
		return -1; 
	} 
	if(seek(out, outoff, 0) != outoff){ 
		error("seeking #b/mem"); 
		return -1; 
	} 
	for(; len > 0; len -= n){ 
		print("."); 
		if((n = read(in, buf, sizeof buf)) <= 0){ 
			error("reading bootfile"); 
			return -1; 
		} 
		if(write(out, buf, n) != n){ 
			error("writing #b/mem"); 
			return -1; 
		} 
	} 
	return 0; 
} 
                 
struct a_out_h { 
	ulong	magic;			/* magic and sections */ 
	ulong	timestamp;		/* time and date */ 
1990/0424/sys/src/9/power/bboot.c:95,1911990/0427/sys/src/9/power/bboot.c:60,156
1990/0424    
} a_out; 
 
/* 
 *  read the kernel into memory and jump to it 
1990/0427    
 *  predeclared 
1990/0424    
 */ 
int 
readkernel(int fd) 
1990/0427    
char	*lookup(char *); 
int	readseg(int, int, long, long, int); 
int	readkernel(int); 
int	outin(char *, char *, char *, int); 
void	prerror(char *); 
void	error(char *); 
void	boot(int); 
 
/* 
 *  usage: 9b [-a] [server] [file] 
 * 
 *  default server is `bitbootes', default file is `/sys/src/9/mips/9' 
 */ 
main(int argc, char *argv[]) 
1990/0424    
{ 
	int n; 
	int bfd; 
1990/0427    
	int i; 
1990/0424    
 
	bfd = open("#b/mem", OWRITE); 
	if(bfd < 0) 
		error("can't open #b/mem"); 
1990/0427    
	open("#c/cons", 0); 
	open("#c/cons", 1); 
	open("#c/cons", 1); 
1990/0424    
 
	n = read(fd, &a_out, sizeof(a_out)); 
	if(n <= 0) 
		error("can't read boot file"); 
1990/0427    
	argv++; 
	argc--;	 
	while(argc > 0){ 
		if(argv[0][0] == '-'){ 
			argc--; 
			argv++; 
		} else 
			break; 
	} 
1990/0424    
 
	print("\n%d", a_out.text); 
	if(readseg(fd, bfd, 20*4, a_out.textva, a_out.text)<0) 
		error("can't read boot file"); 
	print("+%d", a_out.data); 
	if(readseg(fd, bfd, 20*4 + a_out.text, a_out.textva + a_out.text, a_out.data)<0) 
		error("can't read boot file"); 
	print("+%d\n", a_out.bss); 
1990/0427    
	sys = DEFSYS; 
	bootfile = DEFFILE; 
	switch(argc){ 
	case 1: 
		bootfile = argv[0]; 
		break; 
	case 2: 
		bootfile = argv[0]; 
		sys = argv[1]; 
		break; 
	} 
1990/0424    
 
	close(bfd); 
	bfd = open("#b/boot", OWRITE); 
	if(bfd < 0) 
		error("can't open #b/boot"); 
	                 
	print("entry: %ux\n", a_out.entryva); 
	sleep(1000); 
	if(write(bfd, &a_out.entryva, sizeof a_out.entryva) != sizeof a_out.entryva) 
		error("can't start kernel"); 
                 
	return 0; 
1990/0427    
	boot(0); 
	for(;;){ 
		if(fd > 0) 
			close(fd); 
		if(cfd > 0) 
			close(cfd); 
		if(efd > 0) 
			close(efd); 
		fd = cfd = efd = 0; 
		boot(1); 
	} 
1990/0424    
} 
 
Fcall	hdr; 
char	srv[100]; 
                 
main(int argc, char *argv[]) 
1990/0427    
void 
boot(int ask) 
1990/0424    
{ 
	int cfd, fd, n, fu, f; 
	char buf[NAMELEN]; 
	char bootfile[256]; 
	char *scmd; 
1990/0427    
	int n; 
1990/0424    
 
	open("#c/cons", 0); 
	open("#c/cons", 1); 
	open("#c/cons", 1); 
1990/0427    
	if(ask){ 
		outin("bootfile", bootfile, bbuf, sizeof(bbuf)); 
		bootfile = bbuf; 
	} 
1990/0424    
 
	/* 
	 *  get server 
	 */ 
	do{ 
		do{ 
			print("server[%s]: ", addr[0].name); 
			n = read(0, srv, sizeof srv); 
		}while(n==0); 
		if(n < 0) 
			error("can't read #c/cons; please reboot"); 
		if(n == 1) 
			strcpy(srv, addr[0].name); 
		else 
			srv[n-1] = 0; 
		scmd = lookup(srv); 
	}while(scmd == 0); 
1990/0427    
	if(!ask) 
		scmd = lookup(sys); 
	else { 
		outin("server", sys, sbuf, sizeof(sbuf)); 
		sys = sbuf; 
		scmd = lookup(sys); 
	} 
	if(scmd == 0){ 
		fprint(2, "boot: %s unknown\n", sys); 
		return; 
	} 
1990/0424    
 
1990/0427    
	print("Booting %s from server %s\n", bootfile, sys); 
 
1990/0424    
	/* 
	 *  get file.  if the user typed cr to the server question, skip 
	 *  the file question and just use the default. 
1990/0427    
	 *  for the bit, we skip all the ether goo 
1990/0424    
	 */ 
	if(n != 1){ 
		do{ 
			print("bootfile[%s]: ", DEFFILE); 
			n = read(0, buf, sizeof buf); 
		}while(n==0); 
		if(n < 0) 
			error("can't read #c/cons; please reboot"); 
		if(n == 1) 
			strcpy(buf, DEFFILE); 
		else 
			buf[n-1] = 0; 
		strcpy(bootfile, buf); 
	}else 
		strcpy(bootfile, DEFFILE); 
                 
	if(strcmp(scmd, "bitconnect") == 0){ 
		fd = open("#3/bit3", ORDWR); 
		if(fd < 0) 
			error("opening #3/bit3"); 
1990/0427    
		if(fd < 0){ 
			prerror("opening #3/bit3"); 
			return; 
		} 
1990/0424    
		goto Mesg; 
	} 
 
1990/0424/sys/src/9/power/bboot.c:194,2691990/0427/sys/src/9/power/bboot.c:159,282
1990/0424    
	 *  and push the nonet ethernet multiplexor onto it. 
	 */ 
	cfd = open("#l/1/ctl", 2); 
	if(cfd < 0) 
		error("opening #l/1/ctl"); 
	if(write(cfd, "connect 0x900", sizeof("connect 0x900")-1)<0) 
		error("connect 0x900"); 
	if(write(cfd, "push noether", sizeof("push noether")-1)<0) 
		error("push noether"); 
1990/0427    
	if(cfd < 0){ 
		prerror("opening #l/1/ctl"); 
		return; 
	} 
	if(write(cfd, "connect 0x900", sizeof("connect 0x900")-1)<0){ 
		prerror("connect 0x900"); 
		return; 
	} 
	if(write(cfd, "push noether", sizeof("push noether")-1)<0){ 
		prerror("push noether"); 
		return; 
	} 
1990/0424    
 
	/* 
	 *  grab a nonet channel and call up the ross file server 
	 */ 
	fd = open("#n/1/data", 2); 
	if(fd < 0) 
		error("opening #n/1/data"); 
1990/0427    
	if(fd < 0) { 
		prerror("opening #n/1/data"); 
		return; 
	} 
1990/0424    
	cfd = open("#n/1/ctl", 2); 
	if(cfd < 0) 
		error("opening #n/1/ctl"); 
	if(write(cfd, scmd, strlen(scmd))<0) 
		error(scmd); 
1990/0427    
	if(cfd < 0){ 
		prerror("opening #n/1/ctl"); 
		return; 
	} 
	if(write(cfd, scmd, strlen(scmd))<0){ 
		prerror(scmd); 
		return; 
	} 
1990/0424    
 
    Mesg: 
	print("nop..."); 
	hdr.type = Tnop; 
	n = convS2M(&hdr, buf); 
	if(write(fd, buf, n) != n) 
		error("write nop"); 
1990/0427    
	if(write(fd, buf, n) != n){ 
		prerror("write nop"); 
		return; 
	} 
1990/0424    
	n = read(fd, buf, sizeof buf); 
	if(n <= 0) 
		error("read nop"); 
1990/0427    
	if(n <= 0){ 
		prerror("read nop"); 
		return; 
	} 
1990/0424    
	if(convM2S(buf, &hdr, n) == 0) { 
		print("n = %d; buf = %.2x %.2x %.2x %.2x\n", 
			n, buf[0], buf[1], buf[2], buf[3]); 
		error("format nop"); 
1990/0427    
		prerror("format nop"); 
		return; 
1990/0424    
	} 
	if(hdr.type != Rnop) 
		error("not Rnop"); 
1990/0427    
	if(hdr.type != Rnop){ 
		prerror("not Rnop"); 
		return; 
	} 
1990/0424    
 
	print("session..."); 
	hdr.type = Tsession; 
	hdr.lang = 'v'; 
	n = convS2M(&hdr, buf); 
	if(write(fd, buf, n) != n) 
		error("write session"); 
1990/0427    
	if(write(fd, buf, n) != n){ 
		prerror("write session"); 
		return; 
	} 
1990/0424    
	n = read(fd, buf, sizeof buf); 
	if(n <= 0) 
		error("read session"); 
	if(convM2S(buf, &hdr, n) == 0) 
		error("format session"); 
	if(hdr.type != Rsession) 
		error("not Rsession"); 
1990/0427    
	if(n <= 0){ 
		prerror("read session"); 
		return; 
	} 
	if(convM2S(buf, &hdr, n) == 0){ 
		prerror("format session"); 
		return; 
	} 
	if(hdr.type != Rsession){ 
		prerror("not Rsession"); 
		return; 
	} 
1990/0424    
	if(hdr.err){ 
		print("error %d;", hdr.err); 
		error("remote error"); 
1990/0427    
		prerror("remote error"); 
		return; 
1990/0424    
	} 
 
	print("mount..."); 
	if(bind("/", "/", MREPL) < 0) 
		error("bind"); 
	if(mount(fd, "/", MAFTER|MCREATE, "") < 0) 
		error("mount"); 
1990/0427    
	if(bind("/", "/", MREPL) < 0){ 
		prerror("bind"); 
		return; 
	} 
	if(mount(fd, "/", MAFTER|MCREATE, "") < 0){ 
		prerror("mount"); 
		return; 
	} 
1990/0424    
	close(fd); 
 
	print("open file..."); 
	fd = open(bootfile, OREAD); 
	if(fd < 0) 
		error("opening bootfile"); 
1990/0427    
	while((fd = open(bootfile, OREAD)) < 0){ 
		outin("bootfile", DEFFILE, bbuf, sizeof(bbuf)); 
		bootfile = bbuf; 
	} 
1990/0424    
	readkernel(fd); 
	error("couldn't read kernel"); 
1990/0427    
	prerror("couldn't read kernel"); 
1990/0424    
} 
 
1990/0427    
/* 
 *  print error 
 */ 
1990/0424    
void 
1990/0427    
prerror(char *s) 
{ 
	char buf[64]; 
 
	errstr(0, buf); 
	fprint(2, "boot: %s: %s\n", s, buf); 
} 
 
/* 
 *  print error and exit 
 */ 
void 
1990/0424    
error(char *s) 
{ 
	char buf[64]; 
1990/0424/sys/src/9/power/bboot.c:271,2741990/0427/sys/src/9/power/bboot.c:284,416
1990/0424    
	errstr(0, buf); 
	fprint(2, "boot: %s: %s\n", s, buf); 
	exits(0); 
1990/0427    
} 
 
/* 
 *  lookup the address for a system 
 */ 
char * 
lookup(char *arg) 
{ 
	Address *a; 
 
	if(strcmp(arg, "?")==0 || strcmp(arg, "help")==0){ 
		for(a = addr; a->name; a++) 
			print("%s\n", a->name); 
		return 0; 
	} 
	for(a = addr; a->name; a++){ 
		if(strcmp(a->name, arg) == 0) 
			return a->cmd; 
	} 
	return 0; 
} 
 
/* 
 *  read a segment into memory 
 */ 
int 
readseg(int in, int out, long inoff, long outoff, int len) 
{ 
	long	n, i; 
	ulong sum = 0; 
 
	if(seek(in, inoff, 0) < 0){ 
		prerror("seeking bootfile"); 
		return -1; 
	} 
	if(seek(out, outoff, 0) != outoff){ 
		prerror("seeking #b/mem"); 
		return -1; 
	} 
	for(; len > 0; len -= n){ 
		if((n = read(in, buf, sizeof buf)) <= 0){ 
			prerror("reading bootfile"); 
			return -1; 
		} 
		for(i = 0; i < n; i++) 
			sum += buf[i]; 
		if(sum & 0xf0000000) 
			sum = (sum & 0xfffffff) + ((sum & 0xf0000000) >> 28); 
		if(write(out, buf, n) != n){ 
			prerror("writing #b/mem"); 
			return -1; 
		} 
	} 
	print("[%ux]", sum); 
	return 0; 
} 
 
/* 
 *  read the kernel into memory and jump to it 
 */ 
int 
readkernel(int fd) 
{ 
	int n; 
	int bfd; 
 
	bfd = open("#b/mem", OWRITE); 
	if(bfd < 0){ 
		prerror("can't open #b/mem"); 
		return; 
	} 
 
	n = read(fd, &a_out, sizeof(a_out)); 
	if(n <= 0){ 
		prerror("can't read boot file"); 
		close(bfd); 
		return; 
	} 
 
	print("\n%d", a_out.text); 
	if(readseg(fd, bfd, 20*4, a_out.textva, a_out.text)<0){ 
		prerror("can't read boot file"); 
		close(bfd); 
		return; 
	} 
	print("+%d", a_out.data); 
	if(readseg(fd, bfd, 20*4 + a_out.text, a_out.textva + a_out.text, a_out.data)<0){ 
		prerror("can't read boot file"); 
		close(bfd); 
		return; 
	} 
	print("+%d\n", a_out.bss); 
 
	close(bfd); 
	bfd = open("#b/boot", OWRITE); 
	if(bfd < 0){ 
		prerror("can't open #b/boot"); 
		return; 
	} 
	 
	print("entry: %ux\n", a_out.entryva); 
	sleep(1000); 
	if(write(bfd, &a_out.entryva, sizeof a_out.entryva) != sizeof a_out.entryva){ 
		prerror("can't start kernel"); 
		close(bfd); 
	} 
 
	return; 
} 
 
/* 
 *  prompt and get input 
 */ 
int 
outin(char *prompt, char *def, char *buf, int len) 
{ 
	int n; 
 
	do{ 
		print("%s[%s]: ", prompt, def); 
		n = read(0, buf, len); 
	}while(n==0); 
	if(n < 0) 
		error("can't read #c/cons; please reboot"); 
	if(n == 1) 
		strcpy(buf, def); 
	else 
		buf[n-1] = 0; 
	return n; 
1990/0424    
} 
1990/0427/sys/src/9/power/bboot.c:313,3191990/0430/sys/src/9/power/bboot.c:313,318 (short | long)
1990/0427    
readseg(int in, int out, long inoff, long outoff, int len) 
{ 
	long	n, i; 
	ulong sum = 0; 
 
	if(seek(in, inoff, 0) < 0){ 
		prerror("seeking bootfile"); 
1990/0427/sys/src/9/power/bboot.c:328,3431990/0430/sys/src/9/power/bboot.c:327,337
1990/0427    
			prerror("reading bootfile"); 
			return -1; 
		} 
		for(i = 0; i < n; i++) 
			sum += buf[i]; 
		if(sum & 0xf0000000) 
			sum = (sum & 0xfffffff) + ((sum & 0xf0000000) >> 28); 
		if(write(out, buf, n) != n){ 
			prerror("writing #b/mem"); 
			return -1; 
		} 
	} 
	print("[%ux]", sum); 
	return 0; 
} 
 
1990/0430/sys/src/9/power/bboot.c:19,251990/0504/sys/src/9/power/bboot.c:19,24 (short | long)
1990/0427    
int cfd; 
int efd; 
 
                 
1990/0424    
typedef 
struct address { 
	char *name; 
1990/0430/sys/src/9/power/bboot.c:65,741990/0504/sys/src/9/power/bboot.c:64,74
1990/0427    
char	*lookup(char *); 
int	readseg(int, int, long, long, int); 
int	readkernel(int); 
1990/0504    
int	readconf(int); 
1990/0427    
int	outin(char *, char *, char *, int); 
void	prerror(char *); 
void	error(char *); 
void	boot(int); 
1990/0504    
void	boot(int, char *); 
1990/0427    
 
/* 
 *  usage: 9b [-a] [server] [file] 
1990/0430/sys/src/9/power/bboot.c:78,881990/0504/sys/src/9/power/bboot.c:78,91
1990/0427    
main(int argc, char *argv[]) 
1990/0424    
{ 
1990/0427    
	int i; 
1990/0504    
	char *sysname; 
1990/0424    
 
1990/0427    
	open("#c/cons", 0); 
	open("#c/cons", 1); 
	open("#c/cons", 1); 
1990/0424    
 
1990/0504    
	sysname = argv[0]; 
 
1990/0427    
	argv++; 
	argc--;	 
	while(argc > 0){ 
1990/0430/sys/src/9/power/bboot.c:105,1111990/0504/sys/src/9/power/bboot.c:108,114
1990/0427    
		break; 
	} 
1990/0424    
 
1990/0427    
	boot(0); 
1990/0504    
	boot(0, sysname); 
1990/0427    
	for(;;){ 
		if(fd > 0) 
			close(fd); 
1990/0430/sys/src/9/power/bboot.c:114,1271990/0504/sys/src/9/power/bboot.c:117,131
1990/0427    
		if(efd > 0) 
			close(efd); 
		fd = cfd = efd = 0; 
		boot(1); 
1990/0504    
		boot(1, sysname); 
1990/0427    
	} 
1990/0424    
} 
 
1990/0427    
void 
boot(int ask) 
1990/0504    
boot(int ask, char *addr) 
1990/0424    
{ 
1990/0427    
	int n; 
1990/0504    
	char conffile[128]; 
1990/0424    
 
1990/0427    
	if(ask){ 
		outin("bootfile", bootfile, bbuf, sizeof(bbuf)); 
1990/0430/sys/src/9/power/bboot.c:140,1461990/0504/sys/src/9/power/bboot.c:144,149
1990/0427    
		return; 
	} 
1990/0424    
 
1990/0427    
	print("Booting %s from server %s\n", bootfile, sys); 
 
1990/0424    
	/* 
1990/0427    
	 *  for the bit, we skip all the ether goo 
1990/0430/sys/src/9/power/bboot.c:252,2601990/0504/sys/src/9/power/bboot.c:255,272
1990/0427    
	} 
1990/0424    
	close(fd); 
 
	print("open file..."); 
1990/0504    
	sprint(conffile, "/mips/conf/%s", addr); 
	print("%s...", conffile); 
	while((fd = open(conffile, OREAD)) < 0){ 
		outin("conffile", conffile, conffile, sizeof(conffile)); 
	} 
	if(readconf(fd) < 0) 
		prerror("readconf"); 
	close(fd); 
 
	print("%s...", bootfile); 
1990/0427    
	while((fd = open(bootfile, OREAD)) < 0){ 
		outin("bootfile", DEFFILE, bbuf, sizeof(bbuf)); 
1990/0504    
		outin("bootfile", bootfile, bbuf, sizeof(bbuf)); 
1990/0427    
		bootfile = bbuf; 
	} 
1990/0424    
	readkernel(fd); 
1990/0430/sys/src/9/power/bboot.c:336,3411990/0504/sys/src/9/power/bboot.c:348,397
1990/0427    
} 
 
/* 
1990/0504    
 *  set a configuration value 
 */ 
 
 
/* 
 *  read the configuration 
 */ 
int 
readconf(int fd) 
{ 
	int bfd; 
	int n; 
	long x; 
 
	/* 
 	 *  read the config file 
	 */ 
	n = read(fd, buf, sizeof(buf)-1); 
	if(n <= 0) 
		return -1; 
	buf[n] = 0; 
 
	/* 
	 *  write into 4 meg - 4k 
	 */ 
	bfd = open("#b/mem", OWRITE); 
	if(bfd < 0){ 
		prerror("can't open #b/mem"); 
		return; 
	} 
	x = 0x80000000 | 4*1024*1024 - 4*1024; 
	if(seek(bfd, x, 0) != x){ 
		close(bfd); 
		return -1; 
	} 
	if(write(bfd, buf, n+1) != n+1){ 
		close(bfd); 
		return -1; 
	} 
 
	close(bfd); 
	return 0; 
} 
/* 
1990/0427    
 *  read the kernel into memory and jump to it 
 */ 
int 
1990/0430/sys/src/9/power/bboot.c:369,3751990/0504/sys/src/9/power/bboot.c:425,431
1990/0427    
		close(bfd); 
		return; 
	} 
	print("+%d\n", a_out.bss); 
1990/0504    
	print("+%d", a_out.bss); 
1990/0427    
 
	close(bfd); 
	bfd = open("#b/boot", OWRITE); 
1990/0430/sys/src/9/power/bboot.c:378,3841990/0504/sys/src/9/power/bboot.c:434,440
1990/0427    
		return; 
	} 
	 
	print("entry: %ux\n", a_out.entryva); 
1990/0504    
	print(" entry: 0x%ux\n", a_out.entryva); 
1990/0427    
	sleep(1000); 
	if(write(bfd, &a_out.entryva, sizeof a_out.entryva) != sizeof a_out.entryva){ 
		prerror("can't start kernel"); 
1990/0504/sys/src/9/power/bboot.c:23,371990/0911/sys/src/9/power/bboot.c:23,38 (short | long)
1990/0424    
struct address { 
	char *name; 
	char *cmd; 
1990/0911    
	char *srvname; 
1990/0424    
} Address; 
 
Address addr[] = { 
	{ "bitbootes", "bitconnect" }, 
	{ "ross", "connect 020701005eff" }, 
	{ "bootes", "connect 080069020205" }, 
	{ "helix", "connect 080069020427" }, 
	{ "spindle", "connect 0800690202df" }, 
	{ "r70", "connect 08002b04265d" }, 
1990/0911    
	{ "bitbootes", "bitconnect", "bit!bootes" }, 
	{ "ross", "connect 020701005eff", "nonet!ross" }, 
	{ "bootes", "connect 080069020205", "nonet!bootes" }, 
	{ "helix", "connect 080069020427", "nonet!helix" }, 
	{ "spindle", "connect 0800690202df", "nonet!spindle" }, 
	{ "r70", "connect 08002b04265d", "nonet!r70" }, 
1990/0424    
	{ 0 } 
}; 
 
1990/0504/sys/src/9/power/bboot.c:61,671990/0911/sys/src/9/power/bboot.c:62,68
1990/0424    
/* 
1990/0427    
 *  predeclared 
1990/0424    
 */ 
1990/0427    
char	*lookup(char *); 
1990/0911    
Address* lookup(char *); 
1990/0427    
int	readseg(int, int, long, long, int); 
int	readkernel(int); 
1990/0504    
int	readconf(int); 
1990/0504/sys/src/9/power/bboot.c:126,1501990/0911/sys/src/9/power/bboot.c:127,148
1990/0424    
{ 
1990/0427    
	int n; 
1990/0504    
	char conffile[128]; 
1990/0911    
	Address *a; 
1990/0424    
 
1990/0427    
	if(ask){ 
		outin("bootfile", bootfile, bbuf, sizeof(bbuf)); 
		bootfile = bbuf; 
	} 
1990/0424    
                 
1990/0427    
	if(!ask) 
		scmd = lookup(sys); 
	else { 
		outin("server", sys, sbuf, sizeof(sbuf)); 
		sys = sbuf; 
		scmd = lookup(sys); 
	} 
	if(scmd == 0){ 
1990/0911    
 
	a = lookup(sys); 
	if(a == 0){ 
1990/0427    
		fprint(2, "boot: %s unknown\n", sys); 
		return; 
	} 
1990/0911    
	scmd = a->cmd; 
1990/0424    
 
1990/0427    
                 
1990/0424    
	/* 
1990/0427    
	 *  for the bit, we skip all the ether goo 
1990/0424    
	 */ 
1990/0504/sys/src/9/power/bboot.c:174,1911990/0911/sys/src/9/power/bboot.c:172,193
1990/0427    
		prerror("push noether"); 
		return; 
	} 
1990/0911    
	if(write(cfd, "config nonet", sizeof("config nonet")-1)<0){ 
		prerror("config nonet"); 
		return; 
	} 
1990/0424    
 
	/* 
	 *  grab a nonet channel and call up the ross file server 
	 */ 
	fd = open("#n/1/data", 2); 
1990/0911    
	fd = open("#nnonet/2/data", 2); 
1990/0427    
	if(fd < 0) { 
		prerror("opening #n/1/data"); 
1990/0911    
		prerror("opening #n/2/data"); 
1990/0427    
		return; 
	} 
1990/0424    
	cfd = open("#n/1/ctl", 2); 
1990/0911    
	cfd = open("#nnonet/2/ctl", 2); 
1990/0427    
	if(cfd < 0){ 
		prerror("opening #n/1/ctl"); 
1990/0911    
		prerror("opening #n/2/ctl"); 
1990/0427    
		return; 
	} 
	if(write(cfd, scmd, strlen(scmd))<0){ 
1990/0504/sys/src/9/power/bboot.c:301,3071990/0911/sys/src/9/power/bboot.c:303,309
1990/0427    
/* 
 *  lookup the address for a system 
 */ 
char * 
1990/0911    
Address * 
1990/0427    
lookup(char *arg) 
{ 
	Address *a; 
1990/0504/sys/src/9/power/bboot.c:313,3191990/0911/sys/src/9/power/bboot.c:315,321
1990/0427    
	} 
	for(a = addr; a->name; a++){ 
		if(strcmp(a->name, arg) == 0) 
			return a->cmd; 
1990/0911    
			return a; 
1990/0427    
	} 
	return 0; 
} 
1990/0911/sys/src/9/power/bboot.c:4,101990/1127/sys/src/9/power/bboot.c:4,10 (short | long)
1990/0424    
#include <fcall.h> 
 
1990/0427    
#define DEFFILE "/mips/9" 
#define DEFSYS "bitbootes" 
1990/1127    
#define DEFSYS "bit!bootes" 
1990/0427    
 
Fcall	hdr; 
char	*sys; 
1990/0911/sys/src/9/power/bboot.c:23,381990/1127/sys/src/9/power/bboot.c:23,36
1990/0424    
struct address { 
	char *name; 
	char *cmd; 
1990/0911    
	char *srvname; 
1990/0424    
} Address; 
 
Address addr[] = { 
1990/0911    
	{ "bitbootes", "bitconnect", "bit!bootes" }, 
	{ "ross", "connect 020701005eff", "nonet!ross" }, 
	{ "bootes", "connect 080069020205", "nonet!bootes" }, 
	{ "helix", "connect 080069020427", "nonet!helix" }, 
	{ "spindle", "connect 0800690202df", "nonet!spindle" }, 
	{ "r70", "connect 08002b04265d", "nonet!r70" }, 
1990/1127    
	{ "ross", "connect 020701005eff" }, 
	{ "bootes", "connect 080069020205" }, 
	{ "helix", "connect 080069020427" }, 
	{ "spindle", "connect 0800690202df" }, 
	{ "r70", "connect 08002b04265d" }, 
1990/0424    
	{ 0 } 
}; 
 
1990/0911/sys/src/9/power/bboot.c:62,681990/1127/sys/src/9/power/bboot.c:60,68
1990/0424    
/* 
1990/0427    
 *  predeclared 
1990/0424    
 */ 
1990/0911    
Address* lookup(char *); 
1990/1127    
int	dkdial(char *); 
int	nonetdial(char *); 
int	bitdial(char *); 
1990/0427    
int	readseg(int, int, long, long, int); 
int	readkernel(int); 
1990/0504    
int	readconf(int); 
1990/0911/sys/src/9/power/bboot.c:115,2131990/1127/sys/src/9/power/bboot.c:115,307
1990/0427    
			close(fd); 
		if(cfd > 0) 
			close(cfd); 
		if(efd > 0) 
			close(efd); 
		fd = cfd = efd = 0; 
1990/1127    
		fd = cfd = 0; 
1990/0504    
		boot(1, sysname); 
1990/0427    
	} 
1990/0424    
} 
 
1990/0427    
void 
1990/0504    
boot(int ask, char *addr) 
1990/1127    
int 
bitdial(char *arg) 
1990/0424    
{ 
1990/0427    
	int n; 
1990/0504    
	char conffile[128]; 
1990/1127    
	return open("#3/bit3", ORDWR); 
} 
 
int 
nonetdial(char *arg) 
{ 
	int efd, cfd, fd; 
1990/0911    
	Address *a; 
1990/1127    
	static int mounted; 
1990/0424    
 
1990/0427    
	if(ask){ 
		outin("bootfile", bootfile, bbuf, sizeof(bbuf)); 
		bootfile = bbuf; 
		outin("server", sys, sbuf, sizeof(sbuf)); 
		sys = sbuf; 
1990/1127    
	for(a = addr; a->name; a++){ 
		if(strcmp(a->name, arg) == 0) 
			break; 
1990/0427    
	} 
1990/0911    
                 
	a = lookup(sys); 
	if(a == 0){ 
1990/0427    
		fprint(2, "boot: %s unknown\n", sys); 
		return; 
1990/1127    
	if(a->name == 0){ 
		print("can't convert nonet address to ether address\n"); 
		return -1; 
1990/0427    
	} 
1990/0911    
	scmd = a->cmd; 
1990/0424    
 
	/* 
1990/0427    
	 *  for the bit, we skip all the ether goo 
1990/0424    
	 */ 
	if(strcmp(scmd, "bitconnect") == 0){ 
		fd = open("#3/bit3", ORDWR); 
1990/0427    
		if(fd < 0){ 
			prerror("opening #3/bit3"); 
			return; 
1990/1127    
	if(!mounted){ 
		/* 
		 *  grab a lance channel, make it recognize ether type 0x900, 
		 *  and push the nonet ethernet multiplexor onto it. 
		 */ 
		efd = open("#l/1/ctl", 2); 
		if(efd < 0){ 
			prerror("opening #l/1/ctl"); 
			return -1; 
1990/0427    
		} 
1990/0424    
		goto Mesg; 
1990/1127    
		if(write(efd, "connect 0x900", sizeof("connect 0x900")-1)<0){ 
			close(efd); 
			prerror("connect 0x900"); 
			return -1; 
		} 
		if(write(efd, "push noether", sizeof("push noether")-1)<0){ 
			close(efd); 
			prerror("push noether"); 
			return -1; 
		} 
		if(write(efd, "config nonet", sizeof("config nonet")-1)<0){ 
			close(efd); 
			prerror("config nonet"); 
			return -1; 
		} 
		mounted = 1; 
1990/0424    
	} 
 
	/* 
	 *  grab a lance channel, make it recognize ether type 0x900, 
	 *  and push the nonet ethernet multiplexor onto it. 
1990/1127    
	 *  grab a nonet channel and call up the file server 
1990/0424    
	 */ 
	cfd = open("#l/1/ctl", 2); 
1990/1127    
	fd = open("#nnonet/2/data", 2); 
	if(fd < 0) { 
		prerror("opening #nnonet/2/data"); 
		return -1; 
	} 
	cfd = open("#nnonet/2/ctl", 2); 
1990/0427    
	if(cfd < 0){ 
		prerror("opening #l/1/ctl"); 
		return; 
1990/1127    
		close(fd); 
		fd = -1; 
		prerror("opening #nnonet/2/ctl"); 
		return -1; 
1990/0427    
	} 
	if(write(cfd, "connect 0x900", sizeof("connect 0x900")-1)<0){ 
		prerror("connect 0x900"); 
		return; 
1990/1127    
	if(write(cfd, a->cmd, strlen(a->cmd))<0){ 
		close(cfd); 
		close(fd); 
		cfd = fd = -1; 
		prerror(a->cmd); 
		return -1; 
1990/0427    
	} 
	if(write(cfd, "push noether", sizeof("push noether")-1)<0){ 
		prerror("push noether"); 
		return; 
1990/1127    
	return fd; 
} 
 
int 
dkdial(char *arg) 
{ 
	int fd; 
	char cmd[64]; 
	static int mounted; 
 
	if(!mounted){ 
		/* 
		 *  grab the hsvme and configure it for a datakit 
		 */ 
		efd = open("#h/ctl", 2); 
		if(efd < 0){ 
			prerror("opening #h/ctl"); 
			return -1; 
		} 
		if(write(efd, "push dkmux", sizeof("push dkmux")-1)<0){ 
			close(efd); 
			prerror("push dkmux"); 
			return -1; 
		} 
		if(write(efd, "config 4 256 restart dk", sizeof("config 4 256 restart dk")-1)<0){ 
			close(efd); 
			prerror("config 4 256 restart dk"); 
			return -1; 
		} 
		mounted = 1; 
		sleep(2000);		/* wait for things to settle down */ 
1990/0427    
	} 
1990/0911    
	if(write(cfd, "config nonet", sizeof("config nonet")-1)<0){ 
		prerror("config nonet"); 
		return; 
	} 
1990/0424    
 
	/* 
	 *  grab a nonet channel and call up the ross file server 
1990/1127    
	 *  grab a datakit channel and call up the file server 
1990/0424    
	 */ 
1990/0911    
	fd = open("#nnonet/2/data", 2); 
1990/1127    
	fd = open("#kdk/5/data", 2); 
1990/0427    
	if(fd < 0) { 
1990/0911    
		prerror("opening #n/2/data"); 
1990/0427    
		return; 
1990/1127    
		prerror("opening #kdk/5/data"); 
		return -1; 
1990/0427    
	} 
1990/0911    
	cfd = open("#nnonet/2/ctl", 2); 
1990/1127    
	cfd = open("#kdk/5/ctl", 2); 
1990/0427    
	if(cfd < 0){ 
1990/0911    
		prerror("opening #n/2/ctl"); 
1990/0427    
		return; 
1990/1127    
		close(fd); 
		fd = -1; 
		prerror("opening #kdk/5/ctl"); 
		return -1; 
1990/0427    
	} 
	if(write(cfd, scmd, strlen(scmd))<0){ 
		prerror(scmd); 
1990/1127    
	sprint(cmd, "connect %s", arg); 
	if(write(cfd, cmd, strlen(cmd))<0){ 
		close(cfd); 
		close(fd); 
		cfd = fd = -1; 
		prerror(cmd); 
		return -1; 
	} 
	return fd; 
} 
 
void 
boot(int ask, char *addr) 
{ 
	int n, tries; 
	char conffile[128]; 
	char *srvname; 
 
	if(ask){ 
		outin("bootfile", bootfile, bbuf, sizeof(bbuf)); 
		bootfile = bbuf; 
		outin("server", sys, sbuf, sizeof(sbuf)); 
		sys = sbuf; 
	} 
 
	for(tries = 0; tries < 5; tries++){ 
		fd = -1; 
		if(strncmp(sys, "bit!", 4) == 0) 
			fd = bitdial(srvname = &sys[4]); 
		else if(strncmp(sys, "dk!", 3) == 0) 
			fd = dkdial(srvname = &sys[3]); 
		else if(strncmp(sys, "nonet!", 5) == 0) 
			fd = nonetdial(srvname = &sys[5]); 
		else 
			fd = nonetdial(srvname = sys); 
		if(fd >= 0) 
			break; 
		print("can't connect, retrying...\n"); 
		sleep(1000); 
	} 
	if(fd < 0){ 
		print("can't connect\n"); 
1990/0427    
		return; 
	} 
1990/0424    
 
    Mesg: 
	print("nop..."); 
	hdr.type = Tnop; 
1990/1127    
	hdr.tag = ~0; 
1990/0424    
	n = convS2M(&hdr, buf); 
1990/0427    
	if(write(fd, buf, n) != n){ 
1990/1127    
		print("n = %d\n", n); 
1990/0427    
		prerror("write nop"); 
		return; 
	} 
1990/1127    
  reread: 
1990/0424    
	n = read(fd, buf, sizeof buf); 
1990/0427    
	if(n <= 0){ 
		prerror("read nop"); 
		return; 
	} 
1990/1127    
	if(n == 2) 
		goto reread; 
1990/0424    
	if(convM2S(buf, &hdr, n) == 0) { 
		print("n = %d; buf = %.2x %.2x %.2x %.2x\n", 
			n, buf[0], buf[1], buf[2], buf[3]); 
1990/0911/sys/src/9/power/bboot.c:218,2271990/1127/sys/src/9/power/bboot.c:312,325
1990/0427    
		prerror("not Rnop"); 
		return; 
	} 
1990/1127    
	if(hdr.tag != ~0){ 
		prerror("tag not ~0"); 
		return; 
	} 
1990/0424    
 
	print("session..."); 
	hdr.type = Tsession; 
	hdr.lang = 'v'; 
1990/1127    
	hdr.tag = ~0; 
1990/0424    
	n = convS2M(&hdr, buf); 
1990/0427    
	if(write(fd, buf, n) != n){ 
		prerror("write session"); 
1990/0911/sys/src/9/power/bboot.c:236,2501990/1127/sys/src/9/power/bboot.c:334,351
1990/0427    
		prerror("format session"); 
		return; 
	} 
	if(hdr.type != Rsession){ 
		prerror("not Rsession"); 
1990/1127    
	if(hdr.tag != ~0){ 
		prerror("tag not ~0"); 
1990/0427    
		return; 
	} 
1990/0424    
	if(hdr.err){ 
		print("error %d;", hdr.err); 
1990/0427    
		prerror("remote error"); 
1990/1127    
	if(hdr.type == Rerror){ 
		fprint(2, "boot: error %s\n", hdr.ename); 
1990/0427    
		return; 
1990/0424    
	} 
1990/1127    
	if(hdr.type != Rsession){ 
		prerror("not Rsession"); 
		return; 
	} 
1990/0424    
 
	print("mount..."); 
1990/0427    
	if(bind("/", "/", MREPL) < 0){ 
1990/0911/sys/src/9/power/bboot.c:251,2571990/1127/sys/src/9/power/bboot.c:352,358
1990/0427    
		prerror("bind"); 
		return; 
	} 
	if(mount(fd, "/", MAFTER|MCREATE, "") < 0){ 
1990/1127    
	if(mount(fd, "/", MAFTER|MCREATE, "", "") < 0){ 
1990/0427    
		prerror("mount"); 
		return; 
	} 
1990/0911/sys/src/9/power/bboot.c:283,2891990/1127/sys/src/9/power/bboot.c:384,390
1990/0427    
{ 
	char buf[64]; 
 
	errstr(0, buf); 
1990/1127    
	errstr(buf); 
1990/0427    
	fprint(2, "boot: %s: %s\n", s, buf); 
} 
 
1990/0911/sys/src/9/power/bboot.c:295,3011990/1127/sys/src/9/power/bboot.c:396,402
1990/0424    
{ 
	char buf[64]; 
 
	errstr(0, buf); 
1990/1127    
	errstr(buf); 
1990/0424    
	fprint(2, "boot: %s: %s\n", s, buf); 
	exits(0); 
1990/0427    
} 
1990/1127/sys/src/9/power/bboot.c:7,181990/1202/sys/src/9/power/bboot.c:7,17 (short | long)
1990/1127    
#define DEFSYS "bit!bootes" 
1990/0427    
 
Fcall	hdr; 
char	*sys; 
char	*scmd; 
char	*bootfile; 
1990/1202    
char	bootfile[5*NAMELEN]; 
char	conffile[5*NAMELEN]; 
char	sys[NAMELEN]; 
1990/0427    
 
char	sbuf[2*NAMELEN]; 
char	bbuf[5*NAMELEN]; 
1990/0424    
char	buf[4*1024]; 
 
1990/0427    
int fd; 
1990/1127/sys/src/9/power/bboot.c:66,721990/1202/sys/src/9/power/bboot.c:65,71
1990/0427    
int	readseg(int, int, long, long, int); 
int	readkernel(int); 
1990/0504    
int	readconf(int); 
1990/0427    
int	outin(char *, char *, char *, int); 
1990/1202    
int	outin(char *, char *, int); 
1990/0427    
void	prerror(char *); 
void	error(char *); 
1990/0504    
void	boot(int, char *); 
1990/1127/sys/src/9/power/bboot.c:97,1111990/1202/sys/src/9/power/bboot.c:96,110
1990/0427    
			break; 
	} 
1990/0424    
 
1990/0427    
	sys = DEFSYS; 
	bootfile = DEFFILE; 
1990/1202    
	strcpy(sys, DEFSYS); 
	strcpy(bootfile, DEFFILE); 
1990/0427    
	switch(argc){ 
	case 1: 
		bootfile = argv[0]; 
1990/1202    
		strcpy(bootfile, argv[0]); 
1990/0427    
		break; 
	case 2: 
		bootfile = argv[0]; 
		sys = argv[1]; 
1990/1202    
		strcpy(bootfile, argv[0]); 
		strcpy(sys, argv[1]); 
1990/0427    
		break; 
	} 
1990/0424    
 
1990/1127/sys/src/9/power/bboot.c:255,2681990/1202/sys/src/9/power/bboot.c:254,264
1990/1127    
boot(int ask, char *addr) 
{ 
	int n, tries; 
	char conffile[128]; 
	char *srvname; 
 
	if(ask){ 
		outin("bootfile", bootfile, bbuf, sizeof(bbuf)); 
		bootfile = bbuf; 
		outin("server", sys, sbuf, sizeof(sbuf)); 
		sys = sbuf; 
1990/1202    
		outin("bootfile", bootfile, sizeof(bootfile)); 
		outin("server", sys, sizeof(sys)); 
1990/1127    
	} 
 
	for(tries = 0; tries < 5; tries++){ 
1990/1127/sys/src/9/power/bboot.c:271,2781990/1202/sys/src/9/power/bboot.c:267,274
1990/1127    
			fd = bitdial(srvname = &sys[4]); 
		else if(strncmp(sys, "dk!", 3) == 0) 
			fd = dkdial(srvname = &sys[3]); 
		else if(strncmp(sys, "nonet!", 5) == 0) 
			fd = nonetdial(srvname = &sys[5]); 
1990/1202    
		else if(strncmp(sys, "nonet!", 6) == 0) 
			fd = nonetdial(srvname = &sys[6]); 
1990/1127    
		else 
			fd = nonetdial(srvname = sys); 
		if(fd >= 0) 
1990/1127/sys/src/9/power/bboot.c:361,3671990/1202/sys/src/9/power/bboot.c:357,363
1990/0504    
	sprint(conffile, "/mips/conf/%s", addr); 
	print("%s...", conffile); 
	while((fd = open(conffile, OREAD)) < 0){ 
		outin("conffile", conffile, conffile, sizeof(conffile)); 
1990/1202    
		outin("conffile", conffile, sizeof(conffile)); 
1990/0504    
	} 
	if(readconf(fd) < 0) 
		prerror("readconf"); 
1990/1127/sys/src/9/power/bboot.c:369,3761990/1202/sys/src/9/power/bboot.c:365,371
1990/0504    
 
	print("%s...", bootfile); 
1990/0427    
	while((fd = open(bootfile, OREAD)) < 0){ 
1990/0504    
		outin("bootfile", bootfile, bbuf, sizeof(bbuf)); 
1990/0427    
		bootfile = bbuf; 
1990/1202    
		outin("bootfile", bootfile, sizeof(bootfile)); 
1990/0427    
	} 
1990/0424    
	readkernel(fd); 
1990/0427    
	prerror("couldn't read kernel"); 
1990/1127/sys/src/9/power/bboot.c:551,5571990/1202/sys/src/9/power/bboot.c:546,552
1990/0427    
 *  prompt and get input 
 */ 
int 
outin(char *prompt, char *def, char *buf, int len) 
1990/1202    
outin(char *prompt, char *def, int len) 
1990/0427    
{ 
	int n; 
 
1990/1127/sys/src/9/power/bboot.c:561,5691990/1202/sys/src/9/power/bboot.c:556,564
1990/0427    
	}while(n==0); 
	if(n < 0) 
		error("can't read #c/cons; please reboot"); 
	if(n == 1) 
		strcpy(buf, def); 
	else 
1990/1202    
	if(n != 1){ 
1990/0427    
		buf[n-1] = 0; 
1990/1202    
		strcpy(def, buf); 
	} 
1990/0427    
	return n; 
1990/0424    
} 
1990/1202/sys/src/9/power/bboot.c:26,321991/0327/sys/src/9/power/bboot.c:26,32 (short | long)
1990/0424    
 
Address addr[] = { 
1990/1127    
	{ "ross", "connect 020701005eff" }, 
	{ "bootes", "connect 080069020205" }, 
1991/0327    
	{ "bootes", "connect 0800690203f3" }, 
1990/1127    
	{ "helix", "connect 080069020427" }, 
	{ "spindle", "connect 0800690202df" }, 
	{ "r70", "connect 08002b04265d" }, 
1991/0327/sys/src/9/power/bboot.c:3,91991/1102/sys/src/9/power/bboot.c:3,9 (short | long)
1990/0424    
 
#include <fcall.h> 
 
1990/0427    
#define DEFFILE "/mips/9" 
1991/1102    
#define DEFFILE "/mips/9power" 
1990/1127    
#define DEFSYS "bit!bootes" 
1990/0427    
 
Fcall	hdr; 
1991/0327/sys/src/9/power/bboot.c:283,2891991/1102/sys/src/9/power/bboot.c:283,289
1990/0424    
 
	print("nop..."); 
	hdr.type = Tnop; 
1990/1127    
	hdr.tag = ~0; 
1991/1102    
	hdr.tag = NOTAG; 
1990/0424    
	n = convS2M(&hdr, buf); 
1990/0427    
	if(write(fd, buf, n) != n){ 
1990/1127    
		print("n = %d\n", n); 
1991/0327/sys/src/9/power/bboot.c:308,3211991/1102/sys/src/9/power/bboot.c:308,321
1990/0427    
		prerror("not Rnop"); 
		return; 
	} 
1990/1127    
	if(hdr.tag != ~0){ 
		prerror("tag not ~0"); 
1991/1102    
	if(hdr.tag != NOTAG){ 
		prerror("tag not NOTAG"); 
1990/1127    
		return; 
	} 
1990/0424    
 
	print("session..."); 
	hdr.type = Tsession; 
1990/1127    
	hdr.tag = ~0; 
1991/1102    
	hdr.tag = NOTAG; 
1990/0424    
	n = convS2M(&hdr, buf); 
1990/0427    
	if(write(fd, buf, n) != n){ 
		prerror("write session"); 
1991/0327/sys/src/9/power/bboot.c:330,3371991/1102/sys/src/9/power/bboot.c:330,337
1990/0427    
		prerror("format session"); 
		return; 
	} 
1990/1127    
	if(hdr.tag != ~0){ 
		prerror("tag not ~0"); 
1991/1102    
	if(hdr.tag != NOTAG){ 
		prerror("tag not NOTAG"); 
1990/0427    
		return; 
	} 
1990/1127    
	if(hdr.type == Rerror){ 
1991/1102/sys/src/9/power/bboot.c:227,2421991/1108/sys/src/9/power/bboot.c:227,242 (short | long)
1990/0424    
	/* 
1990/1127    
	 *  grab a datakit channel and call up the file server 
1990/0424    
	 */ 
1990/1127    
	fd = open("#kdk/5/data", 2); 
1991/1108    
	fd = open("#k/dk/5/data", 2); 
1990/0427    
	if(fd < 0) { 
1990/1127    
		prerror("opening #kdk/5/data"); 
1991/1108    
		prerror("opening #k/dk/5/data"); 
1990/1127    
		return -1; 
1990/0427    
	} 
1990/1127    
	cfd = open("#kdk/5/ctl", 2); 
1991/1108    
	cfd = open("#k/dk/5/ctl", 2); 
1990/0427    
	if(cfd < 0){ 
1990/1127    
		close(fd); 
		fd = -1; 
		prerror("opening #kdk/5/ctl"); 
1991/1108    
		prerror("opening #k/dk/5/ctl"); 
1990/1127    
		return -1; 
1990/0427    
	} 
1990/1127    
	sprint(cmd, "connect %s", arg); 
1991/1108/sys/src/9/power/bboot.c:1,381992/0319/sys/src/9/power/bboot.c:1,7 (short | long)
1990/0424    
#include <u.h> 
#include <libc.h> 
1992/0319    
#include "../boot/boot.h" 
1990/0424    
 
#include <fcall.h> 
                 
1991/1102    
#define DEFFILE "/mips/9power" 
1990/1127    
#define DEFSYS "bit!bootes" 
1990/0427    
                 
Fcall	hdr; 
char	*scmd; 
1990/1202    
char	bootfile[5*NAMELEN]; 
char	conffile[5*NAMELEN]; 
char	sys[NAMELEN]; 
1990/0427    
                 
1990/0424    
char	buf[4*1024]; 
                 
1990/0427    
int fd; 
int cfd; 
int efd; 
                 
1990/0424    
typedef 
struct address { 
	char *name; 
	char *cmd; 
} Address; 
                 
Address addr[] = { 
1990/1127    
	{ "ross", "connect 020701005eff" }, 
1991/0327    
	{ "bootes", "connect 0800690203f3" }, 
1990/1127    
	{ "helix", "connect 080069020427" }, 
	{ "spindle", "connect 0800690202df" }, 
	{ "r70", "connect 08002b04265d" }, 
1990/0424    
	{ 0 } 
}; 
                 
struct a_out_h { 
	ulong	magic;			/* magic and sections */ 
	ulong	timestamp;		/* time and date */ 
1991/1108/sys/src/9/power/bboot.c:56,4561992/0319/sys/src/9/power/bboot.c:25,188
1990/0424    
	ulong	mystery;		/* complete mystery */ 
} a_out; 
 
/* 
1990/0427    
 *  predeclared 
1990/0424    
 */ 
1990/1127    
int	dkdial(char *); 
int	nonetdial(char *); 
int	bitdial(char *); 
1990/0427    
int	readseg(int, int, long, long, int); 
int	readkernel(int); 
1992/0319    
typedef struct Net	Net; 
typedef struct Flavor	Flavor; 
 
int	printcol; 
 
char	cputype[NAMELEN]; 
char	terminal[NAMELEN]; 
char	sys[2*NAMELEN]; 
char	username[NAMELEN]; 
char	conffile[2*NAMELEN]; 
char	sysname[2*NAMELEN]; 
char	buf[8*1024]; 
 
int mflag; 
int fflag; 
int kflag; 
 
int	cache(int); 
Method	*rootserver(char*); 
1990/0504    
int	readconf(int); 
1990/1202    
int	outin(char *, char *, int); 
1990/0427    
void	prerror(char *); 
void	error(char *); 
1990/0504    
void	boot(int, char *); 
1992/0319    
void	readkernel(int); 
int	readseg(int, int, long, long, int); 
1990/0427    
 
/* 
 *  usage: 9b [-a] [server] [file] 
 * 
 *  default server is `bitbootes', default file is `/sys/src/9/mips/9' 
1992/0319    
 *  default boot file 
1990/0427    
 */ 
1992/0319    
#define DEFFILE "/mips/9power" 
 
void 
1990/0427    
main(int argc, char *argv[]) 
1990/0424    
{ 
1990/0427    
	int i; 
1990/0504    
	char *sysname; 
1992/0319    
	int fd; 
	Method *mp; 
	char cmd[64]; 
	char flags[6]; 
	int islocal; 
	char *bootfile; 
1990/0424    
 
1990/0427    
	open("#c/cons", 0); 
	open("#c/cons", 1); 
	open("#c/cons", 1); 
1992/0319    
	sleep(1000); 
1990/0424    
 
1990/0504    
	sysname = argv[0]; 
1992/0319    
	open("#c/cons", OREAD); 
	open("#c/cons", OWRITE); 
	open("#c/cons", OWRITE); 
1990/0504    
 
1990/0427    
	argv++; 
	argc--;	 
	while(argc > 0){ 
		if(argv[0][0] == '-'){ 
			argc--; 
			argv++; 
		} else 
			break; 
	} 
1990/0424    
                 
1990/1202    
	strcpy(sys, DEFSYS); 
	strcpy(bootfile, DEFFILE); 
1990/0427    
	switch(argc){ 
	case 1: 
1990/1202    
		strcpy(bootfile, argv[0]); 
1992/0319    
	ARGBEGIN{ 
	case 'u': 
		strcpy(username, ARGF()); 
1990/0427    
		break; 
	case 2: 
1990/1202    
		strcpy(bootfile, argv[0]); 
		strcpy(sys, argv[1]); 
1992/0319    
	case 'k': 
		kflag = 1; 
1990/0427    
		break; 
	} 
1992/0319    
	case 'm': 
		mflag = 1; 
		break; 
	case 'f': 
		fflag = 1; 
		break; 
	}ARGEND 
1990/0424    
 
1990/0504    
	boot(0, sysname); 
1990/0427    
	for(;;){ 
		if(fd > 0) 
			close(fd); 
		if(cfd > 0) 
			close(cfd); 
1990/1127    
		fd = cfd = 0; 
1990/0504    
		boot(1, sysname); 
1990/0427    
	} 
1990/0424    
} 
1992/0319    
	readenv("cputype", cputype, sizeof(cputype)); 
	readenv("terminal", terminal, sizeof(cputype)); 
	readenv("sysname", sysname, sizeof(sysname)); 
	if(argc > 1) 
		bootfile = argv[1]; 
	else 
		bootfile = DEFFILE; 
1990/0424    
 
1990/1127    
int 
bitdial(char *arg) 
1990/0424    
{ 
1990/1127    
	return open("#3/bit3", ORDWR); 
} 
                 
int 
nonetdial(char *arg) 
{ 
	int efd, cfd, fd; 
1990/0911    
	Address *a; 
1990/1127    
	static int mounted; 
1990/0424    
                 
1990/1127    
	for(a = addr; a->name; a++){ 
		if(strcmp(a->name, arg) == 0) 
			break; 
1990/0427    
	} 
1990/1127    
	if(a->name == 0){ 
		print("can't convert nonet address to ether address\n"); 
		return -1; 
1990/0427    
	} 
1990/0424    
                 
1990/1127    
	if(!mounted){ 
		/* 
		 *  grab a lance channel, make it recognize ether type 0x900, 
		 *  and push the nonet ethernet multiplexor onto it. 
		 */ 
		efd = open("#l/1/ctl", 2); 
		if(efd < 0){ 
			prerror("opening #l/1/ctl"); 
			return -1; 
1990/0427    
		} 
1990/1127    
		if(write(efd, "connect 0x900", sizeof("connect 0x900")-1)<0){ 
			close(efd); 
			prerror("connect 0x900"); 
			return -1; 
		} 
		if(write(efd, "push noether", sizeof("push noether")-1)<0){ 
			close(efd); 
			prerror("push noether"); 
			return -1; 
		} 
		if(write(efd, "config nonet", sizeof("config nonet")-1)<0){ 
			close(efd); 
			prerror("config nonet"); 
			return -1; 
		} 
		mounted = 1; 
1990/0424    
	} 
                 
	/* 
1990/1127    
	 *  grab a nonet channel and call up the file server 
1992/0319    
	 *  pick a method and initialize it 
1990/0424    
	 */ 
1990/1127    
	fd = open("#nnonet/2/data", 2); 
	if(fd < 0) { 
		prerror("opening #nnonet/2/data"); 
		return -1; 
	} 
	cfd = open("#nnonet/2/ctl", 2); 
1990/0427    
	if(cfd < 0){ 
1990/1127    
		close(fd); 
		fd = -1; 
		prerror("opening #nnonet/2/ctl"); 
		return -1; 
1990/0427    
	} 
1990/1127    
	if(write(cfd, a->cmd, strlen(a->cmd))<0){ 
		close(cfd); 
		close(fd); 
		cfd = fd = -1; 
		prerror(a->cmd); 
		return -1; 
1990/0427    
	} 
1990/1127    
	return fd; 
} 
1992/0319    
	mp = rootserver(argc ? *argv : 0); 
	(*mp->config)(mp); 
	islocal = strcmp(mp->name, "local") == 0; 
1990/1127    
 
int 
dkdial(char *arg) 
{ 
	int fd; 
	char cmd[64]; 
	static int mounted; 
                 
	if(!mounted){ 
		/* 
		 *  grab the hsvme and configure it for a datakit 
		 */ 
		efd = open("#h/ctl", 2); 
		if(efd < 0){ 
			prerror("opening #h/ctl"); 
			return -1; 
		} 
		if(write(efd, "push dkmux", sizeof("push dkmux")-1)<0){ 
			close(efd); 
			prerror("push dkmux"); 
			return -1; 
		} 
		if(write(efd, "config 4 256 restart dk", sizeof("config 4 256 restart dk")-1)<0){ 
			close(efd); 
			prerror("config 4 256 restart dk"); 
			return -1; 
		} 
		mounted = 1; 
		sleep(2000);		/* wait for things to settle down */ 
1990/0427    
	} 
1990/0424    
                 
	/* 
1990/1127    
	 *  grab a datakit channel and call up the file server 
1992/0319    
	 *  connect to the root file system 
1990/0424    
	 */ 
1991/1108    
	fd = open("#k/dk/5/data", 2); 
1990/0427    
	if(fd < 0) { 
1991/1108    
		prerror("opening #k/dk/5/data"); 
1990/1127    
		return -1; 
1990/0427    
	} 
1991/1108    
	cfd = open("#k/dk/5/ctl", 2); 
1990/0427    
	if(cfd < 0){ 
1990/1127    
		close(fd); 
		fd = -1; 
1991/1108    
		prerror("opening #k/dk/5/ctl"); 
1990/1127    
		return -1; 
1990/0427    
	} 
1990/1127    
	sprint(cmd, "connect %s", arg); 
	if(write(cfd, cmd, strlen(cmd))<0){ 
		close(cfd); 
		close(fd); 
		cfd = fd = -1; 
		prerror(cmd); 
		return -1; 
	} 
	return fd; 
} 
                 
void 
boot(int ask, char *addr) 
{ 
	int n, tries; 
	char *srvname; 
                 
	if(ask){ 
1990/1202    
		outin("bootfile", bootfile, sizeof(bootfile)); 
		outin("server", sys, sizeof(sys)); 
1990/1127    
	} 
                 
	for(tries = 0; tries < 5; tries++){ 
		fd = -1; 
		if(strncmp(sys, "bit!", 4) == 0) 
			fd = bitdial(srvname = &sys[4]); 
		else if(strncmp(sys, "dk!", 3) == 0) 
			fd = dkdial(srvname = &sys[3]); 
1990/1202    
		else if(strncmp(sys, "nonet!", 6) == 0) 
			fd = nonetdial(srvname = &sys[6]); 
1990/1127    
		else 
			fd = nonetdial(srvname = sys); 
		if(fd >= 0) 
			break; 
		print("can't connect, retrying...\n"); 
		sleep(1000); 
	} 
	if(fd < 0){ 
		print("can't connect\n"); 
1990/0427    
		return; 
	} 
1990/0424    
                 
	print("nop..."); 
	hdr.type = Tnop; 
1991/1102    
	hdr.tag = NOTAG; 
1990/0424    
	n = convS2M(&hdr, buf); 
1990/0427    
	if(write(fd, buf, n) != n){ 
1990/1127    
		print("n = %d\n", n); 
1990/0427    
		prerror("write nop"); 
		return; 
	} 
1990/1127    
  reread: 
1990/0424    
	n = read(fd, buf, sizeof buf); 
1990/0427    
	if(n <= 0){ 
		prerror("read nop"); 
		return; 
	} 
1990/1127    
	if(n == 2) 
		goto reread; 
1990/0424    
	if(convM2S(buf, &hdr, n) == 0) { 
		print("n = %d; buf = %.2x %.2x %.2x %.2x\n", 
			n, buf[0], buf[1], buf[2], buf[3]); 
1990/0427    
		prerror("format nop"); 
		return; 
1990/0424    
	} 
1990/0427    
	if(hdr.type != Rnop){ 
		prerror("not Rnop"); 
		return; 
1992/0319    
	fd = (*mp->connect)(); 
	if(fd < 0) 
		fatal("can't connect to file server"); 
	if(!islocal){ 
		nop(fd); 
		session(fd); 
		if(cfs) 
			fd = (*cfs)(fd); 
1990/0427    
	} 
1991/1102    
	if(hdr.tag != NOTAG){ 
		prerror("tag not NOTAG"); 
1990/1127    
		return; 
	} 
1990/0424    
                 
	print("session..."); 
	hdr.type = Tsession; 
1991/1102    
	hdr.tag = NOTAG; 
1990/0424    
	n = convS2M(&hdr, buf); 
1990/0427    
	if(write(fd, buf, n) != n){ 
		prerror("write session"); 
		return; 
	} 
1990/0424    
	n = read(fd, buf, sizeof buf); 
1990/0427    
	if(n <= 0){ 
		prerror("read session"); 
		return; 
	} 
	if(convM2S(buf, &hdr, n) == 0){ 
		prerror("format session"); 
		return; 
	} 
1991/1102    
	if(hdr.tag != NOTAG){ 
		prerror("tag not NOTAG"); 
1990/0427    
		return; 
	} 
1990/1127    
	if(hdr.type == Rerror){ 
		fprint(2, "boot: error %s\n", hdr.ename); 
1990/0427    
		return; 
1990/0424    
	} 
1990/1127    
	if(hdr.type != Rsession){ 
		prerror("not Rsession"); 
		return; 
	} 
1990/0424    
                 
	print("mount..."); 
1990/0427    
	if(bind("/", "/", MREPL) < 0){ 
		prerror("bind"); 
		return; 
	} 
1990/1127    
	if(mount(fd, "/", MAFTER|MCREATE, "", "") < 0){ 
1990/0427    
		prerror("mount"); 
		return; 
	} 
1990/1127    
 
1992/0319    
	/* 
	 *  create the name space, mount the root fs 
	 */ 
	if(bind("/", "/", MREPL) < 0) 
		fatal("bind"); 
	if(mount(fd, "/", MAFTER|MCREATE, "", "") < 0) 
		fatal("mount"); 
1990/0424    
	close(fd); 
 
1990/0504    
	sprint(conffile, "/mips/conf/%s", addr); 
1992/0319    
	/* 
	 *  open the configuration file and read it 
	 *  into the kernel 
	 */ 
	sprint(conffile, "/mips/conf/%s", sysname); 
1990/0504    
	print("%s...", conffile); 
	while((fd = open(conffile, OREAD)) < 0){ 
1992/0319    
	while((fd = open(conffile, OREAD)) < 0) 
1990/1202    
		outin("conffile", conffile, sizeof(conffile)); 
1990/0504    
	} 
	if(readconf(fd) < 0) 
		prerror("readconf"); 
1992/0319    
		fatal("readconf"); 
1990/0504    
	close(fd); 
 
1992/0319    
	/* 
	 *  read in real kernel 
	 */ 
1990/0504    
	print("%s...", bootfile); 
1990/0427    
	while((fd = open(bootfile, OREAD)) < 0){ 
1992/0319    
	while((fd = open(bootfile, OREAD)) < 0) 
1990/1202    
		outin("bootfile", bootfile, sizeof(bootfile)); 
1990/0427    
	} 
1990/0424    
	readkernel(fd); 
1990/0427    
	prerror("couldn't read kernel"); 
1992/0319    
	fatal("couldn't read kernel"); 
1990/0424    
} 
 
1990/0427    
/* 
 *  print error 
1992/0319    
 *  ask user from whence cometh the root file system 
1990/0427    
 */ 
1990/0424    
void 
1990/0427    
prerror(char *s) 
1992/0319    
Method* 
rootserver(char *arg) 
1990/0427    
{ 
	char buf[64]; 
1992/0319    
	char prompt[256]; 
	char reply[64]; 
	Method *mp; 
	char *cp; 
	int n; 
1990/0427    
 
1990/1127    
	errstr(buf); 
1990/0427    
	fprint(2, "boot: %s: %s\n", s, buf); 
} 
1992/0319    
	mp = method; 
	n = sprint(prompt, "root is from (%s", mp->name); 
	for(mp++; mp->name; mp++) 
		n += sprint(prompt+n, ", %s", mp->name); 
	sprint(prompt+n, ")"); 
1990/0427    
 
/* 
 *  print error and exit 
 */ 
void 
1990/0424    
error(char *s) 
{ 
	char buf[64]; 
                 
1990/1127    
	errstr(buf); 
1990/0424    
	fprint(2, "boot: %s: %s\n", s, buf); 
	exits(0); 
1990/0427    
} 
                 
/* 
 *  lookup the address for a system 
 */ 
1990/0911    
Address * 
1990/0427    
lookup(char *arg) 
{ 
	Address *a; 
                 
	if(strcmp(arg, "?")==0 || strcmp(arg, "help")==0){ 
		for(a = addr; a->name; a++) 
			print("%s\n", a->name); 
		return 0; 
1992/0319    
	if(arg) 
		strcpy(reply, arg); 
	else 
		strcpy(reply, method->name); 
	for(;;){ 
		if(arg == 0 || mflag) 
			outin(prompt, reply, sizeof(reply)); 
		arg = 0; 
		for(mp = method; mp->name; mp++) 
			if(*reply == *mp->name){ 
				cp = strchr(reply, '!'); 
				if(cp) 
					strcpy(sys, cp+1); 
				return mp; 
			} 
		if(mp->name == 0) 
			continue; 
1990/0427    
	} 
	for(a = addr; a->name; a++){ 
		if(strcmp(a->name, arg) == 0) 
1990/0911    
			return a; 
1990/0427    
	} 
	return 0; 
} 
 
/* 
 *  read a segment into memory 
 */ 
int 
readseg(int in, int out, long inoff, long outoff, int len) 
{ 
	long	n, i; 
 
	if(seek(in, inoff, 0) < 0){ 
		prerror("seeking bootfile"); 
		return -1; 
	} 
	if(seek(out, outoff, 0) != outoff){ 
		prerror("seeking #b/mem"); 
		return -1; 
	} 
	for(; len > 0; len -= n){ 
		if((n = read(in, buf, sizeof buf)) <= 0){ 
			prerror("reading bootfile"); 
			return -1; 
		} 
		if(write(out, buf, n) != n){ 
			prerror("writing #b/mem"); 
			return -1; 
		} 
	} 
	return 0; 
} 
                 
/* 
1990/0504    
 *  set a configuration value 
 */ 
                 
                 
/* 
 *  read the configuration 
 */ 
int 
1991/1108/sys/src/9/power/bboot.c:472,4811992/0319/sys/src/9/power/bboot.c:204,211
1990/0504    
	 *  write into 4 meg - 4k 
	 */ 
	bfd = open("#b/mem", OWRITE); 
	if(bfd < 0){ 
		prerror("can't open #b/mem"); 
		return; 
	} 
1992/0319    
	if(bfd < 0) 
		fatal("can't open #b/mem"); 
1990/0504    
	x = 0x80000000 | 4*1024*1024 - 4*1024; 
	if(seek(bfd, x, 0) != x){ 
		close(bfd); 
1991/1108/sys/src/9/power/bboot.c:489,4981992/0319/sys/src/9/power/bboot.c:219,229
1990/0504    
	close(bfd); 
	return 0; 
} 
1992/0319    
 
1990/0504    
/* 
1990/0427    
 *  read the kernel into memory and jump to it 
 */ 
int 
1992/0319    
void 
1990/0427    
readkernel(int fd) 
{ 
	int n; 
1991/1108/sys/src/9/power/bboot.c:499,5641992/0319/sys/src/9/power/bboot.c:230,287
1990/0427    
	int bfd; 
 
	bfd = open("#b/mem", OWRITE); 
	if(bfd < 0){ 
		prerror("can't open #b/mem"); 
		return; 
	} 
1992/0319    
	if(bfd < 0) 
		fatal("can't open #b/mem"); 
1990/0427    
 
	n = read(fd, &a_out, sizeof(a_out)); 
	if(n <= 0){ 
		prerror("can't read boot file"); 
		close(bfd); 
		return; 
	} 
1992/0319    
	if(n <= 0) 
		fatal("can't read boot file"); 
1990/0427    
 
	print("\n%d", a_out.text); 
	if(readseg(fd, bfd, 20*4, a_out.textva, a_out.text)<0){ 
		prerror("can't read boot file"); 
		close(bfd); 
		return; 
	} 
1992/0319    
	if(readseg(fd, bfd, 20*4, a_out.textva, a_out.text)<0) 
		fatal("can't read boot file"); 
1990/0427    
	print("+%d", a_out.data); 
	if(readseg(fd, bfd, 20*4 + a_out.text, a_out.textva + a_out.text, a_out.data)<0){ 
		prerror("can't read boot file"); 
		close(bfd); 
		return; 
	} 
1992/0319    
	if(readseg(fd, bfd, 20*4 + a_out.text, a_out.textva + a_out.text, a_out.data)<0) 
		fatal("can't read boot file"); 
1990/0504    
	print("+%d", a_out.bss); 
1990/0427    
 
	close(bfd); 
	bfd = open("#b/boot", OWRITE); 
	if(bfd < 0){ 
		prerror("can't open #b/boot"); 
		return; 
	} 
1992/0319    
	if(bfd < 0) 
		fatal("can't open #b/boot"); 
1990/0427    
	 
1990/0504    
	print(" entry: 0x%ux\n", a_out.entryva); 
1990/0427    
	sleep(1000); 
	if(write(bfd, &a_out.entryva, sizeof a_out.entryva) != sizeof a_out.entryva){ 
		prerror("can't start kernel"); 
		close(bfd); 
	} 
                 
	return; 
1992/0319    
	if(write(bfd, &a_out.entryva, sizeof a_out.entryva) != sizeof a_out.entryva) 
		fatal("can't start kernel"); 
1990/0427    
} 
 
/* 
 *  prompt and get input 
1992/0319    
 *  read a segment into memory 
1990/0427    
 */ 
int 
1990/1202    
outin(char *prompt, char *def, int len) 
1992/0319    
readseg(int in, int out, long inoff, long outoff, int len) 
1990/0427    
{ 
	int n; 
1992/0319    
	long	n, i; 
1990/0427    
 
	do{ 
		print("%s[%s]: ", prompt, def); 
		n = read(0, buf, len); 
	}while(n==0); 
	if(n < 0) 
		error("can't read #c/cons; please reboot"); 
1990/1202    
	if(n != 1){ 
1990/0427    
		buf[n-1] = 0; 
1990/1202    
		strcpy(def, buf); 
1992/0319    
	if(seek(in, inoff, 0) < 0){ 
		warning("seeking bootfile"); 
		return -1; 
1990/1202    
	} 
1990/0427    
	return n; 
1992/0319    
	if(seek(out, outoff, 0) != outoff){ 
		warning("seeking #b/mem"); 
		return -1; 
	} 
	for(; len > 0; len -= n){ 
		if((n = read(in, buf, sizeof buf)) <= 0){ 
			warning("reading bootfile"); 
			return -1; 
		} 
		if(write(out, buf, n) != n){ 
			warning("writing #b/mem"); 
			return -1; 
		} 
	} 
	return 0; 
1990/0424    
} 
1992/0319    
 
1992/0319/sys/src/9/power/bboot.c:61,671992/0322/sys/src/9/power/bboot.c:61,67 (short | long)
1992/0319    
	char cmd[64]; 
	char flags[6]; 
	int islocal; 
	char *bootfile; 
1992/0322    
	char bootfile[NAMELEN]; 
1990/0424    
 
1992/0319    
	sleep(1000); 
1990/0424    
 
1992/0319/sys/src/9/power/bboot.c:88,961992/0322/sys/src/9/power/bboot.c:88,96
1992/0319    
	readenv("terminal", terminal, sizeof(cputype)); 
	readenv("sysname", sysname, sizeof(sysname)); 
	if(argc > 1) 
		bootfile = argv[1]; 
1992/0322    
		strcpy(bootfile, argv[1]); 
1992/0319    
	else 
		bootfile = DEFFILE; 
1992/0322    
		strcpy(bootfile, DEFFILE); 
1990/0424    
 
	/* 
1992/0319    
	 *  pick a method and initialize it 
1992/0319/sys/src/9/power/bboot.c:166,1741992/0322/sys/src/9/power/bboot.c:166,173
1992/0319    
	else 
		strcpy(reply, method->name); 
	for(;;){ 
		if(arg == 0 || mflag) 
1992/0322    
		if(mflag) 
1992/0319    
			outin(prompt, reply, sizeof(reply)); 
		arg = 0; 
		for(mp = method; mp->name; mp++) 
			if(*reply == *mp->name){ 
				cp = strchr(reply, '!'); 
1992/0322/sys/src/9/power/bboot.c:100,1051992/0418/sys/src/9/power/bboot.c:100,116 (short | long)
1992/0319    
	islocal = strcmp(mp->name, "local") == 0; 
1990/1127    
 
1990/0424    
	/* 
1992/0418    
	 *  set user to none 
	 */ 
	fd = open("#c/user", OWRITE|OTRUNC); 
	if(fd >= 0){ 
		if(write(fd, "none", 4) < 0) 
			warning("write user name"); 
		close(fd); 
	}else 
		warning("open #c/user"); 
 
	/* 
1992/0319    
	 *  connect to the root file system 
1990/0424    
	 */ 
1992/0319    
	fd = (*mp->connect)(); 
1992/0418/sys/src/9/power/bboot.c:1,2971992/0522/sys/src/9/power/bboot.c:0 (short | long)
Deleted.
rsc Mon Mar 7 10:32:28 2005
1990/0424    
#include <u.h> 
#include <libc.h> 
1992/0319    
#include "../boot/boot.h" 
1990/0424    
                 
struct a_out_h { 
	ulong	magic;			/* magic and sections */ 
	ulong	timestamp;		/* time and date */ 
	ulong	size;			/* (HEADR+textsize+datsize) */ 
	ulong	symsize;		/* nsyms */ 
	ulong	opt;			/* size of optional hdr and flags */ 
	ulong	magicversion;		/* magic and version */ 
	ulong	text;			/* sizes */ 
	ulong	data; 
	ulong	bss; 
	ulong	entryva;			/* va of entry */ 
	ulong	textva;			/* va of base of text */ 
	ulong	dataca;			/* va of base of data */ 
	ulong	bssva;			/* va of base of bss */ 
	ulong	gpregmask;		/* gp reg mask */ 
	ulong	dummy1; 
	ulong	dummy1; 
	ulong	dummy1; 
	ulong	dummy1; 
	ulong	gpvalue;		/* gp value ?? */ 
	ulong	mystery;		/* complete mystery */ 
} a_out; 
                 
1992/0319    
typedef struct Net	Net; 
typedef struct Flavor	Flavor; 
                 
int	printcol; 
                 
char	cputype[NAMELEN]; 
char	terminal[NAMELEN]; 
char	sys[2*NAMELEN]; 
char	username[NAMELEN]; 
char	conffile[2*NAMELEN]; 
char	sysname[2*NAMELEN]; 
char	buf[8*1024]; 
                 
int mflag; 
int fflag; 
int kflag; 
                 
int	cache(int); 
Method	*rootserver(char*); 
1990/0504    
int	readconf(int); 
1992/0319    
void	readkernel(int); 
int	readseg(int, int, long, long, int); 
1990/0427    
                 
/* 
1992/0319    
 *  default boot file 
1990/0427    
 */ 
1992/0319    
#define DEFFILE "/mips/9power" 
                 
void 
1990/0427    
main(int argc, char *argv[]) 
1990/0424    
{ 
1992/0319    
	int fd; 
	Method *mp; 
	char cmd[64]; 
	char flags[6]; 
	int islocal; 
1992/0322    
	char bootfile[NAMELEN]; 
1990/0424    
                 
1992/0319    
	sleep(1000); 
1990/0424    
                 
1992/0319    
	open("#c/cons", OREAD); 
	open("#c/cons", OWRITE); 
	open("#c/cons", OWRITE); 
1990/0504    
                 
1992/0319    
	ARGBEGIN{ 
	case 'u': 
		strcpy(username, ARGF()); 
1990/0427    
		break; 
1992/0319    
	case 'k': 
		kflag = 1; 
1990/0427    
		break; 
1992/0319    
	case 'm': 
		mflag = 1; 
		break; 
	case 'f': 
		fflag = 1; 
		break; 
	}ARGEND 
1990/0424    
                 
1992/0319    
	readenv("cputype", cputype, sizeof(cputype)); 
	readenv("terminal", terminal, sizeof(cputype)); 
	readenv("sysname", sysname, sizeof(sysname)); 
	if(argc > 1) 
1992/0322    
		strcpy(bootfile, argv[1]); 
1992/0319    
	else 
1992/0322    
		strcpy(bootfile, DEFFILE); 
1990/0424    
                 
	/* 
1992/0319    
	 *  pick a method and initialize it 
1990/0424    
	 */ 
1992/0319    
	mp = rootserver(argc ? *argv : 0); 
	(*mp->config)(mp); 
	islocal = strcmp(mp->name, "local") == 0; 
1990/1127    
                 
1990/0424    
	/* 
1992/0418    
	 *  set user to none 
	 */ 
	fd = open("#c/user", OWRITE|OTRUNC); 
	if(fd >= 0){ 
		if(write(fd, "none", 4) < 0) 
			warning("write user name"); 
		close(fd); 
	}else 
		warning("open #c/user"); 
                 
	/* 
1992/0319    
	 *  connect to the root file system 
1990/0424    
	 */ 
1992/0319    
	fd = (*mp->connect)(); 
	if(fd < 0) 
		fatal("can't connect to file server"); 
	if(!islocal){ 
		nop(fd); 
		session(fd); 
		if(cfs) 
			fd = (*cfs)(fd); 
1990/0427    
	} 
1990/1127    
                 
1992/0319    
	/* 
	 *  create the name space, mount the root fs 
	 */ 
	if(bind("/", "/", MREPL) < 0) 
		fatal("bind"); 
	if(mount(fd, "/", MAFTER|MCREATE, "", "") < 0) 
		fatal("mount"); 
1990/0424    
	close(fd); 
                 
1992/0319    
	/* 
	 *  open the configuration file and read it 
	 *  into the kernel 
	 */ 
	sprint(conffile, "/mips/conf/%s", sysname); 
1990/0504    
	print("%s...", conffile); 
1992/0319    
	while((fd = open(conffile, OREAD)) < 0) 
1990/1202    
		outin("conffile", conffile, sizeof(conffile)); 
1990/0504    
	if(readconf(fd) < 0) 
1992/0319    
		fatal("readconf"); 
1990/0504    
	close(fd); 
                 
1992/0319    
	/* 
	 *  read in real kernel 
	 */ 
1990/0504    
	print("%s...", bootfile); 
1992/0319    
	while((fd = open(bootfile, OREAD)) < 0) 
1990/1202    
		outin("bootfile", bootfile, sizeof(bootfile)); 
1990/0424    
	readkernel(fd); 
1992/0319    
	fatal("couldn't read kernel"); 
1990/0424    
} 
                 
1990/0427    
/* 
1992/0319    
 *  ask user from whence cometh the root file system 
1990/0427    
 */ 
1992/0319    
Method* 
rootserver(char *arg) 
1990/0427    
{ 
1992/0319    
	char prompt[256]; 
	char reply[64]; 
	Method *mp; 
	char *cp; 
	int n; 
1990/0427    
                 
1992/0319    
	mp = method; 
	n = sprint(prompt, "root is from (%s", mp->name); 
	for(mp++; mp->name; mp++) 
		n += sprint(prompt+n, ", %s", mp->name); 
	sprint(prompt+n, ")"); 
1990/0427    
                 
1992/0319    
	if(arg) 
		strcpy(reply, arg); 
	else 
		strcpy(reply, method->name); 
	for(;;){ 
1992/0322    
		if(mflag) 
1992/0319    
			outin(prompt, reply, sizeof(reply)); 
		for(mp = method; mp->name; mp++) 
			if(*reply == *mp->name){ 
				cp = strchr(reply, '!'); 
				if(cp) 
					strcpy(sys, cp+1); 
				return mp; 
			} 
		if(mp->name == 0) 
			continue; 
1990/0427    
	} 
} 
                 
                 
/* 
1990/0504    
 *  read the configuration 
 */ 
int 
readconf(int fd) 
{ 
	int bfd; 
	int n; 
	long x; 
                 
	/* 
 	 *  read the config file 
	 */ 
	n = read(fd, buf, sizeof(buf)-1); 
	if(n <= 0) 
		return -1; 
	buf[n] = 0; 
                 
	/* 
	 *  write into 4 meg - 4k 
	 */ 
	bfd = open("#b/mem", OWRITE); 
1992/0319    
	if(bfd < 0) 
		fatal("can't open #b/mem"); 
1990/0504    
	x = 0x80000000 | 4*1024*1024 - 4*1024; 
	if(seek(bfd, x, 0) != x){ 
		close(bfd); 
		return -1; 
	} 
	if(write(bfd, buf, n+1) != n+1){ 
		close(bfd); 
		return -1; 
	} 
                 
	close(bfd); 
	return 0; 
} 
1992/0319    
                 
1990/0504    
/* 
1990/0427    
 *  read the kernel into memory and jump to it 
 */ 
1992/0319    
void 
1990/0427    
readkernel(int fd) 
{ 
	int n; 
	int bfd; 
                 
	bfd = open("#b/mem", OWRITE); 
1992/0319    
	if(bfd < 0) 
		fatal("can't open #b/mem"); 
1990/0427    
                 
	n = read(fd, &a_out, sizeof(a_out)); 
1992/0319    
	if(n <= 0) 
		fatal("can't read boot file"); 
1990/0427    
                 
	print("\n%d", a_out.text); 
1992/0319    
	if(readseg(fd, bfd, 20*4, a_out.textva, a_out.text)<0) 
		fatal("can't read boot file"); 
1990/0427    
	print("+%d", a_out.data); 
1992/0319    
	if(readseg(fd, bfd, 20*4 + a_out.text, a_out.textva + a_out.text, a_out.data)<0) 
		fatal("can't read boot file"); 
1990/0504    
	print("+%d", a_out.bss); 
1990/0427    
                 
	close(bfd); 
	bfd = open("#b/boot", OWRITE); 
1992/0319    
	if(bfd < 0) 
		fatal("can't open #b/boot"); 
1990/0427    
	                 
1990/0504    
	print(" entry: 0x%ux\n", a_out.entryva); 
1990/0427    
	sleep(1000); 
1992/0319    
	if(write(bfd, &a_out.entryva, sizeof a_out.entryva) != sizeof a_out.entryva) 
		fatal("can't start kernel"); 
1990/0427    
} 
                 
/* 
1992/0319    
 *  read a segment into memory 
1990/0427    
 */ 
int 
1992/0319    
readseg(int in, int out, long inoff, long outoff, int len) 
1990/0427    
{ 
1992/0319    
	long	n, i; 
1990/0427    
                 
1992/0319    
	if(seek(in, inoff, 0) < 0){ 
		warning("seeking bootfile"); 
		return -1; 
1990/1202    
	} 
1992/0319    
	if(seek(out, outoff, 0) != outoff){ 
		warning("seeking #b/mem"); 
		return -1; 
	} 
	for(; len > 0; len -= n){ 
		if((n = read(in, buf, sizeof buf)) <= 0){ 
			warning("reading bootfile"); 
			return -1; 
		} 
		if(write(out, buf, n) != n){ 
			warning("writing #b/mem"); 
			return -1; 
		} 
	} 
	return 0; 
1990/0424    
} 
1992/0319    
                 


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