xref: /csrg-svn/sys/i386/stand/boot.c (revision 48812)
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  *
8*48812Swilliam  * %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*48812Swilliam static char sccsid[] = "@(#)boot.c	7.2 (Berkeley) 04/28/91";
1941068Swilliam #endif /* not lint */
2041068Swilliam 
21*48812Swilliam #include "param.h"
22*48812Swilliam #include "reboot.h"
2341068Swilliam #include <a.out.h>
24*48812Swilliam #include <setjmp.h>
2541068Swilliam #include "saio.h"
2641068Swilliam 
2741068Swilliam /*
28*48812Swilliam  * 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 #define	UNIX	"/vmunix"
3441068Swilliam 
3541068Swilliam char line[100] = UNIX;
36*48812Swilliam extern	int opendev, bootdev, cyloffset;
3741068Swilliam int	retry = 0;
38*48812Swilliam jmp_buf  exception;
3941068Swilliam 
40*48812Swilliam main(howto, dev, off)
4141068Swilliam {
4241068Swilliam 	int io;
4341068Swilliam 
44*48812Swilliam 	if((dev&B_MAGICMASK) == B_DEVMAGIC) {
45*48812Swilliam 		bootdev = dev;
46*48812Swilliam 		cyloffset = off;
47*48812Swilliam 	} else	goto again;
48*48812Swilliam 
49*48812Swilliam 	if(_setjmp(exception)) {
50*48812Swilliam 		close(io);
51*48812Swilliam 		printf("- load aborted\n");
52*48812Swilliam again:
53*48812Swilliam 		howto = RB_SINGLE|RB_ASKNAME;
54*48812Swilliam 		cyloffset = 0;
55*48812Swilliam 	}
56*48812Swilliam 
5741068Swilliam 	for (;;) {
5841068Swilliam 		if (howto & RB_ASKNAME) {
59*48812Swilliam 			char *cp;
60*48812Swilliam 
6141068Swilliam 			printf("Boot: ");
6241068Swilliam 			gets(line);
63*48812Swilliam 
64*48812Swilliam 			/* process additional flags if any */
65*48812Swilliam 			if(cp = (char *)index(line, ' ')) {
66*48812Swilliam 				howto = strtol (cp, 0, 0);
67*48812Swilliam 				*cp = '\0';
68*48812Swilliam 			}
69*48812Swilliam 			cyloffset = 0;
7041068Swilliam 		} else
7141068Swilliam 			printf("Boot: %s\n", line);
72*48812Swilliam 
7341068Swilliam 		if (line[0] == 0) {
7441068Swilliam 			strcpy(line, UNIX);
7541068Swilliam 			printf("Boot: %s\n", line);
7641068Swilliam 		}
7741068Swilliam 
7841068Swilliam 		io = open(line, 0);
7941068Swilliam 		if (io >= 0) {
80*48812Swilliam 			copyunix(io, howto);
81*48812Swilliam 			goto again;
82*48812Swilliam 		} else if (++retry > 2)
83*48812Swilliam 			goto again;
8441068Swilliam 	}
8541068Swilliam }
8641068Swilliam 
8741068Swilliam /*ARGSUSED*/
88*48812Swilliam copyunix(io, howto)
8941068Swilliam 	register io;
9041068Swilliam {
9141068Swilliam 	struct exec x;
9241068Swilliam 	int i;
93*48812Swilliam 	char *addr,c;
9441068Swilliam 
9541068Swilliam 	i = read(io, (char *)&x, sizeof x);
9641068Swilliam 	if (i != sizeof x ||
97*48812Swilliam 	    (x.a_magic != 0407 && x.a_magic != 0413 && x.a_magic != 0410)) {
98*48812Swilliam 		printf("Bad format\n");
99*48812Swilliam 		return;
100*48812Swilliam 	}
101*48812Swilliam 
10241068Swilliam 	printf("%d", x.a_text);
10341068Swilliam 	if (x.a_magic == 0413 && lseek(io, 0x400, 0) == -1)
10441068Swilliam 		goto shread;
10541068Swilliam 	if (read(io, (char *)0, x.a_text) != x.a_text)
10641068Swilliam 		goto shread;
107*48812Swilliam 
10841068Swilliam 	addr = (char *)x.a_text;
10941068Swilliam 	if (x.a_magic == 0413 || x.a_magic == 0410)
11041068Swilliam 		while ((int)addr & CLOFSET)
11141068Swilliam 			*addr++ = 0;
11241068Swilliam 	printf("+%d", x.a_data);
11341068Swilliam 	if (read(io, addr, x.a_data) != x.a_data)
11441068Swilliam 		goto shread;
115*48812Swilliam 
11641068Swilliam 	addr += x.a_data;
11741068Swilliam 	printf("+%d", x.a_bss);
11841068Swilliam 	x.a_bss += 128*512;	/* slop */
11941068Swilliam 	for (i = 0; i < x.a_bss; i++)
12041068Swilliam 		*addr++ = 0;
121*48812Swilliam 
122*48812Swilliam 	/* mask high order bits corresponding to relocated system base */
123*48812Swilliam 	x.a_entry &= 0xfff00000;
12441068Swilliam 	printf(" start 0x%x\n", x.a_entry);
125*48812Swilliam 
126*48812Swilliam 	if(c=scankbd())
127*48812Swilliam 		_longjmp(&exception,1);
128*48812Swilliam 
129*48812Swilliam 	i = (*((int (*)()) x.a_entry))(howto, opendev, 0, cyloffset);
130*48812Swilliam 
13141068Swilliam 	if (i) printf("exit %d\n", i) ;
13241068Swilliam 	return;
13341068Swilliam shread:
134*48812Swilliam 	printf("Short read\n");
135*48812Swilliam 	return;
13641068Swilliam }
137