1 /* $NetBSD: xxboot.c,v 1.7 2016/06/11 06:49:46 dholland Exp $ */
2
3 /*-
4 * Copyright (c) 1982, 1986, 1990, 1993
5 * The Regents of the University of California. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the University nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 *
31 * @(#)boot.c 8.1 (Berkeley) 6/10/93
32 */
33
34 #include <sys/param.h>
35 #include <sys/reboot.h>
36 #include <machine/mon.h>
37
38 #include <stand.h>
39 #include <loadfile.h>
40 #include "libsa.h"
41
42 /*
43 * Note that extname is edited based on the running machine type
44 * (sun3 vs sun3x). EXTNAMEX is the position of the 'x'.
45 */
46 char extname[] = "netbsd.sun3x";
47 #define EXTNAMEX (sizeof(extname)-2)
48
49 /*
50 * If the PROM did not give us a specific kernel name to use,
51 * and did not specify the -a flag (ask), then try the names
52 * in the following list.
53 */
54 char *kernelnames[] = {
55 "netbsd",
56 "netbsd.old",
57 extname,
58 NULL
59 };
60 char line[80];
61
62 void
xxboot_main(const char * boot_type)63 xxboot_main(const char *boot_type)
64 {
65 struct open_file f;
66 char **npp;
67 char *file;
68 void *entry;
69 int fd;
70 u_long marks[MARK_MAX];
71
72 memset(marks, 0, sizeof(marks));
73 if (_is2)
74 marks[MARK_START] = sun2_map_mem_load();
75 printf(">> %s %s [%s]\n", bootprog_name, boot_type, bootprog_rev);
76 prom_get_boot_info();
77
78 /*
79 * Hold the raw device open so it will not be
80 * closed and reopened on every attempt to
81 * load files that did not exist.
82 */
83 f.f_flags = F_RAW;
84 if (devopen(&f, 0, &file)) {
85 printf("%s: devopen failed\n", boot_type);
86 return;
87 }
88
89 /*
90 * Edit the "extended" kernel name based on
91 * the type of machine we are running on.
92 */
93 if (_is2)
94 extname[EXTNAMEX - 1] = '2';
95 if (_is3x == 0)
96 extname[EXTNAMEX] = 0;
97
98 /* If we got the "-a" flag, ask for the name. */
99 if (prom_boothow & RB_ASKNAME)
100 goto just_ask;
101
102 /*
103 * If the PROM gave us a file name,
104 * it means the user asked for that
105 * kernel name explicitly.
106 */
107 file = prom_bootfile;
108 if (file && *file) {
109 fd = loadfile(file, marks, LOAD_KERNEL);
110 if (fd == -1) {
111 goto err;
112 } else {
113 goto gotit;
114 }
115 }
116
117 /*
118 * Try the default kernel names.
119 */
120 for (npp = kernelnames; *npp; npp++) {
121 file = *npp;
122 printf("%s: trying %s\n", boot_type, file);
123 fd = loadfile(file, marks, LOAD_KERNEL);
124 if (fd != -1)
125 goto gotit;
126 }
127
128 /*
129 * Ask what kernel name to load.
130 */
131 for (;;) {
132
133 just_ask:
134 file = kernelnames[0];
135 printf("filename? [%s]: ", file);
136 kgets(line, sizeof(line));
137 if (line[0])
138 file = line;
139
140 fd = loadfile(file, marks, LOAD_KERNEL);
141 if (fd != -1)
142 break;
143
144 err:
145 printf("%s: %s: loadfile() failed.\n", boot_type, file);
146 }
147
148 gotit:
149 entry = (void *)marks[MARK_ENTRY];
150 if (_is2) {
151 printf("relocating program...");
152 entry = sun2_map_mem_run(entry);
153 }
154 printf("starting program at 0x%x\n", (u_int)entry);
155 chain_to(entry);
156 }
157