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