|
|
1.1 ! root 1: /* boot.c 4.4 81/03/22 */ ! 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: }; ! 26: ! 27: char line[100] = "xx(0,0)vmunix"; ! 28: ! 29: int retry = 0; ! 30: ! 31: main() ! 32: { ! 33: register howto, devtype; /* howto=r11, devtype=r10 */ ! 34: int io; ! 35: ! 36: #ifdef lint ! 37: howto = 0; devtype = 0; ! 38: #endif ! 39: printf("\nBoot\n"); ! 40: #ifdef JUSTASK ! 41: howto = RB_ASKNAME|RB_SINGLE; ! 42: #else ! 43: if ((howto&RB_ASKNAME)==0) { ! 44: if (devtype>=0 && devtype<sizeof(devname)/2 ! 45: && devname[devtype][0]) { ! 46: line[0] = devname[devtype][0]; ! 47: line[1] = devname[devtype][1]; ! 48: } else ! 49: howto = RB_SINGLE|RB_ASKNAME; ! 50: } ! 51: #endif ! 52: for (;;) { ! 53: if (howto & RB_ASKNAME) { ! 54: printf(": "); ! 55: gets(line); ! 56: } else ! 57: printf(": %s\n", line); ! 58: io = open(line, 0); ! 59: if (io >= 0) ! 60: copyunix(howto, io); ! 61: if (++retry > 2) ! 62: howto = RB_SINGLE|RB_ASKNAME; ! 63: } ! 64: } ! 65: ! 66: /*ARGSUSED*/ ! 67: copyunix(howto, io) ! 68: register howto, io; ! 69: { ! 70: struct exec x; ! 71: register int i; ! 72: char *addr; ! 73: ! 74: i = read(io, (char *)&x, sizeof x); ! 75: if (i != sizeof x || x.a_magic != 0410) ! 76: _stop("Bad format\n"); ! 77: printf("%d", x.a_text); ! 78: if (read(io, (char *)0, x.a_text) != x.a_text) ! 79: goto shread; ! 80: addr = (char *)x.a_text; ! 81: while ((int)addr & CLOFSET) ! 82: *addr++ = 0; ! 83: printf("+%d", x.a_data); ! 84: if (read(io, addr, x.a_data) != x.a_data) ! 85: goto shread; ! 86: addr += x.a_data; ! 87: printf("+%d", x.a_bss); ! 88: x.a_bss += 128*512; /* slop */ ! 89: for (i = 0; i < x.a_bss; i++) ! 90: *addr++ = 0; ! 91: x.a_entry &= 0x7fffffff; ! 92: printf(" start 0x%x\n", x.a_entry); ! 93: (*((int (*)()) x.a_entry))(); ! 94: _exit(); ! 95: shread: ! 96: _stop("Short read\n"); ! 97: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.