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