|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1982, 1986 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: * ! 6: * @(#)bootup.c 7.1 (Berkeley) 6/5/86 ! 7: */ ! 8: ! 9: #include "../h/param.h" ! 10: #include "../h/inode.h" ! 11: #include "../h/fs.h" ! 12: #include "../h/vm.h" ! 13: #include <a.out.h> ! 14: #include "saio.h" ! 15: #include "../h/reboot.h" ! 16: ! 17: char bootprog[20] = "up(0,0)boot"; ! 18: ! 19: /* ! 20: * Boot program... arguments passed in r10 and r11 ! 21: * are passed through to the full boot program. ! 22: */ ! 23: ! 24: main() ! 25: { ! 26: register unsigned howto, devtype; /* howto=r11, devtype=r10 */ ! 27: int io, unit, partition; ! 28: register char *cp; ! 29: ! 30: #ifdef lint ! 31: howto = 0; devtype = 0; ! 32: #endif ! 33: unit = (devtype >> B_UNITSHIFT) & B_UNITMASK; ! 34: unit += 8 * ((devtype >> B_ADAPTORSHIFT) & B_ADAPTORMASK); ! 35: partition = (devtype >> B_PARTITIONSHIFT) & B_PARTITIONMASK; ! 36: cp = bootprog + 3; ! 37: if (unit >= 10) ! 38: *cp++ = unit / 10 + '0'; ! 39: *cp++ = unit % 10 + '0'; ! 40: *cp++ = ','; ! 41: if (partition >= 10) ! 42: *cp++ = partition / 10 + '0'; ! 43: *cp++ = partition % 10 + '0'; ! 44: bcopy((caddr_t) ")boot", cp, 6); ! 45: printf("loading %s\n", bootprog); ! 46: io = open(bootprog, 0); ! 47: if (io >= 0) ! 48: copyunix(howto, devtype, io); ! 49: _stop("boot failed\n"); ! 50: } ! 51: ! 52: /*ARGSUSED*/ ! 53: copyunix(howto, devtype, io) ! 54: register howto, devtype, io; /* howto=r11, devtype=r10 */ ! 55: { ! 56: struct exec x; ! 57: register int i; ! 58: char *addr; ! 59: ! 60: i = read(io, (char *)&x, sizeof x); ! 61: if (i != sizeof x || ! 62: (x.a_magic != 0407 && x.a_magic != 0413 && x.a_magic != 0410)) ! 63: _stop("Bad format\n"); ! 64: if ((x.a_magic == 0413 || x.a_magic == 0410) && ! 65: lseek(io, 0x400, 0) == -1) ! 66: goto shread; ! 67: if (read(io, (char *)0, x.a_text) != x.a_text) ! 68: goto shread; ! 69: addr = (char *)x.a_text; ! 70: if (x.a_magic == 0413 || x.a_magic == 0410) ! 71: while ((int)addr & CLOFSET) ! 72: *addr++ = 0; ! 73: if (read(io, addr, x.a_data) != x.a_data) ! 74: goto shread; ! 75: addr += x.a_data; ! 76: x.a_bss += 128*512; /* slop */ ! 77: for (i = 0; i < x.a_bss; i++) ! 78: *addr++ = 0; ! 79: x.a_entry &= 0x7fffffff; ! 80: (*((int (*)()) x.a_entry))(); ! 81: return; ! 82: shread: ! 83: _stop("Short read\n"); ! 84: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.