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