[BACK]Return to boot.c CVS log [TXT][DIR] Up to [local] / sys / stand / boot

Annotation of sys/stand/boot/boot.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: boot.c,v 1.36 2007/06/26 10:34:41 tom Exp $   */
                      2:
                      3: /*
                      4:  * Copyright (c) 2003 Dale Rahn
                      5:  * Copyright (c) 1997,1998 Michael Shalayeff
                      6:  * All rights reserved.
                      7:  *
                      8:  * Redistribution and use in source and binary forms, with or without
                      9:  * modification, are permitted provided that the following conditions
                     10:  * are met:
                     11:  * 1. Redistributions of source code must retain the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer.
                     13:  * 2. Redistributions in binary form must reproduce the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer in the
                     15:  *    documentation and/or other materials provided with the distribution.
                     16:  *
                     17:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     18:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
                     19:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     20:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     21:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     22:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     23:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     24:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     25:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     26:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     27:  * SUCH DAMAGE.
                     28:  *
                     29:  */
                     30:
                     31: #include <sys/param.h>
                     32: #include <sys/reboot.h>
                     33: #include <sys/stat.h>
                     34: #include <libsa.h>
                     35: #include <lib/libsa/loadfile.h>
                     36: #include <lib/libkern/funcs.h>
                     37:
                     38: #include "cmd.h"
                     39:
                     40: #ifndef KERNEL
                     41: #define KERNEL "/bsd"
                     42: #endif
                     43:
                     44: char prog_ident[40];
                     45: char *progname = "BOOT";
                     46:
                     47: extern const char version[];
                     48: struct cmd_state cmd;
                     49:
                     50: /* bootprompt can be set by MD code to avoid prompt first time round */
                     51: int bootprompt = 1;
                     52: char *kernelfile = KERNEL;             /* can be changed by MD code */
                     53:
                     54: void
                     55: boot(dev_t bootdev)
                     56: {
                     57:        int fd;
                     58:        int try = 0, st;
                     59:        u_long marks[MARK_MAX];
                     60:
                     61:        machdep();
                     62:
                     63:        snprintf(prog_ident, sizeof(prog_ident),
                     64:            ">> OpenBSD/" MACHINE " %s %s", progname, version);
                     65:        printf("%s\n", prog_ident);
                     66:
                     67:        devboot(bootdev, cmd.bootdev);
                     68:        strlcpy(cmd.image, kernelfile, sizeof(cmd.image));
                     69:        cmd.boothowto = 0;
                     70:        cmd.conf = "/etc/boot.conf";
                     71:        cmd.addr = (void *)DEFAULT_KERNEL_ADDRESS;
                     72:        cmd.timeout = 5;
                     73:
                     74:        st = read_conf();
                     75:        if (!bootprompt)
                     76:                snprintf(cmd.path, sizeof cmd.path, "%s:%s",
                     77:                    cmd.bootdev, cmd.image);
                     78:
                     79:        while (1) {
                     80:                /* no boot.conf, or no boot cmd in there */
                     81:                if (bootprompt && st <= 0)
                     82:                        do {
                     83:                                printf("boot> ");
                     84:                        } while(!getcmd());
                     85:                st = 0;
                     86:                bootprompt = 1; /* allow reselect should we fail */
                     87:
                     88:                printf("booting %s: ", cmd.path);
                     89:                marks[MARK_START] = (u_long)cmd.addr;
                     90:                if ((fd = loadfile(cmd.path, marks, LOAD_ALL)) != -1) {
                     91:                        close(fd);
                     92:                        break;
                     93:                }
                     94:
                     95:                kernelfile = KERNEL;
                     96:                try++;
                     97:                strlcpy(cmd.image, kernelfile, sizeof(cmd.image));
                     98:                printf(" failed(%d). will try %s\n", errno, kernelfile);
                     99:
                    100:                if (try < 2) {
                    101:                        if (cmd.timeout > 0)
                    102:                                cmd.timeout++;
                    103:                } else {
                    104:                        if (cmd.timeout)
                    105:                                printf("Turning timeout off.\n");
                    106:                        cmd.timeout = 0;
                    107:                }
                    108:        }
                    109:
                    110:        /* exec */
                    111:        run_loadfile(marks, cmd.boothowto);
                    112: }
                    113:
                    114: #ifdef _TEST
                    115: int
                    116: main()
                    117: {
                    118:        boot(0);
                    119:        return 0;
                    120: }
                    121: #endif

CVSweb