149113Sbostic /*-
2*63163Sbostic * Copyright (c) 1982, 1986, 1990, 1993
3*63163Sbostic * The Regents of the University of California. All rights reserved.
441488Smckusick *
541488Smckusick * %sccs.include.redist.c%
641488Smckusick *
7*63163Sbostic * @(#)boot.c 8.1 (Berkeley) 06/10/93
841488Smckusick */
941488Smckusick
1056510Sbostic #include <sys/param.h>
1156510Sbostic #include <sys/reboot.h>
1241488Smckusick #include <a.out.h>
1360329Smckusick #include <stand.att/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
main()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;
6457299Shibler case HP_433:
6557299Shibler 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*/
copyunix(howto,devtype,io)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