|
|
1.1 ! root 1: /* boot.c 7.4 90/06/30 */ ! 2: ! 3: #include "machine/mtpr.h" ! 4: ! 5: #include "sys/param.h" ! 6: #include "sys/time.h" ! 7: #include "sys/vm.h" ! 8: #include "sys/reboot.h" ! 9: #include "saio.h" ! 10: ! 11: #include <a.out.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: #define DEV_DFLT 1 /* vd/dk */ ! 20: /*#define DEV_DFLT 2 /* hd */ ! 21: ! 22: char line[100]; ! 23: ! 24: extern unsigned opendev; ! 25: extern unsigned bootdev; ! 26: ! 27: main() ! 28: { ! 29: register char *cp; /* skip r12 */ ! 30: register u_int howto, devtype; /* howto=r11, devtype=r10 */ ! 31: int io = 0, retry, type; ! 32: ! 33: #ifdef lint ! 34: howto = 0; devtype = 0; ! 35: #endif ! 36: if ((devtype & B_MAGICMASK) != B_DEVMAGIC) ! 37: devtype = DEV_DFLT << B_TYPESHIFT; /* unit, partition 0 */ ! 38: bootdev = devtype; ! 39: #ifdef JUSTASK ! 40: howto = RB_ASKNAME|RB_SINGLE; ! 41: #else ! 42: if ((howto & RB_ASKNAME) == 0) { ! 43: type = (devtype >> B_TYPESHIFT) & B_TYPEMASK; ! 44: if ((unsigned)type < ndevs && devsw[type].dv_name) ! 45: strcpy(line, UNIX); ! 46: else ! 47: howto |= RB_SINGLE|RB_ASKNAME; ! 48: } ! 49: #endif ! 50: for (retry = 0;;) { ! 51: if (io >= 0) ! 52: printf("\nBoot"); ! 53: if (howto & RB_ASKNAME) { ! 54: printf(": "); ! 55: gets(line); ! 56: if (line[0] == 0) { ! 57: strcpy(line, UNIX); ! 58: printf(": %s\n", line); ! 59: } ! 60: } else ! 61: printf(": %s\n", line); ! 62: io = open(line, 0); ! 63: if (io >= 0) { ! 64: copyunix(howto, opendev, io); ! 65: close(io); ! 66: howto |= RB_SINGLE|RB_ASKNAME; ! 67: } ! 68: if (++retry > 2) ! 69: howto |= RB_SINGLE|RB_ASKNAME; ! 70: } ! 71: } ! 72: ! 73: /*ARGSUSED*/ ! 74: copyunix(howto, devtype, io) ! 75: register io, howto, devtype; /* NOTE ORDER */ ! 76: { ! 77: register int esym; /* must be r9 */ ! 78: register int i; ! 79: register char *addr; ! 80: struct exec x; ! 81: ! 82: if (read(io, (char *)&x, sizeof(x)) != sizeof(x) || N_BADMAG(x)) { ! 83: printf("bad magic #\n"); ! 84: return; ! 85: } ! 86: printf("%ld", x.a_text); ! 87: if (x.a_magic == ZMAGIC && lseek(io, 0x400, 0) == -1) ! 88: goto shread; ! 89: if (read(io, (char *)RELOC, x.a_text) != x.a_text) ! 90: goto shread; ! 91: addr = (char *)(x.a_text + RELOC); ! 92: if (x.a_magic == ZMAGIC || x.a_magic == NMAGIC) ! 93: while ((int)addr & CLOFSET) ! 94: *addr++ = 0; ! 95: printf("+%ld", x.a_data); ! 96: if (read(io, addr, x.a_data) != x.a_data) ! 97: goto shread; ! 98: addr += x.a_data; ! 99: printf("+%ld", x.a_bss); ! 100: if (howto & RB_KDB && x.a_syms) { ! 101: for (i = 0; i < x.a_bss; i++) ! 102: *addr++ = 0; ! 103: *(int *)addr = x.a_syms; /* symbol table size */ ! 104: addr += sizeof (int); ! 105: printf("[+%ld", x.a_syms); ! 106: if (read(io, addr, x.a_syms) != x.a_syms) ! 107: goto shread; ! 108: addr += x.a_syms; ! 109: if (read(io, addr, sizeof (int)) != sizeof (int)) ! 110: goto shread; ! 111: i = *(int *)addr - sizeof (int); /* string table size */ ! 112: addr += sizeof (int); ! 113: printf("+%d]", i); ! 114: if (read(io, addr, i) != i) ! 115: goto shread; ! 116: addr += i; ! 117: esym = roundup((int)addr, sizeof (int)); ! 118: x.a_bss = 0; ! 119: } else ! 120: howto &= ~RB_KDB; ! 121: x.a_bss += 32*1024; /* slop */ ! 122: for (i = 0; i < x.a_bss; i++) ! 123: *addr++ = 0; ! 124: x.a_entry &= 0x1fffffff; ! 125: printf(" start 0x%lx\n", x.a_entry); ! 126: mtpr(PADC, 0); /* Purge data cache */ ! 127: mtpr(PACC, 0); /* Purge code cache */ ! 128: mtpr(DCR, 1); /* Enable data cache */ ! 129: (*((int (*)()) x.a_entry))(); ! 130: return; ! 131: shread: ! 132: printf("short read\n"); ! 133: return; ! 134: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.