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_
|