1 /* -*-C++-*- $NetBSD: hpcmenu.h,v 1.4 2001/03/25 17:13:16 uch 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 #ifndef _HPCBOOT_MENU_H_ 40 #define _HPCBOOT_MENU_H_ 41 42 #include <hpcdefs.h> 43 44 // forward declaration. 45 class Console; 46 class HpcBootApp; 47 class RootWindow; 48 class BootButton; 49 class CancelButton; 50 class ProgressBar; 51 class TabWindowBase; 52 class MainTabWindow; 53 class OptionTabWindow; 54 class ConsoleTabWindow; 55 struct bootinfo; 56 57 // Application 58 class HpcBootApp { 59 public: 60 HINSTANCE _instance; 61 HWND _cmdbar; 62 RootWindow *_root; 63 Console *_cons; 64 int _cx_char, _cy_char; // 5, 14 65 66 private: 67 void _get_font_size(void) { 68 HDC hdc = GetDC(0); 69 TEXTMETRIC tm; 70 SelectObject(hdc, GetStockObject(SYSTEM_FONT)); 71 GetTextMetrics(hdc, &tm); 72 _cx_char = tm.tmAveCharWidth; 73 _cy_char = tm.tmHeight + tm.tmExternalLeading; 74 ReleaseDC(0, hdc); 75 } 76 77 public: 78 explicit HpcBootApp(HINSTANCE instance) : _instance(instance) { 79 _root = 0; 80 _cmdbar = 0; 81 _get_font_size(); 82 } 83 virtual ~HpcBootApp(void) { /* NO-OP */ } 84 85 BOOL registerClass(WNDPROC proc); 86 int run(void); 87 }; 88 89 // internal representation of user input. 90 class HpcMenuInterface 91 { 92 public: 93 struct HpcMenuPreferences { 94 #define HPCBOOT_MAGIC 0x177d5753 95 int _magic; 96 int _version; 97 size_t _size; // size of HpcMenuPreferences structure. 98 int dir; 99 BOOL dir_user; 100 TCHAR dir_user_path[MAX_PATH]; 101 BOOL kernel_user; 102 TCHAR kernel_user_file[MAX_PATH]; 103 unsigned platid_hi; 104 unsigned platid_lo; 105 int rootfs; 106 TCHAR rootfs_file[MAX_PATH]; 107 // kernel options. 108 BOOL boot_serial; 109 BOOL boot_verbose; 110 BOOL boot_single_user; 111 BOOL boot_ask_for_name; 112 // boot loader options. 113 int auto_boot; 114 BOOL reverse_video; 115 BOOL pause_before_boot; 116 BOOL load_debug_info; 117 BOOL safety_message; 118 // serial console speed 119 int serial_speed; 120 }; 121 struct support_status { 122 u_int32_t cpu, machine; 123 const TCHAR *cause; 124 }; 125 static struct support_status _unsupported[]; 126 127 RootWindow *_root; 128 MainTabWindow *_main; 129 OptionTabWindow *_option; 130 ConsoleTabWindow *_console; 131 struct HpcMenuPreferences _pref; 132 133 struct boot_hook_args { 134 void(*func)(void *, struct HpcMenuPreferences &); 135 void *arg; 136 } _boot_hook; 137 138 struct cons_hook_args { 139 void(*func)(void *, unsigned char); 140 void *arg; 141 } _cons_hook [4]; 142 int _cons_parameter; // Console tab window check buttons. 143 144 private: 145 static HpcMenuInterface *_instance; 146 147 void _set_default_pref(void) { 148 // set default. 149 _pref._magic = HPCBOOT_MAGIC; 150 _pref.dir = 0; 151 _pref.dir_user = FALSE; 152 _pref.kernel_user = FALSE; 153 _pref.platid_hi = 0; 154 _pref.platid_lo = 0; 155 _pref.rootfs = 0; 156 wsprintf(_pref.rootfs_file, TEXT("miniroot.fs")); 157 _pref.boot_serial = FALSE; 158 _pref.boot_verbose = FALSE; 159 _pref.boot_single_user = FALSE; 160 _pref.boot_ask_for_name = FALSE; 161 _pref.auto_boot = 0; 162 _pref.reverse_video = FALSE; 163 _pref.pause_before_boot = TRUE; 164 _pref.safety_message = TRUE; 165 #ifdef MIPS 166 _pref.serial_speed = 9600; // historical reason. 167 #else 168 _pref.serial_speed = 19200; 169 #endif 170 } 171 enum _platform_op { 172 _PLATFORM_OP_GET, 173 _PLATFORM_OP_SET, 174 _PLATFORM_OP_DEFAULT 175 }; 176 void *_platform(int, enum _platform_op); 177 178 protected: 179 HpcMenuInterface(void) { 180 if (!load()) 181 _set_default_pref(); 182 _pref._version = HPCBOOT_VERSION; 183 _pref._size = sizeof(HpcMenuPreferences); 184 185 _cons_parameter = 0; 186 memset(_cons_hook, 0, sizeof(struct cons_hook_args) * 4); 187 memset(&_boot_hook, 0, sizeof(struct boot_hook_args)); 188 } 189 virtual ~HpcMenuInterface(void) { /* NO-OP */ } 190 191 public: 192 static HpcMenuInterface &Instance(void); 193 static void Destroy(void); 194 195 // preferences. 196 BOOL load(void); 197 BOOL save(void); 198 199 // Boot button 200 // when user click `boot button' inquires all options. 201 void get_options(void); 202 enum { MAX_KERNEL_ARGS = 16 }; 203 int setup_kernel_args(vaddr_t, paddr_t); 204 void setup_bootinfo(struct bootinfo &bi); 205 void register_boot_hook(struct boot_hook_args &arg) { 206 _boot_hook = arg; 207 } 208 // call architecture dependent boot function. 209 void boot(void); 210 // Progress bar. 211 void progress(void); 212 213 // Console window interface. 214 void print(TCHAR *); 215 void register_cons_hook(struct cons_hook_args &arg, int id) { 216 if (id >= 0 && id < 4) 217 _cons_hook[id] = arg; 218 } 219 220 // Main window options 221 TCHAR *dir(int); 222 int dir_default(void); 223 224 // platform 225 TCHAR *platform_get(int n) { 226 return reinterpret_cast <TCHAR *> 227 (_platform(n, _PLATFORM_OP_GET)); 228 } 229 int platform_default(void) { 230 return reinterpret_cast <int> 231 (_platform(0, _PLATFORM_OP_DEFAULT)); 232 } 233 void platform_set(int n) { _platform(n, _PLATFORM_OP_SET); } 234 }; 235 236 #endif // _HPCBOOT_MENU_H_ 237