hpcmenu.h revision 1.4 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