xref: /csrg-svn/sys/i386/stand/boot.c (revision 49085)
141068Swilliam /*-
241068Swilliam  * Copyright (c) 1990 The Regents of the University of California.
341068Swilliam  * 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
1241068Swilliam char copyright[] =
1341068Swilliam "@(#) Copyright (c) 1990 The Regents of the University of California.\n\
1441068Swilliam  All rights reserved.\n";
1541068Swilliam #endif /* not lint */
1641068Swilliam 
1741068Swilliam #ifndef lint
18*49085Sbostic static char sccsid[] = "@(#)boot.c	7.3 (Berkeley) 05/04/91";
1941068Swilliam #endif /* not lint */
2041068Swilliam 
2148812Swilliam #include "param.h"
2248812Swilliam #include "reboot.h"
2341068Swilliam #include <a.out.h>
2448812Swilliam #include <setjmp.h>
2541068Swilliam #include "saio.h"
2641068Swilliam 
2741068Swilliam /*
2848812Swilliam  * Boot program... arguments from lower-level bootstrap determine
2941068Swilliam  * whether boot stops to ask for system name and which device
3041068Swilliam  * boot comes from.
3141068Swilliam  */
3241068Swilliam 
3341068Swilliam char line[100] = UNIX;
3448812Swilliam extern	int opendev, bootdev, cyloffset;
3541068Swilliam int	retry = 0;
36*49085Sbostic extern jmp_buf  exception;
3741068Swilliam 
3848812Swilliam main(howto, dev, off)
3941068Swilliam {
4041068Swilliam 	int io;
4141068Swilliam 
4248812Swilliam 	if((dev&B_MAGICMASK) == B_DEVMAGIC) {
4348812Swilliam 		bootdev = dev;
4448812Swilliam 		cyloffset = off;
4548812Swilliam 	} else	goto again;
4648812Swilliam 
4748812Swilliam 	if(_setjmp(exception)) {
4848812Swilliam 		close(io);
4948812Swilliam 		printf("- load aborted\n");
5048812Swilliam again:
5148812Swilliam 		howto = RB_SINGLE|RB_ASKNAME;
5248812Swilliam 		cyloffset = 0;
5348812Swilliam 	}
5448812Swilliam 
5541068Swilliam 	for (;;) {
5641068Swilliam 		if (howto & RB_ASKNAME) {
5748812Swilliam 			char *cp;
5848812Swilliam 
5941068Swilliam 			printf("Boot: ");
6041068Swilliam 			gets(line);
6148812Swilliam 
6248812Swilliam 			/* process additional flags if any */
6348812Swilliam 			if(cp = (char *)index(line, ' ')) {
6448812Swilliam 				howto = strtol (cp, 0, 0);
6548812Swilliam 				*cp = '\0';
6648812Swilliam 			}
6748812Swilliam 			cyloffset = 0;
6841068Swilliam 		} else
6941068Swilliam 			printf("Boot: %s\n", line);
7048812Swilliam 
7141068Swilliam 		if (line[0] == 0) {
7241068Swilliam 			strcpy(line, UNIX);
7341068Swilliam 			printf("Boot: %s\n", line);
7441068Swilliam 		}
7541068Swilliam 
7641068Swilliam 		io = open(line, 0);
7741068Swilliam 		if (io >= 0) {
7848812Swilliam 			copyunix(io, howto);
7948812Swilliam 			goto again;
8048812Swilliam 		} else if (++retry > 2)
8148812Swilliam 			goto again;
8241068Swilliam 	}
8341068Swilliam }
8441068Swilliam 
8541068Swilliam /*ARGSUSED*/
8648812Swilliam copyunix(io, howto)
8741068Swilliam 	register io;
8841068Swilliam {
8941068Swilliam 	struct exec x;
9041068Swilliam 	int i;
9148812Swilliam 	char *addr,c;
9241068Swilliam 
9341068Swilliam 	i = read(io, (char *)&x, sizeof x);
9441068Swilliam 	if (i != sizeof x ||
9548812Swilliam 	    (x.a_magic != 0407 && x.a_magic != 0413 && x.a_magic != 0410)) {
9648812Swilliam 		printf("Bad format\n");
9748812Swilliam 		return;
9848812Swilliam 	}
9948812Swilliam 
10041068Swilliam 	printf("%d", x.a_text);
10141068Swilliam 	if (x.a_magic == 0413 && lseek(io, 0x400, 0) == -1)
10241068Swilliam 		goto shread;
10341068Swilliam 	if (read(io, (char *)0, x.a_text) != x.a_text)
10441068Swilliam 		goto shread;
10548812Swilliam 
10641068Swilliam 	addr = (char *)x.a_text;
10741068Swilliam 	if (x.a_magic == 0413 || x.a_magic == 0410)
10841068Swilliam 		while ((int)addr & CLOFSET)
10941068Swilliam 			*addr++ = 0;
11041068Swilliam 	printf("+%d", x.a_data);
11141068Swilliam 	if (read(io, addr, x.a_data) != x.a_data)
11241068Swilliam 		goto shread;
11348812Swilliam 
11441068Swilliam 	addr += x.a_data;
11541068Swilliam 	printf("+%d", x.a_bss);
11641068Swilliam 	x.a_bss += 128*512;	/* slop */
11741068Swilliam 	for (i = 0; i < x.a_bss; i++)
11841068Swilliam 		*addr++ = 0;
11948812Swilliam 
12048812Swilliam 	/* mask high order bits corresponding to relocated system base */
12148812Swilliam 	x.a_entry &= 0xfff00000;
12241068Swilliam 	printf(" start 0x%x\n", x.a_entry);
12348812Swilliam 
12448812Swilliam 	if(c=scankbd())
12548812Swilliam 		_longjmp(&exception,1);
12648812Swilliam 
12748812Swilliam 	i = (*((int (*)()) x.a_entry))(howto, opendev, 0, cyloffset);
12848812Swilliam 
12941068Swilliam 	if (i) printf("exit %d\n", i) ;
13041068Swilliam 	return;
13141068Swilliam shread:
13248812Swilliam 	printf("Short read\n");
13348812Swilliam 	return;
13441068Swilliam }
135