149113Sbostic /*- 241488Smckusick * Copyright (c) 1982, 1986, 1990 The Regents of the University of California. 341488Smckusick * All rights reserved. 441488Smckusick * 541488Smckusick * %sccs.include.redist.c% 641488Smckusick * 7*57299Shibler * @(#)boot.c 7.7 (Berkeley) 12/26/92 841488Smckusick */ 941488Smckusick 1056510Sbostic #include <sys/param.h> 1156510Sbostic #include <sys/reboot.h> 1241488Smckusick #include <a.out.h> 1356510Sbostic #include <stand/saio.h> 1441488Smckusick 1541488Smckusick #ifndef INSECURE 1656510Sbostic #include <sys/stat.h> 1741488Smckusick struct stat sb; 1841488Smckusick #endif 1941488Smckusick 2054073Shibler #define PRTCPU /* print out cpu type */ 2154073Shibler 2241488Smckusick /* 2354073Shibler * Boot program... bits in `howto' determine whether boot stops to 2454073Shibler * ask for system name. Boot device is derived from ROM provided 2554073Shibler * information. 2641488Smckusick */ 2741488Smckusick 2841488Smckusick char line[100]; 2941488Smckusick 3054073Shibler extern unsigned opendev; 3141488Smckusick extern char *lowram; 3241488Smckusick extern int noconsole; 3354073Shibler extern int howto, bootdev; 3441488Smckusick 3554073Shibler #ifdef PRTCPU 3656510Sbostic #include <hp300/stand/samachdep.h> 3754073Shibler #endif 3841488Smckusick 3941488Smckusick main() 4041488Smckusick { 4141488Smckusick register char *cp; 4254073Shibler int io, retry, type; 4354073Shibler #ifdef PRTCPU 4454073Shibler extern int machineid; 4541488Smckusick 4654073Shibler printf("\nHP"); 4754073Shibler switch (machineid) { 4854073Shibler case HP_320: 4954073Shibler cp = "320"; break; 5054073Shibler case HP_330: 5154073Shibler cp = "318/319/330"; break; 5254073Shibler case HP_340: 5354073Shibler cp = "340"; break; 5454073Shibler case HP_350: 5554073Shibler cp = "350"; break; 5654073Shibler case HP_360: 5754073Shibler cp = "360"; break; 5854073Shibler case HP_370: 5954073Shibler cp = "370"; break; 6054073Shibler case HP_375: 6154073Shibler cp = "345/375/400"; break; 6254073Shibler case HP_380: 6354073Shibler cp = "380/425"; break; 64*57299Shibler case HP_433: 65*57299Shibler cp = "433"; break; 6654073Shibler default: 6754073Shibler cp = "???"; break; 6854073Shibler } 6954073Shibler printf("%s CPU\nBoot\n", cp); 7054073Shibler #else 7141488Smckusick printf("\nBoot\n"); 7254073Shibler #endif 7341488Smckusick #ifdef JUSTASK 7441488Smckusick howto = RB_ASKNAME|RB_SINGLE; 7541488Smckusick #else 7641488Smckusick if ((howto & RB_ASKNAME) == 0) { 7754073Shibler type = (bootdev >> B_TYPESHIFT) & B_TYPEMASK; 7854073Shibler if ((unsigned)type < ndevs && devsw[type].dv_name) 7954073Shibler strcpy(line, UNIX); 8054073Shibler else 8154073Shibler howto |= RB_SINGLE|RB_ASKNAME; 8241488Smckusick } 8341488Smckusick #endif 8454073Shibler for (retry = 0;;) { 8541488Smckusick if (!noconsole && (howto & RB_ASKNAME)) { 8641488Smckusick printf(": "); 8741488Smckusick gets(line); 8854073Shibler if (line[0] == 0) { 8954073Shibler strcpy(line, UNIX); 9054073Shibler printf(": %s\n", line); 9154073Shibler } 9241488Smckusick } else 9341488Smckusick printf(": %s\n", line); 9441488Smckusick io = open(line, 0); 9541488Smckusick if (io >= 0) { 9641488Smckusick #ifndef INSECURE 9741488Smckusick (void) fstat(io, &sb); 9841488Smckusick if (sb.st_uid || (sb.st_mode & 2)) { 9941488Smckusick printf("non-secure file, will not load\n"); 10054073Shibler close(io); 10141488Smckusick howto = RB_SINGLE|RB_ASKNAME; 10241488Smckusick continue; 10341488Smckusick } 10441488Smckusick #endif 10554073Shibler copyunix(howto, opendev, io); 10641488Smckusick close(io); 10754073Shibler howto |= RB_SINGLE|RB_ASKNAME; 10841488Smckusick } 10941488Smckusick if (++retry > 2) 11054073Shibler howto |= RB_SINGLE|RB_ASKNAME; 11141488Smckusick } 11241488Smckusick } 11341488Smckusick 11441488Smckusick /*ARGSUSED*/ 11541488Smckusick copyunix(howto, devtype, io) 11654073Shibler register int howto; /* d7 contains boot flags */ 11754073Shibler register u_int devtype; /* d6 contains boot device */ 11854073Shibler register int io; 11941488Smckusick { 12041488Smckusick struct exec x; 12141488Smckusick register int i; 12241488Smckusick register char *load; /* a5 contains load addr for unix */ 12341488Smckusick register char *addr; 12441488Smckusick 12554073Shibler i = read(io, (char *)&x, sizeof(x)); 12654073Shibler if (i != sizeof(x) || 12754073Shibler (x.a_magic != OMAGIC && x.a_magic != ZMAGIC && x.a_magic != NMAGIC)) { 12854073Shibler printf("Bad format\n"); 12954073Shibler return; 13054073Shibler } 13141488Smckusick printf("%d", x.a_text); 13254073Shibler if (x.a_magic == ZMAGIC && lseek(io, 0x400, L_SET) == -1) 13341488Smckusick goto shread; 13441488Smckusick load = addr = lowram; 13541488Smckusick if (read(io, (char *)addr, x.a_text) != x.a_text) 13641488Smckusick goto shread; 13741488Smckusick addr += x.a_text; 13854073Shibler if (x.a_magic == ZMAGIC || x.a_magic == NMAGIC) 13941488Smckusick while ((int)addr & CLOFSET) 14041488Smckusick *addr++ = 0; 14141488Smckusick printf("+%d", x.a_data); 14241488Smckusick if (read(io, addr, x.a_data) != x.a_data) 14341488Smckusick goto shread; 14441488Smckusick addr += x.a_data; 14541488Smckusick printf("+%d", x.a_bss); 14641488Smckusick x.a_bss += 128*512; /* slop */ 14741488Smckusick for (i = 0; i < x.a_bss; i++) 14841488Smckusick *addr++ = 0; 14941488Smckusick x.a_entry += (int)lowram; 15041488Smckusick printf(" start 0x%x\n", x.a_entry); 15141488Smckusick #ifdef __GNUC__ 15241488Smckusick asm(" movl %0,d7" : : "m" (howto)); 15341488Smckusick asm(" movl %0,d6" : : "m" (devtype)); 15441488Smckusick asm(" movl %0,a5" : : "a" (load)); 15541488Smckusick #endif 15641488Smckusick (*((int (*)()) x.a_entry))(); 15754073Shibler return; 15841488Smckusick shread: 15954073Shibler printf("Short read\n"); 16054073Shibler return; 16141488Smckusick } 162