1 /* $NetBSD: boot.c,v 1.3 2001/11/21 23:33:18 thorpej Exp $ */ 2 3 /*- 4 * Copyright (c) 1999 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Jonathan Stone, Michael Hitch and Simon Burge. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. All advertising materials mentioning features or use of this software 19 * must display the following acknowledgement: 20 * This product includes software developed by the NetBSD 21 * Foundation, Inc. and its contributors. 22 * 4. Neither the name of The NetBSD Foundation nor the names of its 23 * contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 27 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 28 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 29 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 30 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 36 * POSSIBILITY OF SUCH DAMAGE. 37 */ 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 * Ralph Campbell. 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. All advertising materials mentioning features or use of this software 55 * must display the following acknowledgement: 56 * This product includes software developed by the University of 57 * California, Berkeley and its contributors. 58 * 4. Neither the name of the University nor the names of its contributors 59 * may be used to endorse or promote products derived from this software 60 * without specific prior written permission. 61 * 62 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 63 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 64 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 65 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 66 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 67 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 68 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 69 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 70 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 71 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 72 * SUCH DAMAGE. 73 * 74 * @(#)boot.c 8.1 (Berkeley) 6/10/93 75 */ 76 77 #include <lib/libsa/stand.h> 78 #include <lib/libsa/loadfile.h> 79 #include <lib/libkern/libkern.h> 80 81 #include <sys/param.h> 82 #include <sys/exec.h> 83 #include <sys/exec_elf.h> 84 85 #include <dev/arcbios/arcbios.h> 86 87 #include "common.h" 88 #include "bootinfo.h" 89 90 /* 91 * We won't go overboard with gzip'd kernel names. After all we can 92 * still boot a gzip'd kernel called "netbsd.sgimips" - it doesn't need 93 * the .gz suffix. 94 */ 95 char *kernelnames[] = { 96 "netbsd.sgimips", 97 "netbsd", "netbsd.gz", 98 "netbsd.bak", 99 "netbsd.old", 100 "onetbsd", 101 "gennetbsd", 102 #ifdef notyet 103 "netbsd.el", 104 #endif /*notyet*/ 105 NULL 106 }; 107 108 extern const struct arcbios_fv *ARCBIOS; 109 110 int main __P((int, char *[])); 111 112 #ifdef HEAP_VARIABLE 113 void setheap(void *, void*); 114 #endif 115 116 /* Storage must be static. */ 117 struct btinfo_symtab bi_syms; 118 struct btinfo_bootpath bi_bpath; 119 120 /* 121 * This gets arguments from the first stage boot lader, calls PROM routines 122 * to open and load the program to boot, and then transfers execution to 123 * that new program. 124 * 125 * Argv[0] should be something like "rz(0,0,0)netbsd" on a DECstation 3100. 126 * Argv[0,1] should be something like "boot 5/rz0/netbsd" on a DECstation 5000. 127 * The argument "-a" means netbsd should do an automatic reboot. 128 */ 129 int 130 main(argc, argv) 131 int argc; 132 char **argv; 133 { 134 char *name/*, **namep, *dev, *kernel*/; 135 char /*bootname[PATH_MAX],*/ bootpath[PATH_MAX]; 136 void (*entry)(int, char *[], int, void *); 137 u_long marks[MARK_MAX]; 138 struct arcbios_mem *mem; 139 int win; 140 141 /* print a banner */ 142 printf("\n"); 143 printf("NetBSD/sgimips " NETBSD_VERS " Bootstrap, Revision %s\n", 144 bootprog_rev); 145 printf("(%s, %s)\n", bootprog_maker, bootprog_date); 146 printf("\n"); 147 148 /* Initialize heap from free memory descriptors */ 149 mem = 0; 150 do { 151 mem = ARCBIOS->GetMemoryDescriptor(mem); 152 if (mem != 0) 153 printf("Mem block: type %d base 0x%x size 0x%x\n", 154 mem->Type, mem->BasePage * 4096, mem->PageCount * 4096); 155 } while (mem != 0); 156 #ifdef HEAP_VARIABLE 157 setheap((void *)0x88200000, (void *)0x88300000); /* XXXX */ 158 #endif 159 printf("Local storage %x\n", (int)&mem); 160 for (win = 0; win < argc; ++win) 161 printf("argv[%d]: %s\n", win, argv[win]); 162 163 /* initialise bootinfo structure early */ 164 bi_init(); 165 166 /* 167 * How to find partition and file to load? 168 * OSLoaderPartition=scsi(n)disk(n)rdisk(n)partition(n) 169 * OSLoadFilename=netbsd 170 * path=??? 171 * argument passed to boot program 172 */ 173 bootpath[0] = 0; 174 name = ARCBIOS->GetEnvironmentVariable("OSLoadPartition"); 175 if (name) { 176 strcpy(bootpath, name); 177 name = ARCBIOS->GetEnvironmentVariable("OSLoadFilename"); 178 if (name) 179 strcat(bootpath, name); 180 else 181 strcat(bootpath, "netbsd"); 182 } 183 if (strchr(argv[1], '=') == NULL) { 184 strcpy(bootpath, argv[1]); 185 if (strchr(argv[1], '(') == NULL) { 186 strcpy(bootpath, 187 ARCBIOS->GetEnvironmentVariable("OSLoadPartition")); 188 strcat(bootpath, argv[1]); 189 } 190 } 191 printf("Boot: %s\n", bootpath); 192 193 memset(marks, 0, sizeof marks); 194 #if 0 195 if (name != NULL) 196 win = (loadfile(name, marks, LOAD_KERNEL) == 0); 197 else { 198 win = 0; 199 for (namep = kernelnames, win = 0; *namep != NULL && !win; 200 namep++) { 201 kernel = *namep; 202 strcpy(bootpath, dev); 203 strcat(bootpath, kernel); 204 printf("Loading: %s\n", bootpath); 205 win = (loadfile(bootpath, marks, LOAD_ALL) != -1); 206 if (win) { 207 name = bootpath; 208 } 209 } 210 } 211 #else 212 win = loadfile(bootpath, marks, LOAD_KERNEL) == 0; 213 #endif 214 if (!win) 215 goto fail; 216 217 #if 0 218 strncpy(bi_bpath.bootpath, kernel, BTINFO_BOOTPATH_LEN); 219 bi_add(&bi_bpath, BTINFO_BOOTPATH, sizeof(bi_bpath)); 220 #endif 221 222 entry = (void *) marks[MARK_ENTRY]; 223 bi_syms.nsym = marks[MARK_NSYM]; 224 bi_syms.ssym = marks[MARK_SYM]; 225 bi_syms.esym = marks[MARK_END]; 226 bi_add(&bi_syms, BTINFO_SYMTAB); 227 228 printf("Starting at %p\n\n", entry); 229 printf("nsym 0x%lx ssym 0x%lx esym 0x%lx\n", marks[MARK_NSYM], 230 marks[MARK_SYM], marks[MARK_END]); 231 ARCBIOS->FlushAllCaches(); 232 (*entry)(argc, argv, BOOTINFO_MAGIC, bootinfo); 233 234 printf("Kernel returned! Halting...\n"); 235 return (0); 236 237 fail: 238 (void)printf("Boot failed! Halting...\n"); 239 return (0); 240 } 241