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