xref: /original-bsd/sys/pmax/stand/boot.c (revision edc2ab72)
1 /*
2  * Copyright (c) 1992, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * This code is derived from software contributed to Berkeley by
6  * Ralph Campbell.
7  *
8  * %sccs.include.redist.c%
9  *
10  *	@(#)boot.c	8.1 (Berkeley) 06/10/93
11  */
12 
13 #include <sys/param.h>
14 #include <sys/exec.h>
15 #include <pmax/stand/dec_prom.h>
16 
17 char	line[1024];
18 
19 /*
20  * This gets arguments from the PROM, calls other routines to open
21  * and load the program to boot, and then transfers execution to that
22  * new program.
23  * Argv[0] should be something like "rz(0,0,0)vmunix" on a DECstation 3100.
24  * Argv[0,1] should be something like "boot 5/rz0/vmunix" on a DECstation 5000.
25  * The argument "-a" means vmunix should do an automatic reboot.
26  */
27 void
28 main(argc, argv)
29 	int argc;
30 	char **argv;
31 {
32 	register char *cp;
33 	int ask, entry;
34 
35 #ifdef JUSTASK
36 	ask = 1;
37 #else
38 	/* check for DS5000 boot */
39 	if (strcmp(argv[0], "boot") == 0) {
40 		argc--;
41 		argv++;
42 	}
43 	cp = *argv;
44 	ask = 0;
45 #endif /* JUSTASK */
46 	for (;;) {
47 		if (ask) {
48 			printf("Boot: ");
49 			gets(line);
50 			if (line[0] == '\0')
51 				continue;
52 			cp = line;
53 			argv[0] = cp;
54 			argc = 1;
55 		} else
56 			printf("Boot: %s\n", cp);
57 		entry = loadfile(cp);
58 		if (entry != -1)
59 			break;
60 		ask = 1;
61 	}
62 	printf("Starting at 0x%x\n\n", entry);
63 	if (callv == &callvec)
64 		((void (*)())entry)(argc, argv, 0, 0);
65 	else
66 		((void (*)())entry)(argc, argv, DEC_PROM_MAGIC, callv);
67 }
68 
69 /*
70  * Open 'filename', read in program and return the entry point or -1 if error.
71  */
72 loadfile(fname)
73 	register char *fname;
74 {
75 	register struct devices *dp;
76 	register int fd, i, n;
77 	struct exec aout;
78 
79 	if ((fd = open(fname, 0)) < 0) {
80 		goto err;
81 	}
82 
83 	/* read the exec header */
84 	i = read(fd, (char *)&aout, sizeof(aout));
85 	if (i != sizeof(aout)) {
86 		goto cerr;
87 	} else if (aout.a_magic != OMAGIC) {
88 		goto cerr;
89 	}
90 
91 	/* read the code and initialized data */
92 	printf("Size: %d+%d", aout.a_text, aout.a_data);
93 	if (lseek(fd, (off_t)N_TXTOFF(aout), 0) < 0) {
94 		goto cerr;
95 	}
96 	i = aout.a_text + aout.a_data;
97 	n = read(fd, (char *)aout.a_entry, i);
98 #ifndef SMALL
99 	(void) close(fd);
100 #endif
101 	if (n < 0) {
102 		goto err;
103 	} else if (n != i) {
104 		goto err;
105 	}
106 
107 	/* kernel will zero out its own bss */
108 	n = aout.a_bss;
109 	printf("+%d\n", n);
110 
111 	return ((int)aout.a_entry);
112 
113 cerr:
114 #ifndef SMALL
115 	(void) close(fd);
116 #endif
117 err:
118 	printf("Can't boot '%s'\n", fname);
119 	return (-1);
120 }
121