summaryrefslogtreecommitdiff
path: root/sys/arch/hpc/stand/hpcboot/hpcmenu.h
blob: 46a3031cc2b583b65b1e354f5701ee88f82db590 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
/* -*-C++-*-	$NetBSD: hpcmenu.h,v 1.14 2008/04/28 20:23:20 martin Exp $	*/

/*-
 * Copyright (c) 2001, 2004 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by UCHIYAMA Yasushi.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef _HPCBOOT_MENU_H_
#define	_HPCBOOT_MENU_H_

#include <hpcdefs.h>

// forward declaration.
class Console;
class HpcBootApp;
class RootWindow;
class BootButton;
class CancelButton;
class ProgressBar;
class TabWindowBase;
class MainTabWindow;
class OptionTabWindow;
class ConsoleTabWindow;
struct bootinfo;

// Application
class HpcBootApp {
public:
	HINSTANCE	_instance;
	HWND		_cmdbar;
	RootWindow	*_root;
	Console		*_cons;
	int		_cx_char, _cy_char; // 5, 14

private:
	void _get_font_size(void) {
		HDC hdc = GetDC(0);
		TEXTMETRIC tm;
		SelectObject(hdc, GetStockObject(SYSTEM_FONT));
		GetTextMetrics(hdc, &tm);
		_cx_char = tm.tmAveCharWidth;
		_cy_char = tm.tmHeight + tm.tmExternalLeading;
		ReleaseDC(0, hdc);
	}

public:
	explicit HpcBootApp(HINSTANCE instance) : _instance(instance) {
		_root	= 0;
		_cmdbar	= 0;
		_get_font_size();
	}
	virtual ~HpcBootApp(void) { /* NO-OP */ }

	BOOL registerClass(WNDPROC proc);
	int run(void);
};

// internal representation of user input.
class HpcMenuInterface
{
public:
	struct HpcMenuPreferences {
#define	HPCBOOT_MAGIC		0x177d5753
		int		_magic;
		int		_version;
		size_t	_size;	// size of HpcMenuPreferences structure.
		int		dir;
		BOOL	dir_user;
		TCHAR	dir_user_path[MAX_PATH];
		BOOL	kernel_user;
		TCHAR	kernel_user_file[MAX_PATH];
		unsigned	platid_hi;
		unsigned	platid_lo;
		int		rootfs;
		TCHAR	rootfs_file[MAX_PATH];
		// kernel options.
		BOOL	boot_serial;
		BOOL	boot_verbose;
		BOOL	boot_single_user;
		BOOL	boot_ask_for_name;
		BOOL	boot_debugger;
		// boot loader options.
		int		auto_boot;
		BOOL	reverse_video;
		BOOL	pause_before_boot;
		BOOL	load_debug_info;
		BOOL	safety_message;
		// serial console speed
		int	serial_speed;
#define	MAX_BOOT_STR 256
		TCHAR	boot_extra[MAX_BOOT_STR];
	};
	struct support_status {
		uint32_t cpu, machine;
		const TCHAR *cause;
	};
	static struct support_status _unsupported[];

	RootWindow		*_root;
	MainTabWindow		*_main;
	OptionTabWindow		*_option;
	ConsoleTabWindow	*_console;
	struct HpcMenuPreferences _pref;

	struct boot_hook_args {
		void(*func)(void *);
		void *arg;
	} _boot_hook;

	struct cons_hook_args {
		void(*func)(void *, unsigned char);
		void *arg;
	} _cons_hook [4];
	int _cons_parameter; // Console tab window check buttons.

private:
	static HpcMenuInterface *_instance;

	void _set_default_pref(void);
	enum _platform_op {
		_PLATFORM_OP_GET,
		_PLATFORM_OP_SET,
		_PLATFORM_OP_DEFAULT
	};
	void *_platform(int, enum _platform_op);

protected:
	HpcMenuInterface(void);
	virtual ~HpcMenuInterface(void) { /* NO-OP */ }

public:
	static HpcMenuInterface &Instance(void);
	static void Destroy(void);

	// preferences.
	BOOL load(void);
	BOOL save(void);

	// Boot button
	// when user click `boot button' inquires all options.
	void get_options(void);
	enum { MAX_KERNEL_ARGS = 16 };
	int setup_kernel_args(vaddr_t, paddr_t, size_t);
	void setup_bootinfo(struct bootinfo &bi);
	void register_boot_hook(struct boot_hook_args &arg) {
		_boot_hook = arg;
	}
	// call architecture dependent boot function.
	void boot(void);

	// Progress bar.
	void progress(const char * = NULL);
	void unprogress(void);

	// Console window interface.
	void print(TCHAR *);
	void register_cons_hook(struct cons_hook_args &arg, int id) {
		if (id >= 0 && id < 4)
			_cons_hook[id] = arg;
	}

	// Main window options
	TCHAR *dir(int);
	int dir_default(void);

	// platform
	TCHAR *platform_get(int n) {
		return reinterpret_cast <TCHAR *>
		    (_platform(n, _PLATFORM_OP_GET));
	}
	int platform_default(void) {
		return reinterpret_cast <int>
		    (_platform(0, _PLATFORM_OP_DEFAULT));
	}
	void platform_set(int n) { _platform(n, _PLATFORM_OP_SET); }
};

/* Global access macro */
#define	HPC_MENU	(HpcMenuInterface::Instance())
#define	HPC_PREFERENCE	(HPC_MENU._pref)

#endif // _HPCBOOT_MENU_H_