| 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,11 – 1990/0427/sys/src/9/power/bboot.c:3,25 (short | long) | ||
| 1990/0424 | #include <fcall.h> | |
| 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,76 – 1990/0427/sys/src/9/power/bboot.c:36,41 | ||
| 1990/0424 | { 0 } }; | |
| 1990/0424/sys/src/9/power/bboot.c:95,191 – 1990/0427/sys/src/9/power/bboot.c:60,156 | ||
| 1990/0424 | } a_out; /* | |
| 1990/0427 | * predeclared | |
| 1990/0424 | */ | |
| 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 | { | |
| 1990/0427 | int i; | |
| 1990/0424 |
| |
| 1990/0427 | open("#c/cons", 0); open("#c/cons", 1); open("#c/cons", 1); | |
| 1990/0424 |
| |
| 1990/0427 | argv++; argc--; while(argc > 0){ if(argv[0][0] == '-'){ argc--; argv++; } else break; } | |
| 1990/0424 |
| |
| 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 |
| |
| 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 | } | |
| 1990/0427 | void boot(int ask) | |
| 1990/0424 | { | |
| 1990/0427 | int n; | |
| 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){ fprint(2, "boot: %s unknown\n", sys); 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/0424 | */ | |
| 1990/0427 | if(fd < 0){ prerror("opening #3/bit3"); return; } | |
| 1990/0424 | goto Mesg; } | |
| 1990/0424/sys/src/9/power/bboot.c:194,269 – 1990/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); | |
| 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); | |
| 1990/0427 | if(fd < 0) { prerror("opening #n/1/data"); return; } | |
| 1990/0424 | cfd = open("#n/1/ctl", 2); | |
| 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); | |
| 1990/0427 | if(write(fd, buf, n) != n){ prerror("write nop"); return; } | |
| 1990/0424 | n = read(fd, buf, sizeof buf); | |
| 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]); | |
| 1990/0427 | prerror("format nop"); return; | |
| 1990/0424 | } | |
| 1990/0427 | if(hdr.type != Rnop){ prerror("not Rnop"); return; } | |
| 1990/0424 | print("session..."); hdr.type = Tsession; hdr.lang = 'v'; 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; } if(hdr.type != Rsession){ prerror("not Rsession"); return; } | |
| 1990/0424 | if(hdr.err){ print("error %d;", hdr.err); | |
| 1990/0427 | prerror("remote error"); return; | |
| 1990/0424 | } print("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..."); | |
| 1990/0427 | while((fd = open(bootfile, OREAD)) < 0){ outin("bootfile", DEFFILE, bbuf, sizeof(bbuf)); bootfile = bbuf; } | |
| 1990/0424 | readkernel(fd); | |
| 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,274 – 1990/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,319 – 1990/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; | |
| 1990/0427/sys/src/9/power/bboot.c:328,343 – 1990/0430/sys/src/9/power/bboot.c:327,337 | ||
| 1990/0427 | prerror("reading bootfile"); return -1; } | |
| 1990/0430/sys/src/9/power/bboot.c:19,25 – 1990/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,74 – 1990/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 *); | |
| 1990/0504 | void boot(int, char *); | |
| 1990/0427 | /* * usage: 9b [-a] [server] [file] | |
| 1990/0430/sys/src/9/power/bboot.c:78,88 – 1990/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,111 – 1990/0504/sys/src/9/power/bboot.c:108,114 | ||
| 1990/0427 | break; } | |
| 1990/0424 | ||
| 1990/0427 |
| |
| 1990/0504 | boot(0, sysname); | |
| 1990/0427 | for(;;){ if(fd > 0) close(fd); | |
| 1990/0430/sys/src/9/power/bboot.c:114,127 – 1990/0504/sys/src/9/power/bboot.c:117,131 | ||
| 1990/0427 | if(efd > 0) close(efd); fd = cfd = efd = 0; | |
| 1990/0504 | boot(1, sysname); | |
| 1990/0427 | } | |
| 1990/0424 | } | |
| 1990/0427 | void | |
| 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,146 – 1990/0504/sys/src/9/power/bboot.c:144,149 | ||
| 1990/0427 | return; } | |
| 1990/0424 | ||
| 1990/0427 |
| |
| 1990/0424 | /* | |
| 1990/0427 | * for the bit, we skip all the ether goo | |
| 1990/0430/sys/src/9/power/bboot.c:252,260 – 1990/0504/sys/src/9/power/bboot.c:255,272 | ||
| 1990/0427 | } | |
| 1990/0424 | close(fd); | |
| 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){ | |
| 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,341 – 1990/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,375 – 1990/0504/sys/src/9/power/bboot.c:425,431 | ||
| 1990/0427 | close(bfd); return; } | |
| 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,384 – 1990/0504/sys/src/9/power/bboot.c:434,440 | ||
| 1990/0427 | return; } | |
| 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,37 – 1990/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[] = { | |
| 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,67 – 1990/0911/sys/src/9/power/bboot.c:62,68 | ||
| 1990/0424 | /* | |
| 1990/0427 | * predeclared | |
| 1990/0424 | */ | |
| 1990/0427 |
| |
| 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,150 – 1990/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 |
| |
| 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,191 – 1990/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 */ | |
| 1990/0911 | fd = open("#nnonet/2/data", 2); | |
| 1990/0427 | if(fd < 0) { | |
| 1990/0911 | prerror("opening #n/2/data"); | |
| 1990/0427 | return; } | |
| 1990/0424 |
| |
| 1990/0911 | cfd = open("#nnonet/2/ctl", 2); | |
| 1990/0427 | if(cfd < 0){ | |
| 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,307 – 1990/0911/sys/src/9/power/bboot.c:303,309 | ||
| 1990/0427 | /* * lookup the address for a system */ | |
| 1990/0911 | Address * | |
| 1990/0427 | lookup(char *arg) { Address *a; | |
| 1990/0504/sys/src/9/power/bboot.c:313,319 – 1990/0911/sys/src/9/power/bboot.c:315,321 | ||
| 1990/0427 | } for(a = addr; a->name; a++){ if(strcmp(a->name, arg) == 0) | |
| 1990/0911 | return a; | |
| 1990/0427 | } return 0; } | |
| 1990/0911/sys/src/9/power/bboot.c:4,10 – 1990/1127/sys/src/9/power/bboot.c:4,10 (short | long) | ||
| 1990/0424 | #include <fcall.h> | |
| 1990/0427 | #define DEFFILE "/mips/9" | |
| 1990/1127 | #define DEFSYS "bit!bootes" | |
| 1990/0427 | Fcall hdr; char *sys; | |
| 1990/0911/sys/src/9/power/bboot.c:23,38 – 1990/1127/sys/src/9/power/bboot.c:23,36 | ||
| 1990/0424 | struct address { char *name; char *cmd; | |
| 1990/0911 |
| |
| 1990/0424 | } Address; Address addr[] = { | |
| 1990/0911 |
| |
| 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,68 – 1990/1127/sys/src/9/power/bboot.c:60,68 | ||
| 1990/0424 | /* | |
| 1990/0427 | * predeclared | |
| 1990/0424 | */ | |
| 1990/0911 |
| |
| 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,213 – 1990/1127/sys/src/9/power/bboot.c:115,307 | ||
| 1990/0427 | close(fd); if(cfd > 0) close(cfd); | |
| 1990/1127 | fd = cfd = 0; | |
| 1990/0504 | boot(1, sysname); | |
| 1990/0427 | } | |
| 1990/0424 | } | |
| 1990/0427 |
| |
| 1990/0504 |
| |
| 1990/1127 | int bitdial(char *arg) | |
| 1990/0424 | { | |
| 1990/0427 |
| |
| 1990/0504 |
| |
| 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 |
| |
| 1990/1127 | for(a = addr; a->name; a++){ if(strcmp(a->name, arg) == 0) break; | |
| 1990/0427 | } | |
| 1990/0911 |
| |
| 1990/0427 |
| |
| 1990/1127 | if(a->name == 0){ print("can't convert nonet address to ether address\n"); return -1; | |
| 1990/0427 | } | |
| 1990/0911 |
| |
| 1990/0424 |
| |
| 1990/0427 |
| |
| 1990/0424 |
| |
| 1990/0427 |
| |
| 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 |
| |
| 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 | |
| 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; } 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 |
| |
| 1990/0424 | /* | |
| 1990/1127 | * grab a datakit channel and call up the file server | |
| 1990/0424 | */ | |
| 1990/0911 |
| |
| 1990/1127 | fd = open("#kdk/5/data", 2); | |
| 1990/0427 | if(fd < 0) { | |
| 1990/0911 |
| |
| 1990/0427 |
| |
| 1990/1127 | prerror("opening #kdk/5/data"); return -1; | |
| 1990/0427 | } | |
| 1990/0911 |
| |
| 1990/1127 | cfd = open("#kdk/5/ctl", 2); | |
| 1990/0427 | if(cfd < 0){ | |
| 1990/0911 |
| |
| 1990/0427 |
| |
| 1990/1127 | close(fd); fd = -1; prerror("opening #kdk/5/ctl"); 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 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 |
| |
| 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,227 – 1990/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; | |
| 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,250 – 1990/1127/sys/src/9/power/bboot.c:334,351 | ||
| 1990/0427 | prerror("format session"); return; } | |
| 1990/1127 | if(hdr.tag != ~0){ prerror("tag not ~0"); | |
| 1990/0427 | return; } | |
| 1990/0424 |
| |
| 1990/0427 |
| |
| 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,257 – 1990/1127/sys/src/9/power/bboot.c:352,358 | ||
| 1990/0427 | prerror("bind"); return; } | |
| 1990/1127 | if(mount(fd, "/", MAFTER|MCREATE, "", "") < 0){ | |
| 1990/0427 | prerror("mount"); return; } | |
| 1990/0911/sys/src/9/power/bboot.c:283,289 – 1990/1127/sys/src/9/power/bboot.c:384,390 | ||
| 1990/0427 | { char buf[64]; | |
| 1990/1127 | errstr(buf); | |
| 1990/0427 | fprint(2, "boot: %s: %s\n", s, buf); } | |
| 1990/0911/sys/src/9/power/bboot.c:295,301 – 1990/1127/sys/src/9/power/bboot.c:396,402 | ||
| 1990/0424 | { char buf[64]; | |
| 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,18 – 1990/1202/sys/src/9/power/bboot.c:7,17 (short | long) | ||
| 1990/1127 | #define DEFSYS "bit!bootes" | |
| 1990/0427 | Fcall hdr; | |
| 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; | |
| 1990/1127/sys/src/9/power/bboot.c:66,72 – 1990/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 |
| |
| 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,111 – 1990/1202/sys/src/9/power/bboot.c:96,110 | ||
| 1990/0427 | break; } | |
| 1990/0424 | ||
| 1990/0427 |
| |
| 1990/1202 | strcpy(sys, DEFSYS); strcpy(bootfile, DEFFILE); | |
| 1990/0427 | switch(argc){ case 1: | |
| 1990/1202 | strcpy(bootfile, argv[0]); | |
| 1990/0427 | break; case 2: | |
| 1990/1202 | strcpy(bootfile, argv[0]); strcpy(sys, argv[1]); | |
| 1990/0427 | break; } | |
| 1990/0424 | ||
| 1990/1127/sys/src/9/power/bboot.c:255,268 – 1990/1202/sys/src/9/power/bboot.c:254,264 | ||
| 1990/1127 | boot(int ask, char *addr) { int n, tries; | |
| 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,278 – 1990/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]); | |
| 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,367 – 1990/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){ | |
| 1990/1202 | outin("conffile", conffile, sizeof(conffile)); | |
| 1990/0504 | } if(readconf(fd) < 0) prerror("readconf"); | |
| 1990/1127/sys/src/9/power/bboot.c:369,376 – 1990/1202/sys/src/9/power/bboot.c:365,371 | ||
| 1990/0504 | print("%s...", bootfile); | |
| 1990/0427 | while((fd = open(bootfile, OREAD)) < 0){ | |
| 1990/0504 |
| |
| 1990/0427 |
| |
| 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,557 – 1990/1202/sys/src/9/power/bboot.c:546,552 | ||
| 1990/0427 | * prompt and get input */ int | |
| 1990/1202 | outin(char *prompt, char *def, int len) | |
| 1990/0427 | { int n; | |
| 1990/1127/sys/src/9/power/bboot.c:561,569 – 1990/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"); | |
| 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,32 – 1991/0327/sys/src/9/power/bboot.c:26,32 (short | long) | ||
| 1990/0424 | Address addr[] = { | |
| 1990/1127 | { "ross", "connect 020701005eff" }, | |
| 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,9 – 1991/1102/sys/src/9/power/bboot.c:3,9 (short | long) | ||
| 1990/0424 | #include <fcall.h> | |
| 1990/0427 |
| |
| 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,289 – 1991/1102/sys/src/9/power/bboot.c:283,289 | ||
| 1990/0424 | print("nop..."); hdr.type = Tnop; | |
| 1990/1127 |
| |
| 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,321 – 1991/1102/sys/src/9/power/bboot.c:308,321 | ||
| 1990/0427 | prerror("not Rnop"); return; } | |
| 1990/1127 |
| |
| 1991/1102 | if(hdr.tag != NOTAG){ prerror("tag not NOTAG"); | |
| 1990/1127 | return; } | |
| 1990/0424 | print("session..."); hdr.type = Tsession; | |
| 1990/1127 |
| |
| 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,337 – 1991/1102/sys/src/9/power/bboot.c:330,337 | ||
| 1990/0427 | prerror("format session"); return; } | |
| 1990/1127 |
| |
| 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,242 – 1991/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 |
| |
| 1991/1108 | fd = open("#k/dk/5/data", 2); | |
| 1990/0427 | if(fd < 0) { | |
| 1990/1127 |
| |
| 1991/1108 | prerror("opening #k/dk/5/data"); | |
| 1990/1127 | return -1; | |
| 1990/0427 | } | |
| 1990/1127 |
| |
| 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); | |
| 1991/1108/sys/src/9/power/bboot.c:1,38 – 1992/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 |
| |
| 1991/1102 |
| |
| 1990/1127 |
| |
| 1990/0427 |
| |
| 1990/1202 |
| |
| 1990/0427 | ||
| 1990/0424 |
| |
| 1990/0427 |
| |
| 1990/0424 |
| |
| 1990/1127 |
| |
| 1991/0327 |
| |
| 1990/1127 |
| |
| 1990/0424 |
| |
| 1991/1108/sys/src/9/power/bboot.c:56,456 – 1992/0319/sys/src/9/power/bboot.c:25,188 | ||
| 1990/0424 | ulong mystery; /* complete mystery */ } a_out; | |
| 1990/0427 |
| |
| 1990/0424 |
| |
| 1990/1127 |
| |
| 1990/0427 |
| |
| 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 |
| |
| 1990/0427 |
| |
| 1990/0504 |
| |
| 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 | { | |
| 1990/0427 |
| |
| 1990/0504 |
| |
| 1992/0319 | int fd; Method *mp; char cmd[64]; char flags[6]; int islocal; char *bootfile; | |
| 1990/0424 | ||
| 1990/0427 |
| |
| 1992/0319 | sleep(1000); | |
| 1990/0424 | ||
| 1990/0504 |
| |
| 1992/0319 | open("#c/cons", OREAD); open("#c/cons", OWRITE); open("#c/cons", OWRITE); | |
| 1990/0504 | ||
| 1990/0427 |
| |
| 1990/0424 | ||
| 1990/1202 |
| |
| 1990/0427 |
| |
| 1990/1202 |
| |
| 1992/0319 | ARGBEGIN{ case 'u': strcpy(username, ARGF()); | |
| 1990/0427 | break; | |
| 1990/1202 |
| |
| 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 |
| |
| 1990/0427 |
| |
| 1990/1127 |
| |
| 1990/0504 |
| |
| 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 |
| |
| 1990/0424 |
| |
| 1990/1127 |
| |
| 1990/0911 |
| |
| 1990/1127 |
| |
| 1990/0424 | ||
| 1990/1127 |
| |
| 1990/0427 |
| |
| 1990/1127 |
| |
| 1990/0427 |
| |
| 1990/0424 | ||
| 1990/1127 |
| |
| 1990/0427 |
| |
| 1990/1127 |
| |
| 1990/0424 |
| |
| 1990/1127 |
| |
| 1992/0319 | * pick a method and initialize it | |
| 1990/0424 | */ | |
| 1990/1127 |
| |
| 1990/0427 |
| |
| 1990/1127 |
| |
| 1990/0427 |
| |
| 1990/1127 |
| |
| 1990/0427 |
| |
| 1990/1127 |
| |
| 1992/0319 | mp = rootserver(argc ? *argv : 0); (*mp->config)(mp); islocal = strcmp(mp->name, "local") == 0; | |
| 1990/1127 |
| |
| 1990/0427 |
| |
| 1990/0424 |
| |
| 1990/1127 |
| |
| 1992/0319 | * connect to the root file system | |
| 1990/0424 | */ | |
| 1991/1108 |
| |
| 1990/0427 |
| |
| 1991/1108 |
| |
| 1990/1127 |
| |
| 1990/0427 |
| |
| 1991/1108 |
| |
| 1990/0427 |
| |
| 1990/1127 |
| |
| 1991/1108 |
| |
| 1990/1127 |
| |
| 1990/0427 |
| |
| 1990/1127 |
| |
| 1990/1202 |
| |
| 1990/1127 |
| |
| 1990/1202 |
| |
| 1990/1127 |
| |
| 1990/0427 |
| |
| 1990/0424 |
| |
| 1991/1102 |
| |
| 1990/0424 |
| |
| 1990/0427 |
| |
| 1990/1127 |
| |
| 1990/0427 |
| |
| 1990/1127 |
| |
| 1990/0424 |
| |
| 1990/0427 |
| |
| 1990/1127 |
| |
| 1990/0424 |
| |
| 1990/0427 |
| |
| 1990/0424 |
| |
| 1990/0427 |
| |
| 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 |
| |
| 1990/1127 |
| |
| 1990/0424 |
| |
| 1991/1102 |
| |
| 1990/0424 |
| |
| 1990/0427 |
| |
| 1990/0424 |
| |
| 1990/0427 |
| |
| 1991/1102 |
| |
| 1990/0427 |
| |
| 1990/1127 |
| |
| 1990/0427 |
| |
| 1990/0424 |
| |
| 1990/1127 |
| |
| 1990/0424 |
| |
| 1990/0427 |
| |
| 1990/1127 |
| |
| 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); | |
| 1990/0504 |
| |
| 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 |
| |
| 1992/0319 | fatal("readconf"); | |
| 1990/0504 | close(fd); | |
| 1992/0319 | /* * read in real kernel */ | |
| 1990/0504 | print("%s...", bootfile); | |
| 1990/0427 |
| |
| 1992/0319 | while((fd = open(bootfile, OREAD)) < 0) | |
| 1990/1202 | outin("bootfile", bootfile, sizeof(bootfile)); | |
| 1990/0427 |
| |
| 1990/0424 | readkernel(fd); | |
| 1990/0427 |
| |
| 1992/0319 | fatal("couldn't read kernel"); | |
| 1990/0424 | } | |
| 1990/0427 | /* | |
| 1992/0319 | * ask user from whence cometh the root file system | |
| 1990/0427 | */ | |
| 1990/0424 |
| |
| 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 | ||
| 1990/1127 |
| |
| 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 |
| |
| 1990/0424 |
| |
| 1990/1127 |
| |
| 1990/0424 |
| |
| 1990/0427 |
| |
| 1990/0911 |
| |
| 1990/0427 |
| |
| 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 | } | |
| 1990/0911 |
| |
| 1990/0427 |
| |
| 1990/0504 |
| |
| 1991/1108/sys/src/9/power/bboot.c:472,481 – 1992/0319/sys/src/9/power/bboot.c:204,211 | ||
| 1990/0504 | * 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); | |
| 1991/1108/sys/src/9/power/bboot.c:489,498 – 1992/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 */ | |
| 1992/0319 | void | |
| 1990/0427 | readkernel(int fd) { int n; | |
| 1991/1108/sys/src/9/power/bboot.c:499,564 – 1992/0319/sys/src/9/power/bboot.c:230,287 | ||
| 1990/0427 | 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 | |
| 1990/1202 |
| |
| 1992/0319 | readseg(int in, int out, long inoff, long outoff, int len) | |
| 1990/0427 | { | |
| 1992/0319 | long n, i; | |
| 1990/0427 |
| |
| 1990/1202 |
| |
| 1990/0427 |
| |
| 1990/1202 |
| |
| 1992/0319 | if(seek(in, inoff, 0) < 0){ warning("seeking bootfile"); return -1; | |
| 1990/1202 | } | |
| 1990/0427 |
| |
| 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,67 – 1992/0322/sys/src/9/power/bboot.c:61,67 (short | long) | ||
| 1992/0319 | char cmd[64]; char flags[6]; int islocal; | |
| 1992/0322 | char bootfile[NAMELEN]; | |
| 1990/0424 | ||
| 1992/0319 | sleep(1000); | |
| 1990/0424 | ||
| 1992/0319/sys/src/9/power/bboot.c:88,96 – 1992/0322/sys/src/9/power/bboot.c:88,96 | ||
| 1992/0319 | 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 | |
| 1992/0319/sys/src/9/power/bboot.c:166,174 – 1992/0322/sys/src/9/power/bboot.c:166,173 | ||
| 1992/0319 | else strcpy(reply, method->name); for(;;){ | |
| 1992/0322 | if(mflag) | |
| 1992/0319 | outin(prompt, reply, sizeof(reply)); | |
| 1992/0322/sys/src/9/power/bboot.c:100,105 – 1992/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,297 – 1992/0522/sys/src/9/power/bboot.c:0 (short | long) | ||
|
Deleted.
rsc Mon Mar 7 10:32:28 2005 | ||
| 1990/0424 |
| |
| 1992/0319 |
| |
| 1990/0424 |
| |
| 1992/0319 |
| |
| 1990/0504 |
| |
| 1992/0319 |
| |
| 1990/0427 |
| |
| 1992/0319 |
| |
| 1990/0427 |
| |
| 1992/0319 |
| |
| 1990/0427 |
| |
| 1990/0424 |
| |
| 1992/0319 |
| |
| 1992/0322 |
| |
| 1990/0424 | ||
| 1992/0319 |
| |
| 1990/0424 | ||
| 1992/0319 |
| |
| 1990/0504 | ||
| 1992/0319 |
| |
| 1990/0427 |
| |
| 1992/0319 |
| |
| 1990/0427 |
| |
| 1992/0319 |
| |
| 1990/0424 | ||
| 1992/0319 |
| |
| 1992/0322 |
| |
| 1992/0319 |
| |
| 1992/0322 |
| |
| 1990/0424 |
| |
| 1992/0319 |
| |
| 1990/0424 |
| |
| 1992/0319 |
| |
| 1990/1127 | ||
| 1990/0424 |
| |
| 1992/0418 |
| |
| 1992/0319 |
| |
| 1990/0424 |
| |
| 1992/0319 |
| |
| 1990/0427 |
| |
| 1990/1127 | ||
| 1992/0319 |
| |
| 1990/0424 |
| |
| 1992/0319 |
| |
| 1990/0504 |
| |
| 1992/0319 |
| |
| 1990/1202 |
| |
| 1990/0504 |
| |
| 1992/0319 |
| |
| 1990/0504 |
| |
| 1992/0319 |
| |
| 1990/0504 |
| |
| 1992/0319 |
| |
| 1990/1202 |
| |
| 1990/0424 |
| |
| 1992/0319 |
| |
| 1990/0424 |
| |
| 1990/0427 |
| |
| 1992/0319 |
| |
| 1990/0427 |
| |
| 1992/0319 |
| |
| 1990/0427 |
| |
| 1992/0319 |
| |
| 1990/0427 | ||
| 1992/0319 |
| |
| 1990/0427 | ||
| 1992/0319 |
| |
| 1992/0322 |
| |
| 1992/0319 |
| |
| 1990/0427 |
| |
| 1990/0504 |
| |
| 1992/0319 |
| |
| 1990/0504 |
| |
| 1992/0319 | ||
| 1990/0504 |
| |
| 1990/0427 |
| |
| 1992/0319 |
| |
| 1990/0427 |
| |
| 1992/0319 |
| |
| 1990/0427 |
| |
| 1992/0319 |
| |
| 1990/0427 |
| |
| 1992/0319 |
| |
| 1990/0427 |
| |
| 1992/0319 |
| |
| 1990/0504 |
| |
| 1990/0427 |
| |
| 1992/0319 |
| |
| 1990/0427 | ||
| 1990/0504 |
| |
| 1990/0427 |
| |
| 1992/0319 |
| |
| 1990/0427 |
| |
| 1992/0319 |
| |
| 1990/0427 |
| |
| 1992/0319 |
| |
| 1990/0427 |
| |
| 1992/0319 |
| |
| 1990/0427 | ||
| 1992/0319 |
| |
| 1990/1202 |
| |
| 1992/0319 |
| |
| 1990/0424 |
| |
| 1992/0319 | ||