xref: /csrg-svn/sys/hp300/stand/boot.c (revision 63163)
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