xref: /netbsd-src/sys/arch/luna68k/stand/boot/boot.c (revision 6a493d6bc668897c91594964a732d38505b70cbb)
1 /*	$NetBSD: boot.c,v 1.3 2013/03/05 15:34:53 tsutsui Exp $	*/
2 
3 /*
4  * Copyright (c) 1992 OMRON Corporation.
5  *
6  * This code is derived from software contributed to Berkeley by
7  * OMRON Corporation.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  * 3. All advertising materials mentioning features or use of this software
18  *    must display the following acknowledgement:
19  *	This product includes software developed by the University of
20  *	California, Berkeley and its contributors.
21  * 4. Neither the name of the University nor the names of its contributors
22  *    may be used to endorse or promote products derived from this software
23  *    without specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35  * SUCH DAMAGE.
36  *
37  *	@(#)boot.c	8.1 (Berkeley) 6/10/93
38  */
39 /*
40  * Copyright (c) 1992, 1993
41  *	The Regents of the University of California.  All rights reserved.
42  *
43  * This code is derived from software contributed to Berkeley by
44  * OMRON Corporation.
45  *
46  * Redistribution and use in source and binary forms, with or without
47  * modification, are permitted provided that the following conditions
48  * are met:
49  * 1. Redistributions of source code must retain the above copyright
50  *    notice, this list of conditions and the following disclaimer.
51  * 2. Redistributions in binary form must reproduce the above copyright
52  *    notice, this list of conditions and the following disclaimer in the
53  *    documentation and/or other materials provided with the distribution.
54  * 3. Neither the name of the University nor the names of its contributors
55  *    may be used to endorse or promote products derived from this software
56  *    without specific prior written permission.
57  *
58  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
59  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
60  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
61  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
62  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
63  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
64  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
65  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
66  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
67  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
68  * SUCH DAMAGE.
69  *
70  *	@(#)boot.c	8.1 (Berkeley) 6/10/93
71  */
72 
73 /*
74  * boot.c -- boot program
75  * by A.Fujita, MAR-01-1992
76  */
77 
78 #include <sys/param.h>
79 #include <sys/reboot.h>
80 #include <sys/exec.h>
81 #include <luna68k/stand/boot/samachdep.h>
82 #include <luna68k/stand/boot/stinger.h>
83 #include <luna68k/stand/boot/status.h>
84 #include <lib/libsa/loadfile.h>
85 
86 int howto;
87 
88 static int get_boot_device(const char *, int *, int *, int *);
89 
90 struct exec header;
91 
92 char *how_to_info[] = {
93 	"RB_ASKNAME	ask for file name to reboot from",
94 	"RB_SINGLE	reboot to single user only",
95 	"RB_NOSYNC	dont sync before reboot",
96 	"RB_HALT	don't reboot, just halt",
97 	"RB_INITNAME	name given for /etc/init (unused)",
98 	"RB_DFLTROOT	use compiled-in rootdev",
99 	"RB_KDB		give control to kernel debugger",
100 	"RB_RDONLY	mount root fs read-only"
101 };
102 
103 int
104 how_to_boot(int argc, char *argv[])
105 {
106 	int i, h = howto;
107 
108 	if (argc < 2) {
109 		printf("howto: 0x%s\n\n", hexstr(howto, 2));
110 
111 		if (h == 0) {
112 			printf("\t%s\n", "RB_AUTOBOOT	flags for system auto-booting itself");
113 		} else {
114 			for (i = 0; i < 8; i++, h >>= 1) {
115 				if (h & 0x01) {
116 					printf("\t%s\n", how_to_info[i]);
117 				}
118 			}
119 		}
120 
121 		printf("\n");
122 	}
123 	return ST_NORMAL;
124 }
125 
126 int
127 get_boot_device(const char *s, int *devp, int *unitp, int *partp)
128 {
129 	const char *p = s;
130 	int unit, part;
131 
132 	while (*p != '(') {
133 		if (*p == '\0')
134 			goto error;
135 		p++;
136 	}
137 
138 	while (*++p != ',') {
139 		if (*p == '\0')
140 			goto error;
141 		if (*p >= '0' && *p <= '9')
142 			unit = (unit * 10) + (*p - '0');
143 	}
144 
145 	while (*++p != ')') {
146 		if (*p == '\0')
147 			goto error;
148 		if (*p >= '0' && *p <= '9')
149 			part = (part * 10) + (*p - '0');
150 	}
151 
152 	*devp  = 0;	/* XXX not yet */
153 	*unitp = unit;	/* XXX should pass SCSI ID, not logical unit number */
154 	*partp = part;
155 
156 	return 0;
157 
158 error:
159 	return -1;
160 }
161 
162 int
163 boot(int argc, char *argv[])
164 {
165 	char *line;
166 
167 	if (argc < 2)
168 		line = default_file;
169 	else
170 		line = argv[1];
171 
172 	printf("Booting %s\n", line);
173 
174 	return bootnetbsd(line);
175 }
176 
177 int
178 bootnetbsd(char *line)
179 {
180 	int io;
181 	int dev, unit, part;
182 	u_long marks[MARK_MAX];
183 	void (*entry)(void);
184 
185 	if (get_boot_device(line, &dev, &unit, &part) != 0) {
186 		printf("Bad file name %s\n", line);
187 		return ST_ERROR;
188 	}
189 
190 	/* Note marks[MARK_START] is passed as an load address offset */
191 	memset(marks, 0, sizeof(marks));
192 
193 	io = loadfile(line, marks, LOAD_KERNEL);
194 	if (io >= 0) {
195 #ifdef DEBUG
196 		printf("entry = 0x%lx\n", marks[MARK_ENTRY]);
197 		printf("ssym  = 0x%lx\n", marks[MARK_SYM]);
198 		printf("esym  = 0x%lx\n", marks[MARK_END]);
199 #endif
200 
201 		/*
202 		 * XXX TODO: fill bootinfo about symbols, boot device etc.
203 		 */
204 
205 		entry = (void *)marks[MARK_ENTRY];
206 
207 		(*entry)();
208 	}
209 	printf("Booting kernel failed. (%s)\n", strerror(errno));
210 
211 	return ST_ERROR;
212 }
213