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