## diffname ss/boot.c 1990/1223 ## diff -e /dev/null /n/bootesdump/1990/1223/sys/src/9/sparc/boot.c 0a #include #include #include Fcall hdr; char buf[100]; char bootline[64]; char bootdevice; char bootserver[64]; void error(char*); void sendmsg(int, char*); main(int argc, char *argv[]) { int cfd, fd, n, fu, f, i; char buf[256]; int p[2]; open("#c/cons", OREAD); open("#c/cons", OWRITE); open("#c/cons", OWRITE); fd = open("#e/bootline", OREAD); if(fd >= 0){ read(fd, bootline, sizeof bootline); close(fd); } fd = open("#e/bootdevice", OREAD); if(fd >= 0){ read(fd, &bootdevice, 1); close(fd); } fd = open("#e/bootserver", OREAD); if(fd >= 0){ read(fd, bootserver, 64); close(fd); } else strcpy(bootserver, "nfs"); switch(bootdevice){ case 'A': /* * grab the rs232 line, * make it 9600 baud, * push the async protocol onto it, */ cfd = open("#c/rs232ctl", 2); if(cfd < 0) error("opening #c/rs232ctl"); sendmsg(cfd, "B9600"); sendmsg(cfd, "push async"); break; case 'a': /* * grab the rs232 line, * make it 19200 baud, * push the async protocol onto it, */ cfd = open("#c/rs232ctl", 2); if(cfd < 0) error("opening #c/rs232ctl"); sendmsg(cfd, "B19200"); sendmsg(cfd, "push async"); break; default: /* * grab the incon, */ cfd = open("#i/ctl", 2); if(cfd < 0) error("opening #i/ctl"); break; } /* * push the dk multiplexor onto the communications link, * and use line 1 as the signalling channel. */ sendmsg(cfd, "push dkmux"); sendmsg(cfd, "config 1 16 norestart"); /* * fork a process to hold the device channel open */ switch(fork()){ case -1: break; case 0: for(;;) sleep(60*1000); exit(0); default: close(cfd); break; } /* * open a datakit channel and call ken, leave the * incon ctl channel open */ for(i = 0; ; i++){ fd = open("#k/2/data", 2); if(fd < 0) error("opening #k/2/data"); cfd = open("#k/2/ctl", 2); if(cfd < 0) error("opening #k/2/ctl"); sprint(buf, "connect %s", bootserver); n = strlen(buf); if(write(cfd, buf, n) == n) break; if(i == 5) error("dialing"); print("error dialing, retrying ...\n"); close(fd); close(cfd); } print("connected to %s\n", bootserver); close(cfd); /* * talk to the file server */ print("nop..."); hdr.type = Tnop; hdr.tag = ~0; n = convS2M(&hdr, buf); if(write(fd, buf, n) != n) error("write nop"); n = read(fd, buf, sizeof buf); if(n==2 && buf[0]=='O' && buf[1]=='K') n = read(fd, buf, sizeof buf); if(n <= 0) error("read nop"); 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"); } if(hdr.type != Rnop) error("not Rnop"); print("session..."); hdr.type = Tsession; hdr.tag = ~0; n = convS2M(&hdr, buf); if(write(fd, buf, n) != n) error("write session"); n = read(fd, buf, sizeof buf); if(n <= 0) error("read session"); if(convM2S(buf, &hdr, n) == 0) error("format session"); if(hdr.type == Rerror){ print("error %s;", hdr.ename); error(hdr.ename); } if(hdr.type != Rsession) error("not Rsession"); print("post..."); sprint(buf, "#s/%s", "bootes"); f = create(buf, 1, 0666); if(f < 0) error("create"); sprint(buf, "%d", fd); if(write(f, buf, strlen(buf)) != strlen(buf)) error("write"); close(f); sprint(buf, "#s/%s", "bootes"); f = create("#s/boot", 1, 0666); if(f < 0) error("create"); sprint(buf, "%d", fd); if(write(f, buf, strlen(buf)) != strlen(buf)) error("write"); close(f); print("mount..."); if(bind("/", "/", MREPL) < 0) error("bind"); if(mount(fd, "/", MAFTER|MCREATE, "", "") < 0) error("mount"); print("success\n"); if(strchr(bootline, ' ')) execl("/68020/init", "init", "-m", 0); else execl("/68020/init", "init", 0); error("/68020/init"); } void sendmsg(int fd, char *msg) { int n; n = strlen(msg); if(write(fd, msg, n) != n) error(msg); } void error(char *s) { char buf[64]; errstr(buf); fprint(2, "boot: %s: %s\n", s, buf); exits(0); } . ## diffname ss/boot.c 1990/1226 ## diff -e /n/bootesdump/1990/1223/sys/src/9/sparc/boot.c /n/bootesdump/1990/1226/sys/src/9/sparc/boot.c 189,190c execl("/sparc/init", "init", 0); error("/sparc/init"); . 187c execl("/sparc/init", "init", "-m", 0); . 22a write(1, "hello from boot\n", 16); bind("#c", "/dev", MREPL); binit(0, 0); bitblt(&screen, Pt(100, 100), &screen, Rect(100, 100, 300, 200), 0xF); . 2a #include . ## diffname ss/boot.c 1990/1227 ## diff -e /n/bootesdump/1990/1226/sys/src/9/sparc/boot.c /n/bootesdump/1990/1227/sys/src/9/sparc/boot.c 27a else bitblt(&screen, Pt(500, 500), &screen, Rect(100, 100, 300, 200), 0xF); . 26a if(fork()==0) . ## diffname ss/boot.c 1990/1231 ## diff -e /n/bootesdump/1990/1227/sys/src/9/sparc/boot.c /n/bootesdump/1990/1231/sys/src/9/sparc/boot.c 219a } /* * prompt and get input */ int int outin(char *prompt, char *def, int len) { int n; char buf[256]; 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){ buf[n-1] = 0; strcpy(def, buf); } return n; . 211a /* * print error and exit */ . 207,209c errstr(buf); fprint(2, "boot: %s: %s\n", s, buf); . 205c char buf[64]; . 203c prerror(char *s) . 201a /* * print error */ . 198,199c execl("/mips/init", "init", 0); error("/mips/init"); . 195,196c close(fd); if(ask) execl("/mips/init", "init", "-m", 0); . 188c . 180d 172c sprint(buf, "#s/%s", srvname); . 168,169c if(hdr.type != Rsession){ prerror("not Rsession"); return; } . 165,166c fprint(2, "boot: error %s\n", hdr.ename); return; . 160,163c if(n <= 0){ prerror("read session"); return; } if(convM2S(buf, &hdr, n) == 0){ prerror("format session"); return; } if(hdr.tag != ~0){ prerror("tag not ~0"); return; } . 157,158c if(write(fd, buf, n) != n){ prerror("write session"); return; } . 150,151c if(hdr.type != Rnop){ prerror("not Rnop"); return; } if(hdr.tag != ~0){ prerror("tag not ~0"); return; } . 148c prerror("format nop"); return; . 141,144c if(n <= 0){ prerror("read nop"); return; } if(n == 2) goto reread; . 138,139c if(write(fd, buf, n) != n){ print("n = %d\n", n); prerror("write nop"); return; } reread: . 131,133c void boot(int ask) { int n, f, tries; char *srvname; if(ask){ outin("server", sys, sizeof(sys)); } 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!", 6) == 0) fd = nonetdial(srvname = &sys[6]); 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"); return; } . 128,129c return fd; } . 126a close(fd); cfd = fd = -1; prerror(cmd); return -1; . 125a fd = -1; prerror("opening #kdk/5/ctl"); return -1; } sprint(cmd, "connect %s", arg); if(write(cfd, cmd, strlen(cmd))<0){ . 111,124c fd = open("#kdk/5/data", 2); if(fd < 0) { prerror("opening #kdk/5/data"); return -1; } cfd = open("#kdk/5/ctl", 2); if(cfd < 0){ . 108,109c * grab a datakit channel and call up the file server . 106a 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 */ } . 105a return fd; } . 104c close(fd); fd = cfd = -1; prerror(a->cmd); return -1; . 89,102c fd = open("#nnonet/2/data", 2); if(fd < 0) { prerror("opening #nnonet/2/data"); return -1; } cfd = open("#nnonet/2/ctl", 2); if(cfd < 0){ close(fd); fd = -1; prerror("opening #nnonet/2/ctl"); return -1; } if(write(cfd, a->cmd, strlen(a->cmd))<0){ . 86,87c * grab a nonet channel and call up the file server . 79,82c efd = open("#l/1/ctl", 2); if(efd < 0){ prerror("opening #l/1/ctl"); return -1; } 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; . 77c * grab a lance channel, make it recognize ether type 0x900, * and push the nonet ethernet multiplexor onto it. . 75c } boot(manual); for(;;){ if(fd > 0) close(fd); if(cfd > 0) close(cfd); fd = cfd = 0; boot(1); } } int bitdial(char *arg) { return open("#3/bit3", ORDWR); } int nonetdial(char *arg) { int efd, cfd, fd; Address *a; static int mounted; for(a = addr; a->name; a++){ if(strcmp(a->name, arg) == 0) break; } if(a->name == 0){ print("can't convert nonet address to ether address\n"); return -1; } if(!mounted){ . 63,73c case 2: strcpy(bootfile, argv[0]); strcpy(sys, argv[1]); . 50,61c strcpy(sys, DEFSYS); strcpy(bootfile, DEFFILE); switch(argc){ case 1: strcpy(bootfile, argv[0]); . 38,48d 33,36c argv++; argc--; while(argc > 0){ if(argv[0][0] == '-'){ if(argv[0][1] == 'm') manual = 1; argc--; argv++; } else break; . 31a i = create("#e/sysname", 1, 0666); if(i < 0) error("sysname"); if(write(i, argv[0], strlen(argv[0])) != strlen(argv[0])) error("sysname"); close(i); . 21,30c open("#c/cons", 0); open("#c/cons", 1); open("#c/cons", 1); . 17,19c int i; int manual=0; char buf[128]; . 14a int fd; int cfd; int efd; typedef struct address { char *name; char *cmd; } Address; Address addr[] = { { "ross", "connect 020701005eff" }, { "bootes", "connect 080069020205" }, { "helix", "connect 080069020427" }, { "spindle", "connect 0800690202df" }, { "r70", "connect 08002b04265d" }, { 0 } }; /* * predeclared */ int outin(char *, char *, int); void prerror(char *); void error(char *); void boot(int); int dkdial(char *); int nonetdial(char *); int bitdial(char *); /* * usage: 9b [-a] [server] [file] * * default server is `bootes', default file is `/mips/9' */ . 12,13c char buf[4*1024]; char bootfile[5*NAMELEN]; char sys[NAMELEN]; . 7,10c char *scmd; . 5a #define DEFSYS "bootes" #define DEFFILE "/mips/9" . 3d ## diffname ss/boot.c 1991/0109 ## diff -e /n/bootesdump/1990/1231/sys/src/9/sparc/boot.c /n/bootesdump/1991/0109/sys/src/9/sparc/boot.c 386d 354,355c execl("/sparc/init", "init", "-t", 0); error("/sparc/init"); . 352c execl("/sparc/init", "init", "-t", "-m", 0); . 350a if(net){ char buf[128]; fd = create("#e/bootnet", 1, 0666); if(fd >= 0){ if(write(fd, net, strlen(net)) != strlen(net)) error("writing bootnet"); close(fd); sprint(buf, "/net/%s", net); if(bind(netdev, buf, MREPL) < 0) error("binding bootnet"); } } . 230a net = "dk"; netdev = "#kdk"; . 174a net = "nonet"; netdev = "#nnonet"; . 87d 83,85d 81d 69a manual = 1; . 68c argc--; . 66a for(i = 0; i < argc; i++) print("argv[%d] = %s\n", i, argv[i]); . 59a strcpy(buf, "none"); outin("user", buf, sizeof(buf)); i = open("#c/user", 2); if(i >= 0){ write(i, buf, strlen(buf)); close(i); } . 48c * default server is `bootes', default file is `/sparc/9' . 12d 7a char *net; char *netdev; . 6d ## diffname ss/boot.c 1991/0112 ## diff -e /n/bootesdump/1991/0109/sys/src/9/sparc/boot.c /n/bootesdump/1991/0112/sys/src/9/sparc/boot.c 81d ## diffname ss/boot.c 1991/01151 ## diff -e /n/bootesdump/1991/0112/sys/src/9/sparc/boot.c /n/bootesdump/1991/01151/sys/src/9/sparc/boot.c 360d 358a /* * set the time from the access time of the root of the file server, * accessible as /.. */ print("time..."); if(stat("/..", dirbuf) < 0) error("stat"); convM2D(dirbuf, &dir); f = open("#c/time", OWRITE); sprint(dirbuf, "%ld", dir.atime); write(f, dirbuf, strlen(dirbuf)); close(f); . 249a Dir dir; char dirbuf[DIRLEN]; . ## diffname ss/boot.c 1991/0131 ## diff -e /n/bootesdump/1991/01151/sys/src/9/sparc/boot.c /n/bootesdump/1991/0131/sys/src/9/sparc/boot.c 378,388c char buf[64]; sprint(buf, "/lib/netaddr.%s", net); print("binding %s onto /lib/netaddr.net\n", buf); bind(buf, "/lib/netaddr.net", MREPL); . 376a if(netdev){ char buf[64]; sprint(buf, "/net/%s", net); bind(netdev, buf, MREPL); bind(netdev, "/net/net", MREPL); } . ## diffname ss/boot.c 1991/0201 # deleted ## diff -e /n/bootesdump/1991/0131/sys/src/9/sparc/boot.c /n/bootesdump/1991/0201/sys/src/9/sparc/boot.c 1,442d