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

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

1990/0911/sys/src/9/power/bboot.c:4,101990/1127/sys/src/9/power/bboot.c:4,10 (short | long | prev | next)
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    
} 


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