xref: /netbsd-src/sys/arch/hpc/stand/hpcboot/hpcmenu.h (revision 17dd36da8292193180754d5047c0926dbb56818c)
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