xref: /netbsd/sys/arch/hpc/stand/hpcboot/hpcmenu.h (revision ce099b40)
1 /* -*-C++-*-	$NetBSD: hpcmenu.h,v 1.14 2008/04/28 20:23:20 martin Exp $	*/
2 
3 /*-
4  * Copyright (c) 2001, 2004 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  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #ifndef _HPCBOOT_MENU_H_
33 #define	_HPCBOOT_MENU_H_
34 
35 #include <hpcdefs.h>
36 
37 // forward declaration.
38 class Console;
39 class HpcBootApp;
40 class RootWindow;
41 class BootButton;
42 class CancelButton;
43 class ProgressBar;
44 class TabWindowBase;
45 class MainTabWindow;
46 class OptionTabWindow;
47 class ConsoleTabWindow;
48 struct bootinfo;
49 
50 // Application
51 class HpcBootApp {
52 public:
53 	HINSTANCE	_instance;
54 	HWND		_cmdbar;
55 	RootWindow	*_root;
56 	Console		*_cons;
57 	int		_cx_char, _cy_char; // 5, 14
58 
59 private:
_get_font_size(void)60 	void _get_font_size(void) {
61 		HDC hdc = GetDC(0);
62 		TEXTMETRIC tm;
63 		SelectObject(hdc, GetStockObject(SYSTEM_FONT));
64 		GetTextMetrics(hdc, &tm);
65 		_cx_char = tm.tmAveCharWidth;
66 		_cy_char = tm.tmHeight + tm.tmExternalLeading;
67 		ReleaseDC(0, hdc);
68 	}
69 
70 public:
HpcBootApp(HINSTANCE instance)71 	explicit HpcBootApp(HINSTANCE instance) : _instance(instance) {
72 		_root	= 0;
73 		_cmdbar	= 0;
74 		_get_font_size();
75 	}
~HpcBootApp(void)76 	virtual ~HpcBootApp(void) { /* NO-OP */ }
77 
78 	BOOL registerClass(WNDPROC proc);
79 	int run(void);
80 };
81 
82 // internal representation of user input.
83 class HpcMenuInterface
84 {
85 public:
86 	struct HpcMenuPreferences {
87 #define	HPCBOOT_MAGIC		0x177d5753
88 		int		_magic;
89 		int		_version;
90 		size_t	_size;	// size of HpcMenuPreferences structure.
91 		int		dir;
92 		BOOL	dir_user;
93 		TCHAR	dir_user_path[MAX_PATH];
94 		BOOL	kernel_user;
95 		TCHAR	kernel_user_file[MAX_PATH];
96 		unsigned	platid_hi;
97 		unsigned	platid_lo;
98 		int		rootfs;
99 		TCHAR	rootfs_file[MAX_PATH];
100 		// kernel options.
101 		BOOL	boot_serial;
102 		BOOL	boot_verbose;
103 		BOOL	boot_single_user;
104 		BOOL	boot_ask_for_name;
105 		BOOL	boot_debugger;
106 		// boot loader options.
107 		int		auto_boot;
108 		BOOL	reverse_video;
109 		BOOL	pause_before_boot;
110 		BOOL	load_debug_info;
111 		BOOL	safety_message;
112 		// serial console speed
113 		int	serial_speed;
114 #define	MAX_BOOT_STR 256
115 		TCHAR	boot_extra[MAX_BOOT_STR];
116 	};
117 	struct support_status {
118 		uint32_t cpu, machine;
119 		const TCHAR *cause;
120 	};
121 	static struct support_status _unsupported[];
122 
123 	RootWindow		*_root;
124 	MainTabWindow		*_main;
125 	OptionTabWindow		*_option;
126 	ConsoleTabWindow	*_console;
127 	struct HpcMenuPreferences _pref;
128 
129 	struct boot_hook_args {
130 		void(*func)(void *);
131 		void *arg;
132 	} _boot_hook;
133 
134 	struct cons_hook_args {
135 		void(*func)(void *, unsigned char);
136 		void *arg;
137 	} _cons_hook [4];
138 	int _cons_parameter; // Console tab window check buttons.
139 
140 private:
141 	static HpcMenuInterface *_instance;
142 
143 	void _set_default_pref(void);
144 	enum _platform_op {
145 		_PLATFORM_OP_GET,
146 		_PLATFORM_OP_SET,
147 		_PLATFORM_OP_DEFAULT
148 	};
149 	void *_platform(int, enum _platform_op);
150 
151 protected:
152 	HpcMenuInterface(void);
~HpcMenuInterface(void)153 	virtual ~HpcMenuInterface(void) { /* NO-OP */ }
154 
155 public:
156 	static HpcMenuInterface &Instance(void);
157 	static void Destroy(void);
158 
159 	// preferences.
160 	BOOL load(void);
161 	BOOL save(void);
162 
163 	// Boot button
164 	// when user click `boot button' inquires all options.
165 	void get_options(void);
166 	enum { MAX_KERNEL_ARGS = 16 };
167 	int setup_kernel_args(vaddr_t, paddr_t, size_t);
168 	void setup_bootinfo(struct bootinfo &bi);
register_boot_hook(struct boot_hook_args & arg)169 	void register_boot_hook(struct boot_hook_args &arg) {
170 		_boot_hook = arg;
171 	}
172 	// call architecture dependent boot function.
173 	void boot(void);
174 
175 	// Progress bar.
176 	void progress(const char * = NULL);
177 	void unprogress(void);
178 
179 	// Console window interface.
180 	void print(TCHAR *);
register_cons_hook(struct cons_hook_args & arg,int id)181 	void register_cons_hook(struct cons_hook_args &arg, int id) {
182 		if (id >= 0 && id < 4)
183 			_cons_hook[id] = arg;
184 	}
185 
186 	// Main window options
187 	TCHAR *dir(int);
188 	int dir_default(void);
189 
190 	// platform
platform_get(int n)191 	TCHAR *platform_get(int n) {
192 		return reinterpret_cast <TCHAR *>
193 		    (_platform(n, _PLATFORM_OP_GET));
194 	}
platform_default(void)195 	int platform_default(void) {
196 		return reinterpret_cast <int>
197 		    (_platform(0, _PLATFORM_OP_DEFAULT));
198 	}
platform_set(int n)199 	void platform_set(int n) { _platform(n, _PLATFORM_OP_SET); }
200 };
201 
202 /* Global access macro */
203 #define	HPC_MENU	(HpcMenuInterface::Instance())
204 #define	HPC_PREFERENCE	(HPC_MENU._pref)
205 
206 #endif // _HPCBOOT_MENU_H_
207