diff options
author | Dale Rahn <drahn@cvs.openbsd.org> | 2003-04-17 03:53:54 +0000 |
---|---|---|
committer | Dale Rahn <drahn@cvs.openbsd.org> | 2003-04-17 03:53:54 +0000 |
commit | e8925860bd2d6f5162fd782b09454a30f6ba612b (patch) | |
tree | dc17b6d0819ff38d5edba86ae387cfe60007b423 /sys/stand/boot | |
parent | 944855e07b795e3f398820db27ac5192f994fef4 (diff) |
Common bootloader file for 'loadfile' performs same action as old exec main.
eg boot.conf
Diffstat (limited to 'sys/stand/boot')
-rw-r--r-- | sys/stand/boot/boot_loadfile.c | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/sys/stand/boot/boot_loadfile.c b/sys/stand/boot/boot_loadfile.c new file mode 100644 index 00000000000..c05a801924e --- /dev/null +++ b/sys/stand/boot/boot_loadfile.c @@ -0,0 +1,119 @@ +/* $OpenBSD: boot_loadfile.c,v 1.1 2003/04/17 03:53:53 drahn Exp $ */ + +/* + * Copyright (c) 2003 Dale Rahn + * Copyright (c) 1997,1998 Michael Shalayeff + * All rights reserved. + * + * 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 Michael Shalayeff. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 REGENTS 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. + * + */ + +#include <sys/param.h> +#include <sys/reboot.h> +#include <sys/stat.h> +#include <libsa.h> +#include <lib/libsa/loadfile.h> + +#include "cmd.h" + + +static const char *const kernels[] = { + "/bsd", + "/obsd", + "/bsd.old", + NULL +}; + +extern const char version[]; +struct cmd_state cmd; + +void +boot(bootdev) + dev_t bootdev; +{ + register const char *bootfile = kernels[0]; + register int i = 0, try = 0, st; + u_long marks[MARK_MAX]; + +printf("bootdev %x\n", bootdev); + machdep(); + + printf(">> OpenBSD/" MACHINE " BOOT %s\n", version); + + devboot(bootdev, cmd.bootdev); + strncpy(cmd.image, bootfile, sizeof(cmd.image)); + cmd.boothowto = 0; + cmd.conf = "/etc/boot.conf"; + cmd.addr = (void *)DEFAULT_KERNEL_ADDRESS; + cmd.timeout = 5; + + st = read_conf(); + + while (1) { + if (st <= 0) /* no boot.conf, or no boot cmd in there */ + do { + printf("boot> "); + } while(!getcmd()); + st = 0; + + printf("booting %s: ", cmd.path); + marks[MARK_START] = 0; + if (loadfile(cmd.path, marks, LOAD_ALL) >= 0) + break; + + if (kernels[++i] == NULL) { + try += 1; + bootfile = kernels[i=0]; + } else + bootfile = kernels[i]; + strncpy(cmd.image, bootfile, sizeof(cmd.image)); + printf(" failed(%d). will try %s\n", errno, bootfile); + + if (try < 2) + cmd.timeout++; + else { + if (cmd.timeout) + printf("Turning timeout off.\n"); + cmd.timeout = 0; + } + } + + /* exec */ + run_loadfile(marks, cmd.boothowto); + + /* panic?? */ +} + +#ifdef _TEST +int +main() +{ + boot(0); + return 0; +} +#endif |