xref: /csrg-svn/sys/i386/stand/boot.c (revision 63368)
141068Swilliam /*-
2*63368Sbostic  * Copyright (c) 1990, 1993
3*63368Sbostic  *	The Regents of the University of California.  All rights reserved.
441068Swilliam  *
541068Swilliam  * This code is derived from software contributed to Berkeley by
641068Swilliam  * William Jolitz.
741068Swilliam  *
848812Swilliam  * %sccs.include.redist.c%
941068Swilliam  */
1041068Swilliam 
1141068Swilliam #ifndef lint
12*63368Sbostic static char copyright[] =
13*63368Sbostic "@(#) Copyright (c) 1990, 1993\n\
14*63368Sbostic 	The Regents of the University of California.  All rights reserved.\n";
1541068Swilliam #endif /* not lint */
1641068Swilliam 
1741068Swilliam #ifndef lint
18*63368Sbostic static char sccsid[] = "@(#)boot.c	8.1 (Berkeley) 06/11/93";
1941068Swilliam #endif /* not lint */
2041068Swilliam 
2156514Sbostic #include <sys/param.h>
2256514Sbostic #include <sys/reboot.h>
2356514Sbostic 
2441068Swilliam #include <a.out.h>
2548812Swilliam #include <setjmp.h>
2656514Sbostic #include <stand/saio.h>
2741068Swilliam 
2841068Swilliam /*
2948812Swilliam  * Boot program... arguments from lower-level bootstrap determine
3041068Swilliam  * whether boot stops to ask for system name and which device
3141068Swilliam  * boot comes from.
3241068Swilliam  */
3341068Swilliam 
3441068Swilliam char line[100] = UNIX;
3548812Swilliam extern	int opendev, bootdev, cyloffset;
3641068Swilliam int	retry = 0;
3749085Sbostic extern jmp_buf  exception;
3841068Swilliam 
main(howto,dev,off)3948812Swilliam main(howto, dev, off)
4041068Swilliam {
4141068Swilliam 	int io;
4241068Swilliam 
4348812Swilliam 	if((dev&B_MAGICMASK) == B_DEVMAGIC) {
4448812Swilliam 		bootdev = dev;
4548812Swilliam 		cyloffset = off;
4648812Swilliam 	} else	goto again;
4748812Swilliam 
4848812Swilliam 	if(_setjmp(exception)) {
4948812Swilliam 		close(io);
5048812Swilliam 		printf("- load aborted\n");
5148812Swilliam again:
5248812Swilliam 		howto = RB_SINGLE|RB_ASKNAME;
5348812Swilliam 		cyloffset = 0;
5448812Swilliam 	}
5548812Swilliam 
5641068Swilliam 	for (;;) {
5741068Swilliam 		if (howto & RB_ASKNAME) {
5848812Swilliam 			char *cp;
5948812Swilliam 
6041068Swilliam 			printf("Boot: ");
6141068Swilliam 			gets(line);
6248812Swilliam 
6348812Swilliam 			/* process additional flags if any */
6448812Swilliam 			if(cp = (char *)index(line, ' ')) {
6548812Swilliam 				howto = strtol (cp, 0, 0);
6648812Swilliam 				*cp = '\0';
6748812Swilliam 			}
6848812Swilliam 			cyloffset = 0;
6941068Swilliam 		} else
7041068Swilliam 			printf("Boot: %s\n", line);
7148812Swilliam 
7241068Swilliam 		if (line[0] == 0) {
7341068Swilliam 			strcpy(line, UNIX);
7441068Swilliam 			printf("Boot: %s\n", line);
7541068Swilliam 		}
7641068Swilliam 
7741068Swilliam 		io = open(line, 0);
7841068Swilliam 		if (io >= 0) {
7948812Swilliam 			copyunix(io, howto);
8048812Swilliam 			goto again;
8148812Swilliam 		} else if (++retry > 2)
8248812Swilliam 			goto again;
8341068Swilliam 	}
8441068Swilliam }
8541068Swilliam 
8641068Swilliam /*ARGSUSED*/
copyunix(io,howto)8748812Swilliam copyunix(io, howto)
8841068Swilliam 	register io;
8941068Swilliam {
9041068Swilliam 	struct exec x;
9141068Swilliam 	int i;
9248812Swilliam 	char *addr,c;
9341068Swilliam 
9441068Swilliam 	i = read(io, (char *)&x, sizeof x);
9541068Swilliam 	if (i != sizeof x ||
9648812Swilliam 	    (x.a_magic != 0407 && x.a_magic != 0413 && x.a_magic != 0410)) {
9748812Swilliam 		printf("Bad format\n");
9848812Swilliam 		return;
9948812Swilliam 	}
10048812Swilliam 
10141068Swilliam 	printf("%d", x.a_text);
10241068Swilliam 	if (x.a_magic == 0413 && lseek(io, 0x400, 0) == -1)
10341068Swilliam 		goto shread;
10441068Swilliam 	if (read(io, (char *)0, x.a_text) != x.a_text)
10541068Swilliam 		goto shread;
10648812Swilliam 
10741068Swilliam 	addr = (char *)x.a_text;
10841068Swilliam 	if (x.a_magic == 0413 || x.a_magic == 0410)
10941068Swilliam 		while ((int)addr & CLOFSET)
11041068Swilliam 			*addr++ = 0;
11141068Swilliam 	printf("+%d", x.a_data);
11241068Swilliam 	if (read(io, addr, x.a_data) != x.a_data)
11341068Swilliam 		goto shread;
11448812Swilliam 
11541068Swilliam 	addr += x.a_data;
11641068Swilliam 	printf("+%d", x.a_bss);
11741068Swilliam 	x.a_bss += 128*512;	/* slop */
11841068Swilliam 	for (i = 0; i < x.a_bss; i++)
11941068Swilliam 		*addr++ = 0;
12048812Swilliam 
12148812Swilliam 	/* mask high order bits corresponding to relocated system base */
12252350Sbostic 	x.a_entry &= 0x000fffff;
12341068Swilliam 	printf(" start 0x%x\n", x.a_entry);
12448812Swilliam 
12548812Swilliam 	if(c=scankbd())
12648812Swilliam 		_longjmp(&exception,1);
12748812Swilliam 
12848812Swilliam 	i = (*((int (*)()) x.a_entry))(howto, opendev, 0, cyloffset);
12948812Swilliam 
13041068Swilliam 	if (i) printf("exit %d\n", i) ;
13141068Swilliam 	return;
13241068Swilliam shread:
13348812Swilliam 	printf("Short read\n");
13448812Swilliam 	return;
13541068Swilliam }
136