1 /* $NetBSD: boot.cpp,v 1.3 2001/11/25 14:39:20 takemura Exp $ */ 2 3 /*- 4 * Copyright (c) 2001 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by UCHIYAMA Yasushi. 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 #include <hpcdefs.h> 40 #include <hpcboot.h> 41 #include <boot.h> 42 43 #include <load.h> 44 #include <load_elf.h> 45 #include <load_coff.h> 46 #undef DPRINTF // trash coff_machdep.h's DPRINTF 47 48 #include <console.h> 49 50 #include <file.h> 51 52 #ifdef ARM 53 #include <arm/arm_boot.h> 54 #endif 55 #ifdef MIPS 56 #include <mips/mips_boot.h> 57 #endif 58 #ifdef SHx 59 #include <sh3/sh_boot.h> 60 #endif 61 62 Boot *Boot::_instance = 0; 63 64 Boot & 65 Boot::Instance() 66 { 67 if (_instance) 68 return *_instance; 69 70 // register bootloader to menu system. 71 // (will be invoked by boot button) 72 struct HpcMenuInterface::boot_hook_args bha; 73 bha.func = hpcboot; 74 bha.arg = 0; 75 HPC_MENU.register_boot_hook(bha); 76 77 #ifdef ARM 78 _instance = new ARMBoot(); 79 #endif 80 #ifdef MIPS 81 _instance = new MIPSBoot(); 82 #endif 83 #ifdef SHx 84 _instance = new SHBoot(); 85 #endif 86 87 memset(&_instance->args, 0, sizeof(struct BootSetupArgs)); 88 _instance->args.consoleEnable = TRUE; 89 90 return *_instance; 91 } 92 93 void 94 Boot::Destroy() 95 { 96 if (_instance) 97 delete _instance; 98 } 99 100 BOOL 101 Boot::setup() 102 { 103 struct HpcMenuInterface::HpcMenuPreferences &pref = HPC_PREFERENCE; 104 105 args.console = pref.boot_serial ? CONSOLE_SERIAL : CONSOLE_LCD; 106 107 // file path. 108 TCHAR *dir = pref.dir_user_path; 109 if (wcsstr(dir, TEXT("http://"))) 110 args.file = FILE_HTTP; 111 else 112 args.file = wcschr(dir, TEXT('/')) ? FILE_UFS : FILE_FAT; 113 wcscpy(args.fileRoot, dir); 114 115 // file name. 116 wcscpy(args.fileName, pref.kernel_user_file); 117 args.loadmfs = (pref.rootfs == 2); 118 if (args.loadmfs) 119 wcscpy(args.mfsName, pref.rootfs_file); 120 121 // debug options. 122 args.loaderDebug = FALSE; 123 args.architectureDebug = FALSE; 124 args.memorymanagerDebug = FALSE; 125 args.fileDebug = FALSE; 126 127 return TRUE; 128 } 129 130 Boot::Boot() 131 { 132 _arch = 0; 133 _mem = 0; 134 _file = 0; 135 _loader = 0; 136 // set default console 137 _cons = Console::Instance(); 138 } 139 140 Boot::~Boot() 141 { 142 if (_file) 143 delete _file; 144 if (_loader) 145 delete _loader; 146 } 147 148 BOOL 149 Boot::create() 150 { 151 // File manager. 152 _file = new FileManager(_cons, args.file); 153 _file->setDebug() = args.fileDebug; 154 155 return TRUE; 156 } 157 158 BOOL 159 Boot::attachLoader() 160 { 161 switch (Loader::objectFormat(*_file)) { 162 case LOADER_ELF: 163 _loader = new ElfLoader(_cons, _mem); 164 break; 165 case LOADER_COFF: 166 _loader = new CoffLoader(_cons, _mem); 167 break; 168 default: 169 DPRINTF((TEXT("unknown file format.\n"))); 170 return FALSE; 171 } 172 173 return TRUE; 174 } 175