1 /* $NetBSD: boot.cpp,v 1.6 2005/12/11 12:17:28 christos Exp $ */ 2 3 /*- 4 * Copyright (c) 2001, 2004 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 68 if (_instance) 69 return *_instance; 70 71 // register bootloader to menu system. 72 // (will be invoked by boot button) 73 struct HpcMenuInterface::boot_hook_args bha; 74 bha.func = hpcboot; 75 bha.arg = 0; 76 HPC_MENU.register_boot_hook(bha); 77 78 #ifdef ARM 79 _instance = new ARMBoot(); 80 #endif 81 #ifdef MIPS 82 _instance = new MIPSBoot(); 83 #endif 84 #ifdef SHx 85 _instance = new SHBoot(); 86 #endif 87 88 memset(&_instance->args, 0, sizeof(struct BootSetupArgs)); 89 _instance->args.consoleEnable = TRUE; 90 91 return *_instance; 92 } 93 94 void 95 Boot::Destroy() 96 { 97 98 if (_instance) 99 delete _instance; 100 } 101 102 BOOL 103 Boot::setup() 104 { 105 struct HpcMenuInterface::HpcMenuPreferences &pref = HPC_PREFERENCE; 106 107 args.console = pref.boot_serial ? CONSOLE_SERIAL : CONSOLE_LCD; 108 109 // file path. 110 TCHAR *dir = pref.dir_user_path; 111 if (wcsstr(dir, TEXT("http://"))) 112 args.file = FILE_HTTP; 113 else 114 args.file = wcschr(dir, TEXT('/')) ? FILE_UFS : FILE_FAT; 115 wcscpy(args.fileRoot, dir); 116 117 // file name. 118 wcscpy(args.fileName, pref.kernel_user_file); 119 args.loadmfs = (pref.rootfs == 2); 120 if (args.loadmfs) 121 wcscpy(args.mfsName, pref.rootfs_file); 122 123 // debug options. 124 args.loaderDebug = FALSE; 125 args.architectureDebug = FALSE; 126 args.memorymanagerDebug = FALSE; 127 args.fileDebug = FALSE; 128 129 return TRUE; 130 } 131 132 Boot::Boot() 133 { 134 _arch = 0; 135 _mem = 0; 136 _file = 0; 137 _loader = 0; 138 // set default console 139 _cons = Console::Instance(); 140 } 141 142 Boot::~Boot() 143 { 144 145 if (_file) 146 delete _file; 147 if (_loader) 148 delete _loader; 149 } 150 151 BOOL 152 Boot::create() 153 { 154 155 // Set this console (setuped by machine dependent part) as default. 156 Console::changeConsole(*_cons); 157 158 // File manager. 159 _file = new FileManager(_cons, args.file); 160 _file->setDebug() = args.fileDebug; 161 162 return TRUE; 163 } 164 165 BOOL 166 Boot::attachLoader() 167 { 168 169 switch (Loader::objectFormat(*_file)) { 170 case LOADER_ELF: 171 _loader = new ElfLoader(_cons, _mem); 172 break; 173 case LOADER_COFF: 174 _loader = new CoffLoader(_cons, _mem); 175 break; 176 default: 177 DPRINTF((TEXT("unknown file format.\n"))); 178 return FALSE; 179 } 180 181 return TRUE; 182 } 183