boot.c revision 1.2
11.2Sfredette/* $NetBSD: boot.c,v 1.2 2003/08/05 19:10:26 fredette Exp $ */ 21.1Sfredette 31.1Sfredette/*- 41.1Sfredette * Copyright (c) 1982, 1986, 1990, 1993 51.1Sfredette * The Regents of the University of California. All rights reserved. 61.1Sfredette * 71.1Sfredette * Redistribution and use in source and binary forms, with or without 81.1Sfredette * modification, are permitted provided that the following conditions 91.1Sfredette * are met: 101.1Sfredette * 1. Redistributions of source code must retain the above copyright 111.1Sfredette * notice, this list of conditions and the following disclaimer. 121.1Sfredette * 2. Redistributions in binary form must reproduce the above copyright 131.1Sfredette * notice, this list of conditions and the following disclaimer in the 141.1Sfredette * documentation and/or other materials provided with the distribution. 151.1Sfredette * 3. All advertising materials mentioning features or use of this software 161.1Sfredette * must display the following acknowledgement: 171.1Sfredette * This product includes software developed by the University of 181.1Sfredette * California, Berkeley and its contributors. 191.1Sfredette * 4. Neither the name of the University nor the names of its contributors 201.1Sfredette * may be used to endorse or promote products derived from this software 211.1Sfredette * without specific prior written permission. 221.1Sfredette * 231.1Sfredette * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 241.1Sfredette * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 251.1Sfredette * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 261.1Sfredette * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 271.1Sfredette * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 281.1Sfredette * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 291.1Sfredette * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 301.1Sfredette * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 311.1Sfredette * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 321.1Sfredette * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 331.1Sfredette * SUCH DAMAGE. 341.1Sfredette * 351.1Sfredette * @(#)boot.c 8.1 (Berkeley) 6/10/93 361.1Sfredette */ 371.1Sfredette 381.1Sfredette#include <sys/param.h> 391.1Sfredette#include <sys/reboot.h> 401.1Sfredette#include <machine/mon.h> 411.1Sfredette 421.1Sfredette#include <stand.h> 431.1Sfredette#include <loadfile.h> 441.1Sfredette#include "libsa.h" 451.1Sfredette 461.1Sfredette/* 471.1Sfredette * Default the name (really tape segment number). 481.1Sfredette * The defaults assume the following tape layout: 491.1Sfredette * segment 0: tapeboot 501.1Sfredette * segment 1: netbsd.sun3 (RAMDISK3) 511.1Sfredette * segment 2: netbsd.sun3x (RAMDISK3X) 521.1Sfredette * segment 3: miniroot image 531.2Sfredette * segment 4: netbsd.sun2 (RAMDISK) 541.2Sfredette * Therefore, the default name is "1" or "2" or "4" 551.2Sfredette * for sun3, sun3x, and sun2, respectively. 561.1Sfredette */ 571.1Sfredette 581.1Sfredettechar defname[32] = "1"; 591.1Sfredettechar line[80]; 601.1Sfredette 611.1Sfredetteint 621.1Sfredettemain() 631.1Sfredette{ 641.1Sfredette char *cp, *file; 651.1Sfredette void *entry; 661.1Sfredette u_long marks[MARK_MAX]; 671.2Sfredette u_long mark_start; 681.1Sfredette int fd; 691.1Sfredette 701.1Sfredette printf(">> %s tapeboot [%s]\n", bootprog_name, bootprog_rev); 711.1Sfredette prom_get_boot_info(); 721.1Sfredette 731.1Sfredette /* 741.1Sfredette * Can not hold open the tape device as is done 751.1Sfredette * in the other boot programs because it does 761.1Sfredette * its position-to-segment on open. 771.1Sfredette */ 781.1Sfredette 791.2Sfredette /* Assume the Sun3/Sun3x load start. */ 801.2Sfredette memset(marks, 0, sizeof(marks)); 811.2Sfredette mark_start = 0; 821.2Sfredette 831.1Sfredette /* If running on a Sun3X, use segment 2. */ 841.1Sfredette if (_is3x) 851.1Sfredette defname[0] = '2'; 861.2Sfredette 871.2Sfredette /* 881.2Sfredette * If running on a Sun2, use segment 4 and 891.2Sfredette * do the special MMU setup. 901.2Sfredette */ 911.2Sfredette else if (_is2) { 921.2Sfredette defname[0] = '4'; 931.2Sfredette mark_start = sun2_map_mem_load(); 941.2Sfredette } 951.2Sfredette 961.1Sfredette file = defname; 971.1Sfredette 981.1Sfredette cp = prom_bootfile; 991.1Sfredette if (cp && *cp) 1001.1Sfredette file = cp; 1011.1Sfredette 1021.1Sfredette for (;;) { 1031.1Sfredette if (prom_boothow & RB_ASKNAME) { 1041.1Sfredette printf("tapeboot: segment? [%s]: ", defname); 1051.1Sfredette gets(line); 1061.1Sfredette if (line[0]) 1071.1Sfredette file = line; 1081.1Sfredette else 1091.1Sfredette file = defname; 1101.1Sfredette } else 1111.1Sfredette printf("tapeboot: loading segment %s\n", file); 1121.1Sfredette 1131.2Sfredette marks[MARK_START] = mark_start; 1141.1Sfredette if ((fd = loadfile(file, marks, LOAD_KERNEL)) != -1) { 1151.1Sfredette break; 1161.1Sfredette } 1171.1Sfredette printf("tapeboot: segment %s: %s\n", file, strerror(errno)); 1181.1Sfredette prom_boothow |= RB_ASKNAME; 1191.1Sfredette } 1201.1Sfredette close(fd); 1211.1Sfredette 1221.1Sfredette entry = (void *)marks[MARK_ENTRY]; 1231.2Sfredette if (_is2) { 1241.2Sfredette printf("relocating program..."); 1251.2Sfredette entry = sun2_map_mem_run(entry); 1261.2Sfredette } 1271.1Sfredette printf("Starting program at 0x%x\n", entry); 1281.1Sfredette chain_to(entry); 1291.1Sfredette} 130