1*37504Smckusick /* boot.c 1.8 89/04/25 */ 225865Ssam 3*37504Smckusick #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 2225865Ssam char line[100]; 2325865Ssam 2430758Skarels extern unsigned opendev; 2530758Skarels extern unsigned bootdev; 2625865Ssam 2725865Ssam main() 2825865Ssam { 2930758Skarels register char *cp; /* skip r12 */ 3033652Sbostic register u_int howto, devtype; /* howto=r11, devtype=r10 */ 3133652Sbostic int io, retry, type; 3225865Ssam 3325865Ssam #ifdef lint 3425865Ssam howto = 0; devtype = 0; 3525865Ssam #endif 3630758Skarels if ((devtype & B_MAGICMASK) != B_DEVMAGIC) 3730758Skarels devtype = DEV_DFLT << B_TYPESHIFT; /* unit, partition 0 */ 3830758Skarels bootdev = devtype; 3930758Skarels printf("\nBoot\n"); 4025865Ssam #ifdef JUSTASK 4125865Ssam howto = RB_ASKNAME|RB_SINGLE; 4229565Ssam #else 4329565Ssam if ((howto & RB_ASKNAME) == 0) { 4430758Skarels type = (devtype >> B_TYPESHIFT) & B_TYPEMASK; 4533652Sbostic if ((unsigned)type < ndevs && devsw[type].dv_name) 4630758Skarels strcpy(line, UNIX); 4730758Skarels else 4830758Skarels howto |= RB_SINGLE|RB_ASKNAME; 4929565Ssam } 5025865Ssam #endif 5133652Sbostic for (retry = 0;;) { 5225865Ssam if (howto & RB_ASKNAME) { 5325865Ssam printf(": "); 5425865Ssam gets(line); 5530758Skarels if (line[0] == 0) { 5630758Skarels strcpy(line, UNIX); 5730758Skarels printf(": %s\n", line); 5830758Skarels } 5925865Ssam } else 6025865Ssam printf(": %s\n", line); 6125865Ssam io = open(line, 0); 6229565Ssam if (io >= 0) { 6330758Skarels copyunix(howto, opendev, io); 6429565Ssam close(io); 6530758Skarels howto |= RB_SINGLE|RB_ASKNAME; 6629565Ssam } 6725865Ssam if (++retry > 2) 6825865Ssam howto |= RB_SINGLE|RB_ASKNAME; 6925865Ssam } 7025865Ssam } 7125865Ssam 7225865Ssam /*ARGSUSED*/ 7329565Ssam copyunix(howto, devtype, io) 7429565Ssam register io, howto, devtype; /* NOTE ORDER */ 7525865Ssam { 7630182Ssam register int esym; /* must be r9 */ 7725865Ssam register int i; 7829565Ssam register char *addr; 7930182Ssam struct exec x; 8025865Ssam 8125865Ssam i = read(io, (char *)&x, sizeof x); 8225865Ssam if (i != sizeof x || 8330758Skarels (x.a_magic != 0407 && x.a_magic != 0413 && x.a_magic != 0410)) { 8430758Skarels printf("Bad format\n"); 8530758Skarels return; 8630758Skarels } 8725865Ssam printf("%d", x.a_text); 8825865Ssam if (x.a_magic == 0413 && lseek(io, 0x400, 0) == -1) 8925865Ssam goto shread; 9030307Skarels if (read(io, (char *)RELOC, x.a_text) != x.a_text) 9125865Ssam goto shread; 9230307Skarels addr = (char *)(x.a_text + RELOC); 9325865Ssam if (x.a_magic == 0413 || x.a_magic == 0410) 9425865Ssam while ((int)addr & CLOFSET) 9525865Ssam *addr++ = 0; 9625865Ssam printf("+%d", x.a_data); 9725865Ssam if (read(io, addr, x.a_data) != x.a_data) 9825865Ssam goto shread; 9925865Ssam addr += x.a_data; 10025865Ssam printf("+%d", x.a_bss); 10130182Ssam if (howto & RB_KDB && x.a_syms) { 10230182Ssam for (i = 0; i < x.a_bss; i++) 10330182Ssam *addr++ = 0; 10430182Ssam *(int *)addr = x.a_syms; /* symbol table size */ 10530182Ssam addr += sizeof (int); 10630182Ssam printf("[+%d", x.a_syms); 10730182Ssam if (read(io, addr, x.a_syms) != x.a_syms) 10830182Ssam goto shread; 10930182Ssam addr += x.a_syms; 11030182Ssam if (read(io, addr, sizeof (int)) != sizeof (int)) 11130182Ssam goto shread; 11230182Ssam i = *(int *)addr - sizeof (int); /* string table size */ 11330182Ssam addr += sizeof (int); 11430182Ssam printf("+%d]", i); 11530182Ssam if (read(io, addr, i) != i) 11630182Ssam goto shread; 11730182Ssam addr += i; 11830182Ssam esym = roundup((int)addr, sizeof (int)); 11930182Ssam x.a_bss = 0; 12030182Ssam } else 12130182Ssam howto &= ~RB_KDB; 12225865Ssam x.a_bss += 32*1024; /* slop */ 12325865Ssam for (i = 0; i < x.a_bss; i++) 12425865Ssam *addr++ = 0; 12525865Ssam x.a_entry &= 0x1fffffff; 12625865Ssam printf(" start 0x%x\n", x.a_entry); 12725865Ssam mtpr(PADC, 0); /* Purge data cache */ 12825865Ssam mtpr(PACC, 0); /* Purge code cache */ 12929565Ssam mtpr(DCR, 1); /* Enable data cache */ 13025865Ssam (*((int (*)()) x.a_entry))(); 13129565Ssam return; 13225865Ssam shread: 13330758Skarels printf("Short read\n"); 13430758Skarels return; 13525865Ssam } 136