|
|
1.1 ! root 1: /* boot.c 4.6 81/12/01 */ ! 2: ! 3: #include "../h/param.h" ! 4: #include "../h/ino.h" ! 5: #include "../h/inode.h" ! 6: #include "../h/filsys.h" ! 7: #include "../h/dir.h" ! 8: #include "../h/vm.h" ! 9: #include <a.out.h> ! 10: #include "saio.h" ! 11: #include <sys/reboot.h> ! 12: ! 13: /* ! 14: * Boot program... arguments passed in r10 and r11 determine ! 15: * whether boot stops to ask for system name and which device ! 16: * boot comes from. ! 17: */ ! 18: ! 19: /* Types in r10 specifying major device */ ! 20: char devname[][2] = { ! 21: 'h','p', /* 0 = hp */ ! 22: 0,0, /* 1 = ht */ ! 23: 'u','p', /* 2 = up */ ! 24: 'h','k', /* 3 = hk */ ! 25: 0,0, /* 4 = sw */ ! 26: 0,0, /* 5 = tm */ ! 27: 0,0, /* 6 = ts */ ! 28: 0,0, /* 7 = mt */ ! 29: 0,0, /* 8 = tu */ ! 30: 'r','a', /* 9 = ra */ ! 31: }; ! 32: ! 33: char line[100] = "xx(0,0)vmunix"; ! 34: ! 35: int retry = 0; ! 36: ! 37: main() ! 38: { ! 39: register howto, devtype; /* howto=r11, devtype=r10 */ ! 40: int io; ! 41: ! 42: #ifdef lint ! 43: howto = 0; devtype = 0; ! 44: #endif ! 45: printf("\nBoot\n"); ! 46: #ifdef JUSTASK ! 47: howto = RB_ASKNAME|RB_SINGLE; ! 48: #else ! 49: if ((howto&RB_ASKNAME)==0) { ! 50: if (devtype>=0 && devtype<sizeof(devname)/2 ! 51: && devname[devtype][0]) { ! 52: line[0] = devname[devtype][0]; ! 53: line[1] = devname[devtype][1]; ! 54: } else ! 55: howto = RB_SINGLE|RB_ASKNAME; ! 56: } ! 57: #endif ! 58: for (;;) { ! 59: if (howto & RB_ASKNAME) { ! 60: printf(": "); ! 61: gets(line); ! 62: } else ! 63: printf(": %s\n", line); ! 64: io = open(line, 0); ! 65: if (io >= 0) ! 66: copyunix(howto, io); ! 67: if (++retry > 2) ! 68: howto = RB_SINGLE|RB_ASKNAME; ! 69: } ! 70: } ! 71: ! 72: /*ARGSUSED*/ ! 73: copyunix(howto, io) ! 74: register howto, io; ! 75: { ! 76: struct exec x; ! 77: register int i; ! 78: char *addr; ! 79: ! 80: i = read(io, (char *)&x, sizeof x); ! 81: if (i != sizeof x || x.a_magic != 0410) ! 82: _stop("Bad format\n"); ! 83: printf("%d", x.a_text); ! 84: if (read(io, (char *)0, x.a_text) != x.a_text) ! 85: goto shread; ! 86: addr = (char *)x.a_text; ! 87: while ((int)addr & CLOFSET) ! 88: *addr++ = 0; ! 89: printf("+%d", x.a_data); ! 90: if (read(io, addr, x.a_data) != x.a_data) ! 91: goto shread; ! 92: addr += x.a_data; ! 93: printf("+%d", x.a_bss); ! 94: x.a_bss += 128*512; /* slop */ ! 95: for (i = 0; i < x.a_bss; i++) ! 96: *addr++ = 0; ! 97: x.a_entry &= 0x7fffffff; ! 98: printf(" start 0x%x\n", x.a_entry); ! 99: (*((int (*)()) x.a_entry))(); ! 100: _exit(); ! 101: shread: ! 102: _stop("Short read\n"); ! 103: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.