1 /* boot.c 1.1 86/01/12 */ 2 /* boot.c 6.1 83/07/29 */ 3 4 #include "../machine/mtpr.h" 5 6 #include "param.h" 7 #include "inode.h" 8 #include "fs.h" 9 #include "vm.h" 10 #include "saio.h" 11 #include "reboot.h" 12 13 #include <a.out.h> 14 15 /* 16 * Boot program... arguments passed in r10 and r11 determine 17 * whether boot stops to ask for system name and which device 18 * boot comes from. 19 */ 20 21 /* r11 = 0 -> automatic boot, load file '/vmunix' */ 22 /* r11 = 1 -> ask user for file to load */ 23 24 /* Types in r10 specifying major device */ 25 char devname[][3] = { 26 'f','s','d', /* 0 = fsd */ 27 's','m','d', /* 1 = smd or cmd */ 28 'x','f','d', /* 2 = xfd */ 29 'x','s','d', /* 2 = xsd */ 30 'c','y','p', /* 3 = cypher tape */ 31 }; 32 33 #ifdef FSD 34 char line[100] = "fsd(0,0)vmunix"; 35 #endif 36 #ifdef SMD 37 char line[100] = "smd(0,0)vmunix"; 38 #endif 39 #ifdef XFD 40 char line[100] = "xfd(0,0)vmunix"; 41 #endif 42 #ifdef XSD 43 char line[100] = "xsd(0,0)vmunix"; 44 #endif 45 #ifdef JUSTASK 46 char line[100]; 47 #endif 48 49 int retry = 0; 50 51 main() 52 { 53 register dummy; /* skip r12 */ 54 register howto, devtype; /* howto=r11, devtype=r10 */ 55 int io; 56 57 #ifdef lint 58 howto = 0; devtype = 0; 59 #endif 60 printf("\nBoot\n"); 61 #ifdef JUSTASK 62 howto = RB_ASKNAME|RB_SINGLE; 63 #endif 64 for (;;) { 65 if (howto & RB_ASKNAME) { 66 printf(": "); 67 gets(line); 68 } else 69 printf(": %s\n", line); 70 io = open(line, 0); 71 if (io >= 0) 72 copyunix(howto, io); 73 if (++retry > 2) 74 howto |= RB_SINGLE|RB_ASKNAME; 75 } 76 } 77 78 /*ARGSUSED*/ 79 copyunix(howto, io) 80 register io, howto; 81 { 82 struct exec x; 83 register int i; 84 char *addr; 85 86 i = read(io, (char *)&x, sizeof x); 87 if (i != sizeof x || 88 (x.a_magic != 0407 && x.a_magic != 0413 && x.a_magic != 0410)) 89 _stop("Bad format\n"); 90 printf("%d", x.a_text); 91 if (x.a_magic == 0413 && lseek(io, 0x400, 0) == -1) 92 goto shread; 93 if (read(io, (char *)0x800, x.a_text) != x.a_text) 94 goto shread; 95 addr = (char *)(x.a_text + 0x800); 96 if (x.a_magic == 0413 || x.a_magic == 0410) 97 while ((int)addr & CLOFSET) 98 *addr++ = 0; 99 printf("+%d", x.a_data); 100 if (read(io, addr, x.a_data) != x.a_data) 101 goto shread; 102 addr += x.a_data; 103 printf("+%d", x.a_bss); 104 x.a_bss += 32*1024; /* slop */ 105 for (i = 0; i < x.a_bss; i++) 106 *addr++ = 0; 107 x.a_entry &= 0x1fffffff; 108 printf(" start 0x%x\n", x.a_entry); 109 mtpr(PADC, 0); /* Purge data cache */ 110 mtpr(PACC, 0); /* Purge code cache */ 111 if ((howto & RB_DCOFF) == 0) 112 mtpr(DCR, 1); /* Enable data cache */ 113 (*((int (*)()) x.a_entry))(); 114 shread: 115 _stop("Short read\n"); 116 } 117