1*29565Ssam /* boot.c 1.2 86/07/16 */ 225865Ssam 325865Ssam #include "../machine/mtpr.h" 425865Ssam 525865Ssam #include "param.h" 625865Ssam #include "inode.h" 725865Ssam #include "fs.h" 825865Ssam #include "vm.h" 925865Ssam #include "saio.h" 1025865Ssam #include "reboot.h" 1125865Ssam 1225865Ssam #include <a.out.h> 1325865Ssam 1425865Ssam /* 1525865Ssam * Boot program... arguments passed in r10 and r11 determine 1625865Ssam * whether boot stops to ask for system name and which device 1725865Ssam * boot comes from. 1825865Ssam */ 1925865Ssam 2025865Ssam /* Types in r10 specifying major device */ 21*29565Ssam char devname[][2] = { 22*29565Ssam #ifdef notyet 23*29565Ssam 0, 0, /* 0 = ud */ 24*29565Ssam 'd','k', /* 1 = vd */ 25*29565Ssam 0, 0, /* 2 = xp */ 26*29565Ssam 'c','y', /* 3 = cy */ 27*29565Ssam #else 28*29565Ssam 'd','k', /* default = vd */ 29*29565Ssam #endif 3025865Ssam }; 31*29565Ssam #define MAXTYPE (sizeof(devname) / sizeof(devname[0])) 3225865Ssam 33*29565Ssam #define UNIX "vmunix" 3425865Ssam char line[100]; 3525865Ssam 3625865Ssam int retry = 0; 3725865Ssam 3825865Ssam main() 3925865Ssam { 4025865Ssam register dummy; /* skip r12 */ 4125865Ssam register howto, devtype; /* howto=r11, devtype=r10 */ 42*29565Ssam int io, i; 43*29565Ssam register type, part, unit; 44*29565Ssam register char *cp; 45*29565Ssam long atol(); 4625865Ssam 47*29565Ssam 4825865Ssam #ifdef lint 4925865Ssam howto = 0; devtype = 0; 5025865Ssam #endif 5125865Ssam #ifdef JUSTASK 5225865Ssam howto = RB_ASKNAME|RB_SINGLE; 53*29565Ssam #else 54*29565Ssam type = (devtype >> B_TYPESHIFT) & B_TYPEMASK; 55*29565Ssam unit = (devtype >> B_UNITSHIFT) & B_UNITMASK; 56*29565Ssam unit += 8 * ((devtype >> B_ADAPTORSHIFT) & B_ADAPTORMASK); 57*29565Ssam part = (devtype >> B_PARTITIONSHIFT) & B_PARTITIONMASK; 58*29565Ssam if ((howto & RB_ASKNAME) == 0) { 59*29565Ssam if (type >= 0 && type <= MAXTYPE && devname[type][0]) { 60*29565Ssam cp = line; 61*29565Ssam *cp++ = devname[type][0]; 62*29565Ssam *cp++ = devname[type][1]; 63*29565Ssam *cp++ = '('; 64*29565Ssam if (unit >= 10) 65*29565Ssam *cp++ = unit / 10 + '0'; 66*29565Ssam *cp++ = unit % 10 + '0'; 67*29565Ssam *cp++ = ','; 68*29565Ssam *cp++ = part + '0'; 69*29565Ssam *cp++ = ')'; 70*29565Ssam strcpy(cp, UNIX); 71*29565Ssam } else 72*29565Ssam howto = RB_SINGLE|RB_ASKNAME; 73*29565Ssam } 7425865Ssam #endif 7525865Ssam for (;;) { 76*29565Ssam printf("\nBoot\n"); 7725865Ssam if (howto & RB_ASKNAME) { 7825865Ssam printf(": "); 7925865Ssam gets(line); 8025865Ssam } else 8125865Ssam printf(": %s\n", line); 8225865Ssam io = open(line, 0); 83*29565Ssam if (io >= 0) { 84*29565Ssam if (howto & RB_ASKNAME) { 85*29565Ssam /* 86*29565Ssam * Build up devtype register to pass on to 87*29565Ssam * booted program. 88*29565Ssam */ 89*29565Ssam cp = line; 90*29565Ssam for (i = 0; i <= MAXTYPE; i++) 91*29565Ssam if ((devname[i][0] == cp[0]) && 92*29565Ssam (devname[i][1] == cp[1])) 93*29565Ssam break; 94*29565Ssam if (i <= MAXTYPE) { 95*29565Ssam devtype = i << B_TYPESHIFT; 96*29565Ssam cp += 3; 97*29565Ssam i = *cp++ - '0'; 98*29565Ssam if (*cp >= '0' && *cp <= '9') 99*29565Ssam i = i * 10 + *cp++ - '0'; 100*29565Ssam cp++; 101*29565Ssam devtype |= ((i % 8) << B_UNITSHIFT); 102*29565Ssam devtype |= ((i / 8) << B_ADAPTORSHIFT); 103*29565Ssam devtype |= atol(cp) << B_PARTITIONSHIFT; 104*29565Ssam } 105*29565Ssam } 106*29565Ssam devtype |= B_DEVMAGIC; 107*29565Ssam copyunix(howto, devtype, io); 108*29565Ssam close(io); 109*29565Ssam howto = RB_SINGLE|RB_ASKNAME; 110*29565Ssam } 11125865Ssam if (++retry > 2) 11225865Ssam howto |= RB_SINGLE|RB_ASKNAME; 11325865Ssam } 11425865Ssam } 11525865Ssam 11625865Ssam /*ARGSUSED*/ 117*29565Ssam copyunix(howto, devtype, io) 118*29565Ssam register io, howto, devtype; /* NOTE ORDER */ 11925865Ssam { 12025865Ssam struct exec x; 12125865Ssam register int i; 122*29565Ssam register char *addr; 12325865Ssam 12425865Ssam i = read(io, (char *)&x, sizeof x); 12525865Ssam if (i != sizeof x || 12625865Ssam (x.a_magic != 0407 && x.a_magic != 0413 && x.a_magic != 0410)) 12725865Ssam _stop("Bad format\n"); 12825865Ssam printf("%d", x.a_text); 12925865Ssam if (x.a_magic == 0413 && lseek(io, 0x400, 0) == -1) 13025865Ssam goto shread; 13125865Ssam if (read(io, (char *)0x800, x.a_text) != x.a_text) 13225865Ssam goto shread; 13325865Ssam addr = (char *)(x.a_text + 0x800); 13425865Ssam if (x.a_magic == 0413 || x.a_magic == 0410) 13525865Ssam while ((int)addr & CLOFSET) 13625865Ssam *addr++ = 0; 13725865Ssam printf("+%d", x.a_data); 13825865Ssam if (read(io, addr, x.a_data) != x.a_data) 13925865Ssam goto shread; 14025865Ssam addr += x.a_data; 14125865Ssam printf("+%d", x.a_bss); 14225865Ssam x.a_bss += 32*1024; /* slop */ 14325865Ssam for (i = 0; i < x.a_bss; i++) 14425865Ssam *addr++ = 0; 14525865Ssam x.a_entry &= 0x1fffffff; 14625865Ssam printf(" start 0x%x\n", x.a_entry); 14725865Ssam mtpr(PADC, 0); /* Purge data cache */ 14825865Ssam mtpr(PACC, 0); /* Purge code cache */ 149*29565Ssam mtpr(DCR, 1); /* Enable data cache */ 15025865Ssam (*((int (*)()) x.a_entry))(); 151*29565Ssam return; 15225865Ssam shread: 15325865Ssam _stop("Short read\n"); 15425865Ssam } 155