summaryrefslogtreecommitdiff
path: root/sys/stand/boot
diff options
context:
space:
mode:
authorDale Rahn <drahn@cvs.openbsd.org>2003-04-17 03:53:54 +0000
committerDale Rahn <drahn@cvs.openbsd.org>2003-04-17 03:53:54 +0000
commite8925860bd2d6f5162fd782b09454a30f6ba612b (patch)
treedc17b6d0819ff38d5edba86ae387cfe60007b423 /sys/stand/boot
parent944855e07b795e3f398820db27ac5192f994fef4 (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.c119
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