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