1 /* boot.c 1.2 86/07/16 */ 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 /* Types in r10 specifying major device */ 21 char devname[][2] = { 22 #ifdef notyet 23 0, 0, /* 0 = ud */ 24 'd','k', /* 1 = vd */ 25 0, 0, /* 2 = xp */ 26 'c','y', /* 3 = cy */ 27 #else 28 'd','k', /* default = vd */ 29 #endif 30 }; 31 #define MAXTYPE (sizeof(devname) / sizeof(devname[0])) 32 33 #define UNIX "vmunix" 34 char line[100]; 35 36 int retry = 0; 37 38 main() 39 { 40 register dummy; /* skip r12 */ 41 register howto, devtype; /* howto=r11, devtype=r10 */ 42 int io, i; 43 register type, part, unit; 44 register char *cp; 45 long atol(); 46 47 48 #ifdef lint 49 howto = 0; devtype = 0; 50 #endif 51 #ifdef JUSTASK 52 howto = RB_ASKNAME|RB_SINGLE; 53 #else 54 type = (devtype >> B_TYPESHIFT) & B_TYPEMASK; 55 unit = (devtype >> B_UNITSHIFT) & B_UNITMASK; 56 unit += 8 * ((devtype >> B_ADAPTORSHIFT) & B_ADAPTORMASK); 57 part = (devtype >> B_PARTITIONSHIFT) & B_PARTITIONMASK; 58 if ((howto & RB_ASKNAME) == 0) { 59 if (type >= 0 && type <= MAXTYPE && devname[type][0]) { 60 cp = line; 61 *cp++ = devname[type][0]; 62 *cp++ = devname[type][1]; 63 *cp++ = '('; 64 if (unit >= 10) 65 *cp++ = unit / 10 + '0'; 66 *cp++ = unit % 10 + '0'; 67 *cp++ = ','; 68 *cp++ = part + '0'; 69 *cp++ = ')'; 70 strcpy(cp, UNIX); 71 } else 72 howto = RB_SINGLE|RB_ASKNAME; 73 } 74 #endif 75 for (;;) { 76 printf("\nBoot\n"); 77 if (howto & RB_ASKNAME) { 78 printf(": "); 79 gets(line); 80 } else 81 printf(": %s\n", line); 82 io = open(line, 0); 83 if (io >= 0) { 84 if (howto & RB_ASKNAME) { 85 /* 86 * Build up devtype register to pass on to 87 * booted program. 88 */ 89 cp = line; 90 for (i = 0; i <= MAXTYPE; i++) 91 if ((devname[i][0] == cp[0]) && 92 (devname[i][1] == cp[1])) 93 break; 94 if (i <= MAXTYPE) { 95 devtype = i << B_TYPESHIFT; 96 cp += 3; 97 i = *cp++ - '0'; 98 if (*cp >= '0' && *cp <= '9') 99 i = i * 10 + *cp++ - '0'; 100 cp++; 101 devtype |= ((i % 8) << B_UNITSHIFT); 102 devtype |= ((i / 8) << B_ADAPTORSHIFT); 103 devtype |= atol(cp) << B_PARTITIONSHIFT; 104 } 105 } 106 devtype |= B_DEVMAGIC; 107 copyunix(howto, devtype, io); 108 close(io); 109 howto = RB_SINGLE|RB_ASKNAME; 110 } 111 if (++retry > 2) 112 howto |= RB_SINGLE|RB_ASKNAME; 113 } 114 } 115 116 /*ARGSUSED*/ 117 copyunix(howto, devtype, io) 118 register io, howto, devtype; /* NOTE ORDER */ 119 { 120 struct exec x; 121 register int i; 122 register char *addr; 123 124 i = read(io, (char *)&x, sizeof x); 125 if (i != sizeof x || 126 (x.a_magic != 0407 && x.a_magic != 0413 && x.a_magic != 0410)) 127 _stop("Bad format\n"); 128 printf("%d", x.a_text); 129 if (x.a_magic == 0413 && lseek(io, 0x400, 0) == -1) 130 goto shread; 131 if (read(io, (char *)0x800, x.a_text) != x.a_text) 132 goto shread; 133 addr = (char *)(x.a_text + 0x800); 134 if (x.a_magic == 0413 || x.a_magic == 0410) 135 while ((int)addr & CLOFSET) 136 *addr++ = 0; 137 printf("+%d", x.a_data); 138 if (read(io, addr, x.a_data) != x.a_data) 139 goto shread; 140 addr += x.a_data; 141 printf("+%d", x.a_bss); 142 x.a_bss += 32*1024; /* slop */ 143 for (i = 0; i < x.a_bss; i++) 144 *addr++ = 0; 145 x.a_entry &= 0x1fffffff; 146 printf(" start 0x%x\n", x.a_entry); 147 mtpr(PADC, 0); /* Purge data cache */ 148 mtpr(PACC, 0); /* Purge code cache */ 149 mtpr(DCR, 1); /* Enable data cache */ 150 (*((int (*)()) x.a_entry))(); 151 return; 152 shread: 153 _stop("Short read\n"); 154 } 155