1 /* -*-C++-*- $NetBSD: hpcmenu.h,v 1.7 2001/05/17 01:50:35 enami 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 BOOL boot_debugger; 113 // boot loader options. 114 int auto_boot; 115 BOOL reverse_video; 116 BOOL pause_before_boot; 117 BOOL load_debug_info; 118 BOOL safety_message; 119 // serial console speed 120 int serial_speed; 121 }; 122 struct support_status { 123 u_int32_t cpu, machine; 124 const TCHAR *cause; 125 }; 126 static struct support_status _unsupported[]; 127 128 RootWindow *_root; 129 MainTabWindow *_main; 130 OptionTabWindow *_option; 131 ConsoleTabWindow *_console; 132 struct HpcMenuPreferences _pref; 133 134 struct boot_hook_args { 135 void(*func)(void *); 136 void *arg; 137 } _boot_hook; 138 139 struct cons_hook_args { 140 void(*func)(void *, unsigned char); 141 void *arg; 142 } _cons_hook [4]; 143 int _cons_parameter; // Console tab window check buttons. 144 145 private: 146 static HpcMenuInterface *_instance; 147 148 void _set_default_pref(void); 149 enum _platform_op { 150 _PLATFORM_OP_GET, 151 _PLATFORM_OP_SET, 152 _PLATFORM_OP_DEFAULT 153 }; 154 void *_platform(int, enum _platform_op); 155 156 protected: 157 HpcMenuInterface(void); 158 virtual ~HpcMenuInterface(void) { /* NO-OP */ } 159 160 public: 161 static HpcMenuInterface &Instance(void); 162 static void Destroy(void); 163 164 // preferences. 165 BOOL load(void); 166 BOOL save(void); 167 168 // Boot button 169 // when user click `boot button' inquires all options. 170 void get_options(void); 171 enum { MAX_KERNEL_ARGS = 16 }; 172 int setup_kernel_args(vaddr_t, paddr_t); 173 void setup_bootinfo(struct bootinfo &bi); 174 void register_boot_hook(struct boot_hook_args &arg) { 175 _boot_hook = arg; 176 } 177 // call architecture dependent boot function. 178 void boot(void); 179 // Progress bar. 180 void progress(void); 181 182 // Console window interface. 183 void print(TCHAR *); 184 void register_cons_hook(struct cons_hook_args &arg, int id) { 185 if (id >= 0 && id < 4) 186 _cons_hook[id] = arg; 187 } 188 189 // Main window options 190 TCHAR *dir(int); 191 int dir_default(void); 192 193 // platform 194 TCHAR *platform_get(int n) { 195 return reinterpret_cast <TCHAR *> 196 (_platform(n, _PLATFORM_OP_GET)); 197 } 198 int platform_default(void) { 199 return reinterpret_cast <int> 200 (_platform(0, _PLATFORM_OP_DEFAULT)); 201 } 202 void platform_set(int n) { _platform(n, _PLATFORM_OP_SET); } 203 }; 204 205 /* Global access macro */ 206 #define HPC_MENU (HpcMenuInterface::Instance()) 207 #define HPC_PREFERENCE (HPC_MENU._pref) 208 209 #endif // _HPCBOOT_MENU_H_ 210