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