Home | History | Annotate | Line # | Download | only in hpcboot
hpcboot.cpp revision 1.18.4.1
      1  1.18.4.1  rpaulo /*	$NetBSD: hpcboot.cpp,v 1.18.4.1 2006/09/09 02:39:27 rpaulo Exp $	*/
      2       1.1     uch 
      3       1.1     uch /*-
      4      1.15     uch  * Copyright (c) 2001, 2002, 2004 The NetBSD Foundation, Inc.
      5       1.1     uch  * All rights reserved.
      6       1.1     uch  *
      7       1.1     uch  * This code is derived from software contributed to The NetBSD Foundation
      8       1.1     uch  * by UCHIYAMA Yasushi.
      9       1.1     uch  *
     10       1.1     uch  * Redistribution and use in source and binary forms, with or without
     11       1.1     uch  * modification, are permitted provided that the following conditions
     12       1.1     uch  * are met:
     13       1.1     uch  * 1. Redistributions of source code must retain the above copyright
     14       1.1     uch  *    notice, this list of conditions and the following disclaimer.
     15       1.1     uch  * 2. Redistributions in binary form must reproduce the above copyright
     16       1.1     uch  *    notice, this list of conditions and the following disclaimer in the
     17       1.1     uch  *    documentation and/or other materials provided with the distribution.
     18       1.1     uch  * 3. All advertising materials mentioning features or use of this software
     19       1.1     uch  *    must display the following acknowledgement:
     20       1.1     uch  *        This product includes software developed by the NetBSD
     21       1.1     uch  *        Foundation, Inc. and its contributors.
     22       1.1     uch  * 4. Neither the name of The NetBSD Foundation nor the names of its
     23       1.1     uch  *    contributors may be used to endorse or promote products derived
     24       1.1     uch  *    from this software without specific prior written permission.
     25       1.1     uch  *
     26       1.1     uch  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     27       1.1     uch  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     28       1.1     uch  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     29       1.1     uch  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     30       1.1     uch  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     31       1.1     uch  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     32       1.1     uch  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33       1.1     uch  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     34       1.1     uch  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     35       1.1     uch  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     36       1.1     uch  * POSSIBILITY OF SUCH DAMAGE.
     37       1.1     uch  */
     38       1.1     uch 
     39       1.1     uch #include <hpcmenu.h>
     40       1.1     uch #include <hpcboot.h>
     41       1.1     uch 
     42       1.1     uch #include <menu/window.h>
     43       1.1     uch #include <menu/rootwindow.h>
     44       1.1     uch 
     45       1.1     uch #include <console.h>
     46       1.1     uch #include <arch.h>
     47       1.1     uch #include <memory.h>
     48       1.1     uch #include <file.h>
     49       1.1     uch #include <load.h>
     50       1.1     uch 
     51       1.1     uch #include <boot.h>
     52       1.1     uch 
     53      1.17     uch #include "../binary/build_number.h"
     54      1.17     uch 
     55      1.15     uch #if _WIN32_WCE <= 200
     56      1.15     uch OSVERSIONINFO WinCEVersion;
     57      1.15     uch #else
     58       1.7     uch OSVERSIONINFOW WinCEVersion;
     59      1.15     uch #endif
     60       1.7     uch 
     61       1.1     uch int WINAPI
     62       1.1     uch WinMain(HINSTANCE instance, HINSTANCE prev_instance,
     63       1.4     uch     LPTSTR cmd_line, int window_show)
     64       1.1     uch {
     65       1.3     uch 	HpcMenuInterface::Instance();	// Menu System
     66       1.3     uch 	HpcBootApp *app = 0;		// Application body.
     67       1.1     uch 	int ret = 0;
     68       1.1     uch 
     69       1.1     uch 	InitCommonControls();
     70       1.1     uch 
     71       1.1     uch 	app = new HpcBootApp(instance);
     72       1.1     uch 	app->_cons = Console::Instance();
     73       1.1     uch 	app->_root = new RootWindow(*app);
     74       1.1     uch 
     75       1.1     uch 	if (!app->registerClass(reinterpret_cast <WNDPROC>(Window::_wnd_proc)))
     76       1.1     uch 		goto failed;
     77       1.1     uch 
     78       1.1     uch 	if (!app->_root->create(0))
     79       1.1     uch 		goto failed;
     80       1.1     uch 
     81       1.3     uch 	Boot::Instance();	// Boot loader
     82       1.1     uch 
     83       1.3     uch 	ret = app->run();	// Main loop.
     84       1.1     uch 	// NOTREACHED
     85       1.1     uch 
     86       1.1     uch  failed:
     87       1.1     uch 
     88       1.1     uch 	Boot::Destroy();
     89       1.1     uch 	if (app->_root)
     90       1.1     uch 		delete app->_root;
     91       1.1     uch 	delete app;
     92       1.1     uch 	Console::Destroy();
     93       1.1     uch 	HpcMenuInterface::Destroy();
     94       1.1     uch 
     95       1.1     uch 	return ret;
     96      1.16     uch }
     97       1.1     uch 
     98       1.3     uch //
     99      1.16     uch // boot sequence.
    100       1.3     uch //
    101       1.1     uch void
    102       1.3     uch hpcboot(void *arg)
    103       1.1     uch {
    104       1.1     uch 	size_t sz = 0;
    105       1.1     uch 	paddr_t p = 0;
    106       1.3     uch 	TCHAR *error_message = 0;
    107       1.3     uch 
    108       1.3     uch 	HpcMenuInterface &menu = HPC_MENU;
    109       1.1     uch 	Boot &f = Boot::Instance();
    110       1.1     uch 
    111       1.7     uch 	// Open serial port for kernel KGDB.
    112       1.7     uch 	SerialConsole::OpenCOM1();
    113       1.7     uch 
    114      1.15     uch 	menu.progress("0");
    115       1.5     uch 	if (!f.setup()) {
    116       1.9     uwe 		error_message = TEXT("Architecture not supported.\n");
    117       1.5     uch 		goto failed_exit;
    118       1.5     uch 	}
    119       1.1     uch 
    120      1.15     uch 	menu.progress("1");
    121       1.5     uch 	if (!f.create()) {
    122       1.9     uwe 		error_message = TEXT("Architecture ops. not found.\n");
    123       1.5     uch 		goto failed_exit;
    124       1.5     uch 	}
    125       1.1     uch 
    126      1.17     uch 	// Now we can write console which user specified.
    127      1.17     uch 	{
    128      1.17     uch 		DPRINTF_SETUP();
    129      1.17     uch 		DPRINTF((TEXT("hpcboot build number: %d\n"),
    130      1.17     uch 		    HPCBOOT_BUILD_NUMBER));
    131      1.17     uch 		DPRINTF((TEXT("%s (cpu=0x%08x machine=0x%08x)\n"),
    132      1.17     uch 		    HPC_MENU.platform_get(HPC_MENU.platform_default()),
    133      1.17     uch 		    HPC_PREFERENCE.platid_hi, HPC_PREFERENCE.platid_lo));
    134      1.17     uch 	}
    135      1.17     uch 
    136      1.15     uch 	menu.progress("2");
    137       1.1     uch 	if (!f._arch->init()) {
    138       1.9     uwe 		error_message = TEXT("Architecture initialize failed.\n");
    139       1.5     uch 		goto failed_exit;
    140       1.1     uch 	}
    141       1.1     uch 
    142       1.1     uch 	f._arch->systemInfo();
    143       1.1     uch 
    144      1.15     uch 	menu.progress("3");
    145       1.1     uch 	// kernel / file system image directory.
    146       1.1     uch 	if (!f._file->setRoot(f.args.fileRoot)) {
    147       1.9     uwe 		error_message = TEXT("Can't set root directory.\n");
    148       1.5     uch 		goto failed_exit;
    149       1.1     uch 	}
    150       1.1     uch 
    151      1.14     uwe 	// determine the size of file system image.
    152       1.1     uch 	if (f.args.loadmfs)
    153       1.1     uch 	{
    154       1.1     uch 		if (!f._file->open(f.args.mfsName)) {
    155       1.1     uch 			error_message =
    156       1.9     uwe 			    TEXT("Can't open file system image.\n");
    157       1.5     uch 			goto failed_exit;
    158       1.1     uch 		}
    159      1.14     uwe 		sz = f._file->realsize();
    160       1.6     uch 		sz = f._mem->roundPage(sz);
    161       1.1     uch 		f._file->close();
    162       1.1     uch 	}
    163       1.1     uch 
    164      1.15     uch 	menu.progress("4");
    165       1.1     uch 	if (!f._file->open(f.args.fileName)) {
    166       1.9     uwe 		error_message = TEXT("Can't open kernel image.\n");
    167       1.7     uch 		goto failed_exit;
    168       1.1     uch 	}
    169       1.7     uch 
    170      1.15     uch 	menu.progress("5");
    171       1.1     uch 	// put kernel to loader.
    172      1.12     uwe 	if (!f.attachLoader()) {
    173      1.12     uwe 		error_message = TEXT("Can't attach loader.\n");
    174       1.7     uch 		goto file_close_exit;
    175      1.12     uwe 	}
    176       1.7     uch 
    177       1.1     uch 	if (!f._loader->setFile(f._file)) {
    178       1.9     uwe 		error_message = TEXT("Can't initialize loader.\n");
    179       1.7     uch 		goto file_close_exit;
    180       1.1     uch 	}
    181       1.1     uch 
    182      1.15     uch 	menu.progress("6");
    183       1.6     uch 	sz += f._mem->roundPage(f._loader->memorySize());
    184       1.1     uch 
    185       1.1     uch 	// allocate required memory.
    186       1.1     uch 	if (!f._arch->allocateMemory(sz)) {
    187       1.9     uwe 		error_message = TEXT("Can't allocate memory.\n");
    188       1.7     uch 		goto file_close_exit;
    189       1.1     uch 	}
    190       1.1     uch 
    191      1.15     uch 	menu.progress("7");
    192       1.1     uch 	// load kernel to memory.
    193       1.1     uch 	if (!f._arch->setupLoader()) {
    194       1.9     uwe 		error_message = TEXT("Can't set up loader.\n");
    195       1.7     uch 		goto file_close_exit;
    196       1.1     uch 	}
    197       1.1     uch 
    198      1.15     uch 	menu.progress("8");
    199       1.1     uch 	if (!f._loader->load()) {
    200       1.9     uwe 		error_message = TEXT("Can't load kernel image to memory.\n");
    201       1.7     uch 		goto file_close_exit;
    202       1.1     uch 	}
    203      1.15     uch 	menu.progress("9");
    204       1.2     uch 	f._file->close();
    205       1.1     uch 
    206       1.1     uch 	// load file system image to memory
    207       1.1     uch 	if (f.args.loadmfs) {
    208       1.7     uch 		if (!f._file->open(f.args.mfsName)) {
    209       1.7     uch 			error_message =
    210       1.9     uwe 			    TEXT("Can't open file system image.\n");
    211       1.7     uch 			goto failed_exit;
    212       1.7     uch 		}
    213       1.6     uch 		if (!f._loader->loadExtData()) {
    214       1.6     uch 			error_message =
    215       1.9     uwe 			    TEXT("Can't load file system image to memory.\n");
    216       1.7     uch 			goto file_close_exit;
    217       1.6     uch 		}
    218       1.1     uch 		f._file->close();
    219       1.1     uch 	}
    220       1.1     uch 	f._loader->loadEnd();
    221       1.1     uch 
    222       1.1     uch 	// setup arguments for kernel.
    223       1.1     uch 	p = f._arch->setupBootInfo(*f._loader);
    224       1.1     uch 
    225      1.15     uch 	menu.progress("10");
    226       1.1     uch 
    227       1.1     uch 	f._loader->tagDump(3); // dump page chain.(print first 3 links)
    228       1.1     uch 
    229       1.1     uch 	// jump to kernel entry.
    230       1.3     uch 	if (HPC_PREFERENCE.pause_before_boot) {
    231       1.8     uwe 		if (MessageBox(menu._root->_window, TEXT("Push YES to boot."),
    232       1.8     uwe 		    TEXT("Last chance..."),
    233       1.9     uwe 		    MB_ICONWARNING | MB_YESNO) != IDYES)
    234      1.11     uwe 		{
    235       1.9     uwe 			error_message = TEXT("Canceled by user.\n");
    236       1.7     uch 			goto failed_exit;
    237      1.11     uwe 		}
    238      1.13     uwe 		// redraw areas damaged by the dialog
    239      1.13     uwe 		UpdateWindow(menu._root->_window);
    240       1.1     uch 	}
    241       1.1     uch 
    242       1.1     uch 	f._arch->jump(p, f._loader->tagStart());
    243       1.1     uch 	// NOTREACHED
    244      1.12     uwe 	error_message = TEXT("Can't jump to the kernel.\n");
    245       1.1     uch 
    246       1.7     uch  file_close_exit:
    247       1.2     uch 	f._file->close();
    248      1.12     uwe 
    249       1.5     uch  failed_exit:
    250      1.12     uwe 	if (error_message == 0)
    251      1.12     uwe 		error_message = TEXT("Unknown error?\n");
    252       1.1     uch 	MessageBox(menu._root->_window, error_message,
    253       1.8     uwe 	    TEXT("BOOT FAILED"), MB_ICONERROR | MB_OK);
    254      1.10     uwe 
    255      1.10     uwe 	menu.unprogress();	// rewind progress bar
    256       1.1     uch }
    257       1.1     uch 
    258       1.1     uch //
    259       1.1     uch // HPCBOOT main loop
    260       1.1     uch //
    261       1.1     uch int
    262       1.1     uch HpcBootApp::run(void)
    263       1.1     uch {
    264       1.1     uch 	MSG msg;
    265      1.16     uch 
    266       1.1     uch 	while (GetMessage(&msg, 0, 0, 0)) {
    267       1.1     uch 		// cancel auto-boot.
    268       1.3     uch 		if (HPC_PREFERENCE.auto_boot > 0 && _root &&
    269       1.1     uch 		    (msg.message == WM_KEYDOWN ||
    270       1.4     uch 			msg.message == WM_LBUTTONDOWN)) {
    271       1.1     uch 			_root->disableTimer();
    272       1.1     uch 		}
    273       1.1     uch 		if (!_root->isDialogMessage(msg)) {
    274       1.1     uch 			TranslateMessage(&msg);
    275       1.1     uch 			DispatchMessage(&msg);
    276       1.1     uch 		}
    277       1.1     uch 	}
    278       1.1     uch 	return msg.wParam;
    279       1.1     uch }
    280       1.1     uch 
    281       1.1     uch BOOL
    282       1.1     uch HpcBootApp::registerClass(WNDPROC proc)
    283       1.1     uch {
    284       1.1     uch 	TCHAR *wc_name;
    285       1.1     uch 	WNDCLASS wc;
    286       1.1     uch 
    287       1.1     uch 	memset(&wc, 0, sizeof(WNDCLASS));
    288       1.1     uch 	wc_name		= reinterpret_cast <TCHAR *>
    289       1.4     uch 	    (LoadString(_instance, IDS_HPCMENU, 0, 0));
    290       1.1     uch 	wc.lpfnWndProc	= proc;
    291       1.1     uch 	wc.hInstance	= _instance;
    292       1.1     uch 	wc.hIcon	= LoadIcon(_instance, MAKEINTRESOURCE(IDI_ICON));
    293       1.1     uch 	wc.cbWndExtra	= 4;		// pointer of `this`
    294       1.1     uch 	wc.hbrBackground= static_cast <HBRUSH>(GetStockObject(LTGRAY_BRUSH));
    295       1.1     uch 	wc.lpszClassName= wc_name;
    296       1.1     uch 
    297       1.1     uch 	return RegisterClass(&wc);
    298       1.6     uch }
    299       1.6     uch 
    300       1.6     uch 
    301       1.6     uch //
    302       1.6     uch // Debug support.
    303       1.6     uch //
    304       1.6     uch void
    305  1.18.4.1  rpaulo _bitdisp(uint32_t a, int s, int e, int m, int c)
    306       1.6     uch {
    307  1.18.4.1  rpaulo 	uint32_t j, j1;
    308       1.6     uch 	int i, n;
    309       1.6     uch 
    310       1.6     uch 	DPRINTF_SETUP();
    311       1.6     uch 
    312       1.6     uch 	n = 31;	// 32bit only.
    313       1.6     uch 	j1 = 1 << n;
    314       1.6     uch 	e = e ? e : n;
    315       1.6     uch 	for (j = j1, i = n; j > 0; j >>=1, i--) {
    316       1.6     uch 		if (i > e || i < s) {
    317       1.6     uch 			DPRINTF((TEXT("%c"), a & j ? '+' : '-'));
    318       1.6     uch 		} else {
    319       1.6     uch 			DPRINTF((TEXT("%c"), a & j ? '|' : '.'));
    320       1.6     uch 		}
    321       1.6     uch 	}
    322       1.6     uch 	if (m) {
    323       1.6     uch 		DPRINTF((TEXT("[%s]"),(char*)m));
    324       1.6     uch 	}
    325       1.6     uch 
    326       1.6     uch 	DPRINTF((TEXT(" [0x%08x]"), a));
    327       1.6     uch 
    328       1.6     uch 	if (c) {
    329       1.6     uch 		for (j = j1, i = n; j > 0; j >>=1, i--) {
    330       1.6     uch 			if (!(i > e || i < s) &&(a & j)) {
    331       1.6     uch 				DPRINTF((TEXT(" %d"), i));
    332       1.6     uch 			}
    333       1.6     uch 		}
    334       1.6     uch 	}
    335       1.6     uch 
    336       1.6     uch 	DPRINTF((TEXT(" %d\n"), a));
    337       1.6     uch }
    338       1.6     uch 
    339       1.6     uch void
    340  1.18.4.1  rpaulo _dbg_bit_print(uint32_t reg, uint32_t mask, const char *name)
    341       1.6     uch {
    342       1.6     uch 	static const char onoff[3] = "_x";
    343       1.6     uch 
    344       1.6     uch 	DPRINTF_SETUP();
    345       1.6     uch 
    346       1.6     uch 	DPRINTF((TEXT("%S[%c] "), name, onoff[reg & mask ? 1 : 0]));
    347       1.1     uch }
    348