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 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