1*30758Skarels /* boot.c 1.6 87/04/02 */ 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 2030177Skarels #define DEV_DFLT 1 /* vd/dk */ 2125865Ssam 22*30758Skarels #define UNIX "/vmunix" 2325865Ssam char line[100]; 2425865Ssam 2525865Ssam int retry = 0; 26*30758Skarels extern unsigned opendev; 27*30758Skarels extern unsigned bootdev; 2825865Ssam 2925865Ssam main() 3025865Ssam { 31*30758Skarels register char *cp; /* skip r12 */ 32*30758Skarels register unsigned howto, devtype; /* howto=r11, devtype=r10 */ 33*30758Skarels int io, type; 3425865Ssam 3525865Ssam #ifdef lint 3625865Ssam howto = 0; devtype = 0; 3725865Ssam #endif 38*30758Skarels if ((devtype & B_MAGICMASK) != B_DEVMAGIC) 39*30758Skarels devtype = DEV_DFLT << B_TYPESHIFT; /* unit, partition 0 */ 40*30758Skarels bootdev = devtype; 41*30758Skarels printf("\nBoot\n"); 4225865Ssam #ifdef JUSTASK 4325865Ssam howto = RB_ASKNAME|RB_SINGLE; 4429565Ssam #else 4529565Ssam if ((howto & RB_ASKNAME) == 0) { 46*30758Skarels type = (devtype >> B_TYPESHIFT) & B_TYPEMASK; 47*30758Skarels if ((unsigned)type < ndevs && devsw[type].dv_name[0]) 48*30758Skarels strcpy(line, UNIX); 49*30758Skarels else 50*30758Skarels howto |= RB_SINGLE|RB_ASKNAME; 5129565Ssam } 5225865Ssam #endif 5325865Ssam for (;;) { 5425865Ssam if (howto & RB_ASKNAME) { 5525865Ssam printf(": "); 5625865Ssam gets(line); 57*30758Skarels if (line[0] == 0) { 58*30758Skarels strcpy(line, UNIX); 59*30758Skarels printf(": %s\n", line); 60*30758Skarels } 6125865Ssam } else 6225865Ssam printf(": %s\n", line); 6325865Ssam io = open(line, 0); 6429565Ssam if (io >= 0) { 65*30758Skarels copyunix(howto, opendev, io); 6629565Ssam close(io); 67*30758Skarels howto |= RB_SINGLE|RB_ASKNAME; 6829565Ssam } 6925865Ssam if (++retry > 2) 7025865Ssam howto |= RB_SINGLE|RB_ASKNAME; 7125865Ssam } 7225865Ssam } 7325865Ssam 7425865Ssam /*ARGSUSED*/ 7529565Ssam copyunix(howto, devtype, io) 7629565Ssam register io, howto, devtype; /* NOTE ORDER */ 7725865Ssam { 7830182Ssam register int esym; /* must be r9 */ 7925865Ssam register int i; 8029565Ssam register char *addr; 8130182Ssam struct exec x; 8225865Ssam 8325865Ssam i = read(io, (char *)&x, sizeof x); 8425865Ssam if (i != sizeof x || 85*30758Skarels (x.a_magic != 0407 && x.a_magic != 0413 && x.a_magic != 0410)) { 86*30758Skarels printf("Bad format\n"); 87*30758Skarels return; 88*30758Skarels } 8925865Ssam printf("%d", x.a_text); 9025865Ssam if (x.a_magic == 0413 && lseek(io, 0x400, 0) == -1) 9125865Ssam goto shread; 9230307Skarels if (read(io, (char *)RELOC, x.a_text) != x.a_text) 9325865Ssam goto shread; 9430307Skarels addr = (char *)(x.a_text + RELOC); 9525865Ssam if (x.a_magic == 0413 || x.a_magic == 0410) 9625865Ssam while ((int)addr & CLOFSET) 9725865Ssam *addr++ = 0; 9825865Ssam printf("+%d", x.a_data); 9925865Ssam if (read(io, addr, x.a_data) != x.a_data) 10025865Ssam goto shread; 10125865Ssam addr += x.a_data; 10225865Ssam printf("+%d", x.a_bss); 10330182Ssam if (howto & RB_KDB && x.a_syms) { 10430182Ssam for (i = 0; i < x.a_bss; i++) 10530182Ssam *addr++ = 0; 10630182Ssam *(int *)addr = x.a_syms; /* symbol table size */ 10730182Ssam addr += sizeof (int); 10830182Ssam printf("[+%d", x.a_syms); 10930182Ssam if (read(io, addr, x.a_syms) != x.a_syms) 11030182Ssam goto shread; 11130182Ssam addr += x.a_syms; 11230182Ssam if (read(io, addr, sizeof (int)) != sizeof (int)) 11330182Ssam goto shread; 11430182Ssam i = *(int *)addr - sizeof (int); /* string table size */ 11530182Ssam addr += sizeof (int); 11630182Ssam printf("+%d]", i); 11730182Ssam if (read(io, addr, i) != i) 11830182Ssam goto shread; 11930182Ssam addr += i; 12030182Ssam esym = roundup((int)addr, sizeof (int)); 12130182Ssam x.a_bss = 0; 12230182Ssam } else 12330182Ssam howto &= ~RB_KDB; 12425865Ssam x.a_bss += 32*1024; /* slop */ 12525865Ssam for (i = 0; i < x.a_bss; i++) 12625865Ssam *addr++ = 0; 12725865Ssam x.a_entry &= 0x1fffffff; 12825865Ssam printf(" start 0x%x\n", x.a_entry); 12925865Ssam mtpr(PADC, 0); /* Purge data cache */ 13025865Ssam mtpr(PACC, 0); /* Purge code cache */ 13129565Ssam mtpr(DCR, 1); /* Enable data cache */ 13225865Ssam (*((int (*)()) x.a_entry))(); 13329565Ssam return; 13425865Ssam shread: 135*30758Skarels printf("Short read\n"); 136*30758Skarels return; 13725865Ssam } 138