237 lines
6.3 KiB
C++
237 lines
6.3 KiB
C++
/* -*-C++-*- $NetBSD: hpcmenu.h,v 1.4 2001/03/25 17:13:16 uch Exp $ */
|
|
|
|
/*-
|
|
* Copyright (c) 2001 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.
|
|
* 3. All advertising materials mentioning features or use of this software
|
|
* must display the following acknowledgement:
|
|
* This product includes software developed by the NetBSD
|
|
* Foundation, Inc. and its contributors.
|
|
* 4. Neither the name of The NetBSD Foundation nor the names of its
|
|
* contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* 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;
|
|
// 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;
|
|
};
|
|
struct support_status {
|
|
u_int32_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 *, struct HpcMenuPreferences &);
|
|
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) {
|
|
// set default.
|
|
_pref._magic = HPCBOOT_MAGIC;
|
|
_pref.dir = 0;
|
|
_pref.dir_user = FALSE;
|
|
_pref.kernel_user = FALSE;
|
|
_pref.platid_hi = 0;
|
|
_pref.platid_lo = 0;
|
|
_pref.rootfs = 0;
|
|
wsprintf(_pref.rootfs_file, TEXT("miniroot.fs"));
|
|
_pref.boot_serial = FALSE;
|
|
_pref.boot_verbose = FALSE;
|
|
_pref.boot_single_user = FALSE;
|
|
_pref.boot_ask_for_name = FALSE;
|
|
_pref.auto_boot = 0;
|
|
_pref.reverse_video = FALSE;
|
|
_pref.pause_before_boot = TRUE;
|
|
_pref.safety_message = TRUE;
|
|
#ifdef MIPS
|
|
_pref.serial_speed = 9600; // historical reason.
|
|
#else
|
|
_pref.serial_speed = 19200;
|
|
#endif
|
|
}
|
|
enum _platform_op {
|
|
_PLATFORM_OP_GET,
|
|
_PLATFORM_OP_SET,
|
|
_PLATFORM_OP_DEFAULT
|
|
};
|
|
void *_platform(int, enum _platform_op);
|
|
|
|
protected:
|
|
HpcMenuInterface(void) {
|
|
if (!load())
|
|
_set_default_pref();
|
|
_pref._version = HPCBOOT_VERSION;
|
|
_pref._size = sizeof(HpcMenuPreferences);
|
|
|
|
_cons_parameter = 0;
|
|
memset(_cons_hook, 0, sizeof(struct cons_hook_args) * 4);
|
|
memset(&_boot_hook, 0, sizeof(struct boot_hook_args));
|
|
}
|
|
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);
|
|
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(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); }
|
|
};
|
|
|
|
#endif // _HPCBOOT_MENU_H_
|