1 /* $NetBSD: pbsdboot.c,v 1.5 2007/03/04 05:59:53 christos Exp $ */
4 * Copyright (c) 1999 Shin Takemura.
7 * This software is part of the PocketBSD.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. All advertising materials mentioning features or use of this software
18 * must display the following acknowledgement:
19 * This product includes software developed by the PocketBSD project
20 * and its contributors.
21 * 4. Neither the name of the project nor the names of its contributors
22 * may be used to endorse or promote products derived from this software
23 * without specific prior written permission.
25 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
40 #define O_RDONLY 0x0000 /* open for reading only */
43 pbsdboot(TCHAR
*wkernel_name
, int argc
, char *argv
[], struct bootinfo
* bi
)
48 struct bootinfo
*bibuf
;
51 stat_printf(TEXT("open %s..."), wkernel_name
);
52 if (CheckCancel(0) || (fd
= open((char*)wkernel_name
, O_RDONLY
)) < 0) {
53 msg_printf(MSG_ERROR
, whoami
, TEXT("open failed.\n"));
54 stat_printf(TEXT("open %s...failed"), wkernel_name
);
58 stat_printf(TEXT("read information from %s..."), wkernel_name
);
59 if (CheckCancel(0) || getinfo(fd
, &start
, &end
) < 0) {
60 stat_printf(TEXT("read information failed"), wkernel_name
);
64 stat_printf(TEXT("create memory map..."));
65 if (CheckCancel(0) || vmem_init(start
, end
) < 0) {
66 stat_printf(TEXT("create memory map...failed"));
71 stat_printf(TEXT("prepare boot information..."));
72 if ((argbuf
= vmem_alloc()) == NULL
||
73 (bibuf
= (struct bootinfo
*)vmem_alloc()) == NULL
) {
74 msg_printf(MSG_ERROR
, whoami
, TEXT("can't allocate argument page\n"));
75 stat_printf(TEXT("prepare boot information...failed"));
79 memcpy(bibuf
, bi
, sizeof(struct bootinfo
));
80 for (p
= &argbuf
[sizeof(char*) * argc
], i
= 0; i
< argc
; i
++) {
81 int arglen
= strlen(argv
[i
]) + 1;
82 ((char**)argbuf
)[i
] = p
;
83 memcpy(p
, argv
[i
], arglen
);
87 stat_printf(TEXT("loading..."));
88 if (CheckCancel(0) || loadfile(fd
, &start
) < 0) {
89 stat_printf(TEXT("loading...failed"));
93 /* last chance to cancel */
94 if (CheckCancel(-1)) {
98 stat_printf(TEXT("execute kernel..."));
99 vmem_exec(start
, argc
, (char**)argbuf
, bibuf
);
100 stat_printf(TEXT("execute kernel...failed"));