1/* $NetBSD: boot.c,v 1.26 2012/12/19 13:53:47 kiyohara Exp $ */ 2 3/* 4 * Copyright (C) 1995, 1996 Wolfgang Solfrank. 5 * Copyright (C) 1995, 1996 TooLs GmbH. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. All advertising materials mentioning features or use of this software 17 * must display the following acknowledgement: 18 * This product includes software developed by TooLs GmbH. 19 * 4. The name of TooLs GmbH may not be used to endorse or promote products 20 * derived from this software without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR 23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 25 * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 27 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 28 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 29 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 30 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 31 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34#include <lib/libsa/stand.h> 35#include <lib/libsa/loadfile.h> 36#include <lib/libkern/libkern.h> 37#include <sys/boot_flag.h> 38#include <sys/reboot.h> 39#include <machine/bootinfo.h> 40#include <machine/cpu.h> 41 42#include "boot.h" 43#include "sdvar.h" 44#include "wdvar.h" 45 46char *names[] = { 47 "/dev/disk/scsi/000/0_0:/netbsd", 48 "/dev/disk/ide/0/master/0_0:/netbsd", 49 "/dev/disk/floppy:netbsd", "/dev/disk/floppy:netbsd.gz", 50 "/dev/disk/scsi/000/0_0:/onetbsd", 51 "/dev/disk/ide/0/master/0_0:/onetbsd", 52 "/dev/disk/floppy:onetbsd", "/dev/disk/floppy:onetbsd.gz" 53 "in", 54}; 55#define NUMNAMES (sizeof (names) / sizeof (names[0])) 56 57#define NAMELEN 128 58char namebuf[NAMELEN]; 59char nametmp[NAMELEN]; 60 61struct btinfo_memory btinfo_memory; 62struct btinfo_console btinfo_console; 63struct btinfo_clock btinfo_clock; 64struct btinfo_rootdevice btinfo_rootdevice; 65 66extern char bootprog_name[], bootprog_rev[]; 67 68void main(void); 69void exec_kernel(char *, void *); 70 71void 72main(void) 73{ 74 int n = 0; 75 int addr, speed; 76 char *name, *cnname; 77 void *bootinfo; 78 79 if (whichCPU() == 1) 80 cpu1(); 81 resetCPU1(); 82 83 scanPCI(); 84 85 /* 86 * console init 87 */ 88 cnname = cninit(&addr, &speed); 89 90 /* 91 * make bootinfo 92 */ 93 bootinfo = (void *)0x3030; 94 95 /* 96 * memory 97 */ 98 btinfo_memory.common.next = sizeof (btinfo_memory); 99 btinfo_memory.common.type = BTINFO_MEMORY; 100 btinfo_memory.memsize = *(int *)0x3010; 101 102 /* 103 * console 104 */ 105 btinfo_console.common.next = sizeof (btinfo_console); 106 btinfo_console.common.type = BTINFO_CONSOLE; 107 strcpy(btinfo_console.devname, cnname); 108 btinfo_console.addr = addr; 109 btinfo_console.speed = speed; 110 111 /* 112 * clock 113 */ 114 btinfo_clock.common.next = 0; 115 btinfo_clock.common.type = BTINFO_CLOCK; 116 btinfo_clock.ticks_per_sec = TICKS_PER_SEC; 117 118 runCPU1((void *)start_CPU1); 119 wait_for(&CPU1_alive); 120 121 printf(">> %s, Revision %s\n", bootprog_name, bootprog_rev); 122 printf(">> Memory: %d k\n", btinfo_memory.memsize / 1024); 123 124 /* 125 * attached kernel check and copy. 126 */ 127 init_in(); 128 129 printf("\n"); 130 131 /* Initialize siop@pci0 dev 12 func 0 */ 132 siop_init(0, 12, 0); 133 134 /* Initialize wdc@isa port 0x1f0 */ 135 wdc_init(0x1f0); 136 137 for (;;) { 138 name = names[n++]; 139 if (n >= NUMNAMES) 140 n = 0; 141 142 exec_kernel(name, bootinfo); 143 } 144} 145 146/* 147 * Exec kernel 148 */ 149void 150exec_kernel(char *name, void *bootinfo) 151{ 152 int howto = 0, i; 153 char c, *ptr; 154 u_long marks[MARK_MAX]; 155 void *p; 156#ifdef DBMONITOR 157 int go_monitor; 158 159ret: 160#endif /* DBMONITOR */ 161 printf("\nBoot: "); 162 memset(namebuf, 0, sizeof (namebuf)); 163 (void)tgets(namebuf); 164 165 ptr = namebuf; 166#ifdef DBMONITOR 167 go_monitor = 0; 168 if (*ptr == '!') { 169 if (*(++ptr) == NULL) { 170 db_monitor(); 171 printf("\n"); 172 goto ret; 173 } else { 174 go_monitor++; 175 } 176 } 177#endif /* DBMONITOR */ 178 while ((c = *ptr)) { 179 while (c == ' ') 180 c = *++ptr; 181 if (!c) 182 goto next; 183 if (c == '-') { 184 while ((c = *++ptr) && c != ' ') 185 BOOT_FLAG(c, howto); 186 } else { 187 name = ptr; 188 while ((c = *++ptr) && c != ' '); 189 if (c) 190 *ptr++ = 0; 191 } 192 } 193 194next: 195 printf("Loading %s\n", name); 196 197 marks[MARK_START] = 0; 198 if (loadfile(name, marks, LOAD_ALL) == 0) { 199#ifdef DBMONITOR 200 if (go_monitor) { 201 db_monitor(); 202 printf("\n"); 203 } 204#endif /* DBMONITOR */ 205 206 p = bootinfo; 207 208 /* 209 * root device 210 */ 211 btinfo_rootdevice.common.next = sizeof (btinfo_rootdevice); 212 btinfo_rootdevice.common.type = BTINFO_ROOTDEVICE; 213 strncpy(btinfo_rootdevice.rootdevice, name, 214 sizeof (btinfo_rootdevice.rootdevice)); 215 i = 0; 216 while (btinfo_rootdevice.rootdevice[i] != '\0') { 217 if (btinfo_rootdevice.rootdevice[i] == ':') 218 break; 219 i++; 220 } 221 if (btinfo_rootdevice.rootdevice[i] == ':') { 222 /* It is NOT in-kernel. */ 223 224 btinfo_rootdevice.rootdevice[i] = '\0'; 225 226 memcpy(p, (void *)&btinfo_rootdevice, 227 sizeof (btinfo_rootdevice)); 228 p += sizeof (btinfo_rootdevice); 229 } 230 231 memcpy(p, (void *)&btinfo_memory, sizeof (btinfo_memory)); 232 p += sizeof (btinfo_memory); 233 memcpy(p, (void *)&btinfo_console, sizeof (btinfo_console)); 234 p += sizeof (btinfo_console); 235 memcpy(p, (void *)&btinfo_clock, sizeof (btinfo_clock)); 236 237 printf("start=0x%lx\n\n", marks[MARK_ENTRY]); 238 delay(1000); 239 __syncicache((void *)marks[MARK_ENTRY], 240 (u_int)marks[MARK_SYM] - (u_int)marks[MARK_ENTRY]); 241 242 *(volatile u_long *)0x0080 = marks[MARK_ENTRY]; 243 run((void *)marks[MARK_SYM], 244 (void *)marks[MARK_END], 245 (void *)howto, 246 bootinfo, 247 (void *)marks[MARK_ENTRY]); 248 } 249} 250 251void 252_rtt(void) 253{ 254 255 /* XXXX */ 256 __unreachable(); 257} 258