boot system and buildkernel - Remove the thrice damned forth interpreter
authorMatthew Dillon <dillon@apollo.backplane.com>
Wed, 1 Sep 2010 04:38:56 +0000 (21:38 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Wed, 1 Sep 2010 04:38:56 +0000 (21:38 -0700)
* Remove the forth interpreter from the build.  The last straw was when
  I tried to fix the module path and 6 hours later still couldn't get
  it right.

* Write a C based menu system and loader, replacing what the forth code
  used to do.  This is about 85% complete (tftp and boot chaining issues
  are not handled).  This took exactly one day to do, by the way.

* Reformulate installkernel to now create a directory /boot/kernel.blah
  and place the kernel and modules inside that directory.

37 files changed:
sys/boot/Makefile
sys/boot/README
sys/boot/common/Makefile.inc
sys/boot/common/boot.c
sys/boot/common/bootstrap.h
sys/boot/common/commands.c
sys/boot/common/do_default.c [new file with mode: 0644]
sys/boot/common/do_dloader.c [new file with mode: 0644]
sys/boot/common/do_forth.c [new file with mode: 0644]
sys/boot/common/interp_parse.c
sys/boot/common/load.c
sys/boot/common/load_elf.c
sys/boot/common/load_elf_obj.c
sys/boot/common/ls.c
sys/boot/common/module.c
sys/boot/common/pnp.c
sys/boot/common/rel_open.c
sys/boot/dloader/Makefile [new file with mode: 0644]
sys/boot/dloader/cmds.c [new file with mode: 0644]
sys/boot/dloader/config.c [copied from sys/boot/common/rel_open.c with 71% similarity]
sys/boot/dloader/dloader.h [copied from sys/boot/common/rel_open.c with 71% similarity]
sys/boot/dloader/dloader.menu [new file with mode: 0644]
sys/boot/dloader/loader-bootp.conf [new file with mode: 0644]
sys/boot/dloader/loader.conf [new file with mode: 0644]
sys/boot/dloader/subs.c [copied from sys/boot/common/rel_open.c with 51% similarity]
sys/boot/efi/loader/Makefile
sys/boot/ficl/loader.c
sys/boot/ia64/skiload/Makefile
sys/boot/pc32/loader/Makefile
sys/boot/pc32/loader/dloader.rc [new file with mode: 0644]
sys/boot/pc32/loader_tftp/Makefile
sys/boot/powerpc/loader/Makefile
sys/boot/sparc64/loader/Makefile
sys/conf/kern.paths.mk
sys/conf/kern.post.mk
sys/conf/kern.pre.mk
sys/conf/kmod.mk

index 9beebbe..783c5e4 100644 (file)
@@ -5,10 +5,8 @@
 .MAKEFLAGS:  MACHINE_ARCH=i386 MACHINE_PLATFORM=pc32 REALLY_X86_64=true
 .endif
 
-.if !defined(NOFORTH) && ${MACHINE_ARCH} != "powerpc"
-# Build the add-in FORTH interpreter
-SUBDIR+=               ficl
-.endif
+# Build DLoader
+SUBDIR+=               dloader
 
 # Build OpenFirmware library
 .if ${MACHINE_ARCH} == "powerpc" || ${MACHINE_ARCH} == "sparc64"
index 3d296a8..ae3a2dd 100644 (file)
@@ -1,249 +1,4 @@
-$FreeBSD: src/sys/boot/README,v 1.3 2000/05/01 20:26:17 peter Exp $
-$DragonFly: src/sys/boot/README,v 1.4 2005/02/26 12:00:55 swildner Exp $
 
-       README file, for the boot config file setup.  This is meant
-       to explain how to manage the loader configuration process.
-       The boot and loading process is either defined, or being
-       defined in boot(8) and loader(8).
+                           DLOADER NEW README
 
-       The ongoing development of the FreeBSD bootloader, and its
-       rapid deployment while still in the development phase, has
-       resulted in a large number of installations with outdated
-       configurations.  Those installations actively tracking the
-       FreeBSD development should also ensure that their bootloader
-       configurations are updated.  If you see files discussed here
-       that your system doesn't yet have, add them yourself.
-
-       This is an effort to give the currently correct method for
-       setting up your boot process.  It includes information on
-       setting up screen savers and plug and play information, and
-       also on recording any changes you make in your kernel
-       configuration.  This file is temporary, because as I noted,
-       the process is still undergoing development, and will still
-       change.  Man pages are coming out, but they're still going
-       to be somewhat fragile for a while.  If you note anything in
-       here that's broken, it would be a good idea to report it to
-       the FreeBSD-current list, or to Daniel C. Sobral
-       <dcs@FreeBSD.org> or Mike Smith <msmith@FreeBSD.org>.
-
-       NOTE:
-
-       Please understand, all this is very current development, and
-       while getting this working for STABLE is a goal, it's not
-       yet ready for that.  It's possible that parts of this might
-       indeed work for stable, but if you're not absolutely sure
-       what you're doing, you're better off not using the
-       information in this README for STABLE.  Use this for current
-       only for a while longer, please!
-
-       After the first two stages in the booting process (described
-       in boot(8)), the last stage of the booting process, called
-       the loader (see loader(8)) reads in the /boot/loader.rc
-       file.  The two lines you should have there are:
-
-       include /boot/loader.4th
-       start
-
-       This reads the ficl (forth) initialization files, then
-       /boot/default/loader.conf.  This file, which strongly
-       resembles in form /etc/rc.conf but functions quite
-       differently, has spots for endless user customization but
-       isn't yet completely finished.  For one thing, it used to
-       assume a /kernel.config instead of a /boot/kernel.conf.
-       Watch the first few lines of /boot/defaults/loader.conf to
-       see if the file name changes.
-
-       [See the section at the end on loader.conf syntax]
-
-       You don't actually want to make any changes to
-       /boot/defaults/loader.conf, the file that is a  hacking-
-       target is:
-
-       /boot/loader.conf
-
-       and might very likely not exist yet on your system).  You
-       should copy /boot/defaults/loader.conf to /boot/loader.conf,
-       and then cut out anything you didn't want changed.
-
-       The start command also loads your kernel for you, so don't
-       put any lines in there like "load kernel", they'll fail (but
-       really have already worked for you).  Start also reads in
-       the file /boot/defaults/loader.conf and /boot/loader.conf.
-       If you don't have /boot/loader.conf, you'll see a message on
-       boot about it, but it's a warning only, no other effects.
-       See the section on loader.conf syntax at the end of this
-       document, for some more pointers on loader.conf syntax.
-
-       The best way to manage splash screens is with entries in
-       /boot/loader.conf, and this is very clearly illustrated in
-       /boot/defaults/loader.conf (which you could just copy over
-       to /boot/loader.conf).  I'm going to illustrate here how you
-       *could* do it in /boot/loader.rc (for information only)
-       but I don't recommend you do this; use the
-       /boot/defaults/loader.conf syntax, it's easier to get it
-       correct.
-
-       You can load your splash screen by putting the following
-       lines into /boot/loader.rc:
-
-       load splash_bmp
-       load -t splash_image_data /path/to/file.bmp
-
-       The top line causes the splash_bmp module to get loaded.
-       The second line has the parameter "-t" which tells the
-       loader that the class of DATA being loaded is not a module,
-       but instead a splash_image_data located in file
-       /path/to/file.bmp.
-
-       To get your plug and play data correctly set, run kget,
-       redirecting the output to /boot/kernel.conf.  Note that kget
-       right now adds an extra "q" to it's output (from the q for
-       quit you press when you exit config), and if you want, you
-       can remove that from the file.  Kget reports data only, so
-       feel free to run it, just to see the output.  Make certain
-       you have the kernel option USERCONFIG set in your kernel, so
-       that you can do a boot -c, to initially set your cards up.
-       Then, edit /boot/loader.conf so that the following line
-       shows up (overwriting, in effect, a similar line in
-       /boot/default/loader.conf):
-
-       userconfig_script_load="YES"
-
-       My own pnp line looks like:
-       pnp 1 0 os irq0 15 irq1 0 drq0 1 drq1 0 port0 1332
-       (kget changes numbers from hexadecimal to decimal).  Note
-       that, at this moment, the change from using /kernel.config
-       to using /boot/kernel.conf as the storage place for kernel
-       config changes is going on.  Take a look at your
-       /boot/defaults/loader.conf, see what's defined as
-       userconfig_script_name, and if you override, make sure the
-       file exists.  Note that the loader only has access to the
-       root filesystem, so be careful where you tell it to read
-       from.
-
-
-          o If you interrupt autoboot, you'll engage interactive
-            mode with loader. Everything you type will have the
-            same effects as if it were lines in /boot/loader.rc.
-
-          o While in interactive mode, you can get help by typing
-            "?", "help [<topic> [<subtopic>]]" and "help index".
-            These are mostly commands one would expect a normal
-            user to use. I recommend you play with them a little,
-            to gain further familiarity with what's going on.
-
-            Note that it is not possible to damage or corrupt your
-            system while experimenting with the loader, as it
-            cannot write to any of your filesystems.
-
-          o The command "unload" will unload everything. This is
-            very useful.  Once loader.rc has finished and the
-            system is in the autoboot count-down, you will usually
-            have the kernel and other modules loaded. Now, suppose
-            your new /kernel is broken, how do you load
-            /kernel.old? By typing:
-
-                 unload
-                 load kernel.old
-                 [any other modules you wish to load]
-                 boot
-
-          o If you use loader.conf, you can do:
-
-                 unload
-                 set kernel=kernel.old
-                 boot-conf
-
-            this will then load all the modules you have
-            configured, using kernel.old as kernel, and boot.
-
-          o From loader, you can use the command "more" to read the
-            contents of /boot/loader.rc, if you wish. This is not
-            FreeBSD's more. It is one of loader's builtin commands.
-            Useful if you can't quite recall what you have there.
-            :-) Of course, you can use this command to read
-            anything else you want.
-
-          o "boot -flag" works, "boot kernelname" works, "boot
-            -flag kernelname" doesn't. "boot kernelname -flag"
-            might work, but I'm not sure. The problem is that these
-            flags are kernel's flags, not boot's flags.
-
-          o There are a number of variables that can be set. You
-            can see them in loader.conf, but you can get much more
-            detailed information using the "help" command, eg. help
-            set <variablename>.
-
-          o The variable root_disk_unit is particularly important,
-            as it solves a relatively common problem. This problem
-            shows when the BIOS assign disk units in a different
-            way than the kernel. For example, if you have two IDE
-            disks, one on the primary, the other on the secondary
-            controller, and both as master, the default in most
-            kernels is having the first as ad0, and the second as
-            ad2. If your root partition is in ad2, you'll get an
-            error, because the BIOS sees these disks as 0 and 1
-            (well, 1 and 2), and that's what loader tells the
-            kernel. In this case, "set root_disk_unit=2" solves the
-            problem.  You use this whenever the kernel fails to
-            mount to root partition because it has a wrong unit
-            number.
-
-       FILE OVERVIEW
-
-
-          o /boot/defaults/loader.conf -- Master configuration
-            file, not to be edited.  Overridden by
-            /boot/loader.conf.
-
-          o /boot/loader.conf -- local system customization file,
-            in form very much like /boot/defaults/loader.conf.
-            This file is meant to be used by local users and the
-            sysinstall process.
-
-          o /boot/loader.conf.local -- local installation override
-            file.  This is intended for use by installations with
-            large numbers of systems, to allow global policy
-            overrides.  No FreeBSD tools should ever write this
-            file.
-
-          o /kernel.config -- old location of kernel configuration
-            changes (like pnp changes).
-
-          o /boot/kernel.conf -- new location for kernel
-            configuration changes.
-
-          o /boot/loader.rc -- loader initial configuration file,
-            chiefly used to source in a forth file, and start the
-            configuration process.
-
-       NOTES ON LOADER.CONF SYNTAX
-
-       I'm copy here from the last 11 lines from
-       /boot/defaults/loader.conf:
-
-       ##############################################################
-       ###  Module loading syntax example  ##########################
-       ##############################################################
-
-       #module_load="YES"              # loads module "module"
-       #module_name="realname"         # uses "realname" instead of "module"
-       #module_type="type"             # passes "-t type" to load
-       #module_flags="flags"           # passes "flags" to the module
-       #module_before="cmd"            # executes "cmd" before loading module
-       #module_after="cmd"             # executes "cmd" after loading module
-       #module_error="cmd"             # executes "cmd" if load fails
-
-       The way this works, the command processor used by the loader
-       (which is a subset of forth) inspects  these  variables  for
-       their  suffix,  and  the  7  lines  above illustrate all the
-       currently defined suffixes, and their use.   Take  the  part
-       before  the  underscore,  and customize it i(make it unique)
-       for your particular use, keeping the  suffix  to  allow  the
-       particular function you want to activate.  Extra underscores
-       are fine, because it's only the  sufixes  that  are  scanned
-       for.
-
-
-
-       (authors Chuck Robey and Daniel Sobral).
+    Fill in the blanks
index 614eec9..36fd5ec 100644 (file)
@@ -1,7 +1,7 @@
 # $FreeBSD: src/sys/boot/common/Makefile.inc,v 1.16 2003/06/26 03:51:57 peter Exp $
 # $DragonFly: src/sys/boot/common/Makefile.inc,v 1.5 2008/09/02 17:21:12 dillon Exp $
 
-SRCS+= bcache.c boot.c commands.c console.c devopen.c interp.c 
+SRCS+= bcache.c boot.c commands.c console.c devopen.c
 SRCS+= interp_backslash.c interp_parse.c ls.c misc.c 
 SRCS+= module.c panic.c rel_open.c
 
@@ -30,9 +30,17 @@ SRCS+=       pnp.c
 
 # Forth interpreter
 .if BOOT_FORTH
-SRCS+= interp_forth.c
+SRCS+= do_forth.c
 MAN+=  ../forth/loader.conf.5
 MAN+=  ../forth/loader.4th.8
 .endif
+.if BOOT_DLOADER
+SRCS+= do_dloader.c
+#MAN+= ../dloader/loader.conf.5
+#MAN+= ../dloader/loader.dloader.8
+.endif
+.if BOOT_DEFAULT
+SRCS+= do_default.c
+.endif
 
 MAN+=  loader.8
index 1cb662c..db33ffb 100644 (file)
@@ -53,6 +53,8 @@ static int
 command_boot(int argc, char *argv[])
 {
     struct preloaded_file      *fp;
+    char *local_module_path;
+    char *exported_module_path;
     
     /*
      * See if the user has specified an explicit kernel to boot.
@@ -102,8 +104,34 @@ command_boot(int argc, char *argv[])
     if (archsw.arch_autoload() != 0)
        return(CMD_ERROR);
 
+    /*
+     * Exec the kernel.  We have to shift our exported_module_path
+     * (which has the correct /boot prefix for the kernel) over to
+     * module_path.  If the exec fails we switch it back.
+     */
+    exported_module_path = getenv("exported_module_path");
+    if (exported_module_path) {
+           exported_module_path = strdup(exported_module_path);
+           local_module_path = getenv("module_path");
+           if (local_module_path)
+               local_module_path = strdup(local_module_path);
+           setenv("module_path", exported_module_path, 1);
+           unsetenv("exported_module_path");
+    }
+
     /* Call the exec handler from the loader matching the kernel */
     file_formats[fp->f_loader]->l_exec(fp);
+
+    if (exported_module_path) {
+           if (local_module_path) {
+               setenv("module_path", local_module_path, 1);
+               free(local_module_path);
+           } else {
+               unsetenv("module_path");
+           }
+           setenv("exported_module_path", exported_module_path, 1);
+           free(exported_module_path);
+    }
     return(CMD_ERROR);
 }
 
index bbbf482..5187c0d 100644 (file)
@@ -71,7 +71,8 @@ int   bf_run(char *line);
 int    autoboot(int timeout, char *prompt);
 void   autoboot_maybe(void);
 int    getrootmount(char *rootdev);
-int    rel_open(const char *path, int flags);
+int    rel_open(const char *path, char **abspathp, int flags);
+int    rel_stat(const char *path, struct stat *st);
 int    chdir(const char *path);
 
 /* misc.c */
index 60335f7..16ad5b9 100644 (file)
@@ -132,7 +132,7 @@ command_help(int argc, char *argv[])
 
     /* page the help text from our load path */
     /* sprintf(buf, "%s/boot/loader.help", getenv("loaddev")); */
-    if ((hfd = rel_open("loader.help", O_RDONLY)) < 0) {
+    if ((hfd = rel_open("loader.help", NULL, O_RDONLY)) < 0) {
        printf("Verbose help not available, use '?' to list commands\n");
        return(CMD_OK);
     }
@@ -285,16 +285,12 @@ COMMAND_SET(unset, "unset", "unset a variable", command_unset);
 static int
 command_unset(int argc, char *argv[]) 
 {
-    int                err;
-    
     if (argc != 2) {
        command_errmsg = "wrong number of arguments";
        return(CMD_ERROR);
     } else {
-       if ((err = unsetenv(argv[1])) != 0) {
-           command_errmsg = strerror(err);
-           return(CMD_ERROR);
-       }
+       /* ignore any errors */
+       unsetenv(argv[1]);
     }
     return(CMD_OK);
 }
diff --git a/sys/boot/common/do_default.c b/sys/boot/common/do_default.c
new file mode 100644 (file)
index 0000000..6e9d434
--- /dev/null
@@ -0,0 +1,304 @@
+/*-
+ * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 AUTHOR 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.
+ *
+ * $FreeBSD: src/sys/boot/common/interp.c,v 1.29 2003/08/25 23:30:41 obrien Exp $
+ * $DragonFly: src/sys/boot/common/interp.c,v 1.4 2008/09/02 17:21:12 dillon Exp $
+ */
+
+/*
+ * Simple commandline interpreter, toplevel and misc.
+ *
+ * XXX may be obsoleted by BootFORTH or some other, better, interpreter.
+ */
+
+#include <stand.h>
+#include <string.h>
+#include "bootstrap.h"
+
+#define        RETURN(x)       return(x)
+
+#define        MAXARGS 20                      /* maximum number of arguments allowed */
+
+static void    prompt(void);
+
+static int     perform(int argc, char *argv[]);
+
+/*
+ * Perform the command
+ */
+int
+perform(int argc, char *argv[])
+{
+    int                                result;
+    struct bootblk_command     **cmdp;
+    bootblk_cmd_t              *cmd;
+
+    if (argc < 1)
+       return(CMD_OK);
+
+    /* set return defaults; a successful command will override these */
+    command_errmsg = command_errbuf;
+    strcpy(command_errbuf, "no error message");
+    cmd = NULL;
+    result = CMD_ERROR;
+
+    /* search the command set for the command */
+    SET_FOREACH(cmdp, Xcommand_set) {
+       if (((*cmdp)->c_name != NULL) && !strcmp(argv[0], (*cmdp)->c_name))
+           cmd = (*cmdp)->c_fn;
+    }
+    if (cmd != NULL) {
+       result = (cmd)(argc, argv);
+    } else {
+       command_errmsg = "unknown command";
+    }
+    RETURN(result);
+}
+
+/*
+ * Interactive mode
+ */
+void
+interact(void)
+{
+    char       input[256];                     /* big enough? */
+    int                argc;
+    char       **argv;
+
+    /*
+     * We may be booting from the boot partition, or we may be booting
+     * from the root partition with a /boot sub-directory.  If the latter
+     * chdir into /boot.  Ignore any error.  Only rel_open() uses the chdir
+     * info.
+     */
+    chdir("/boot");
+
+    /*
+     * Read our default configuration
+     */
+    if(include("loader.rc")!=CMD_OK)
+       include("boot.conf");
+    printf("\n");
+    /*
+     * Before interacting, we might want to autoboot.
+     */
+    autoboot_maybe();
+
+    /*
+     * Not autobooting, go manual
+     */
+    printf("\nType '?' for a list of commands, 'help' for more detailed help.\n");
+    if (getenv("prompt") == NULL)
+       setenv("prompt", "${interpret}", 1);
+    if (getenv("interpret") == NULL)
+        setenv("interpret", "OK", 1);
+
+
+    for (;;) {
+       input[0] = '\0';
+       prompt();
+       ngets(input, sizeof(input));
+       if (!parse(&argc, &argv, input)) {
+           if (perform(argc, argv))
+               printf("%s: %s\n", argv[0], command_errmsg);
+           free(argv);
+       } else {
+           printf("parse error\n");
+       }
+    }
+}
+
+/*
+ * Read commands from a file, then execute them.
+ *
+ * We store the commands in memory and close the source file so that the media
+ * holding it can safely go away while we are executing.
+ *
+ * Commands may be prefixed with '@' (so they aren't displayed) or '-' (so
+ * that the script won't stop if they fail).
+ */
+COMMAND_SET(include, "include", "read commands from a file", command_include);
+
+static int
+command_include(int argc, char *argv[])
+{
+    int                i;
+    int                res;
+    char       **argvbuf;
+
+    /*
+     * Since argv is static, we need to save it here.
+     */
+    argvbuf = (char**) calloc((u_int)argc, sizeof(char*));
+    for (i = 0; i < argc; i++)
+       argvbuf[i] = strdup(argv[i]);
+
+    res=CMD_OK;
+    for (i = 1; (i < argc) && (res == CMD_OK); i++)
+       res = include(argvbuf[i]);
+
+    for (i = 0; i < argc; i++)
+       free(argvbuf[i]);
+    free(argvbuf);
+
+    return(res);
+}
+
+struct includeline
+{
+    char               *text;
+    int                        flags;
+    int                        line;
+#define SL_QUIET       (1<<0)
+#define SL_IGNOREERR   (1<<1)
+    struct includeline *next;
+};
+
+int
+include(const char *filename)
+{
+    struct includeline *script, *se, *sp;
+    char               input[256];                     /* big enough? */
+    int                        argc,res;
+    char               **argv, *cp;
+    int                        fd, flags, line;
+
+    if (((fd = rel_open(filename, NULL, O_RDONLY)) == -1)) {
+       sprintf(command_errbuf,"can't open '%s': %s\n",
+               filename, strerror(errno));
+       return(CMD_ERROR);
+    }
+
+    /*
+     * Read the script into memory.
+     */
+    script = se = NULL;
+    line = 0;
+
+    while (fgetstr(input, sizeof(input), fd) >= 0) {
+       line++;
+       flags = 0;
+       /* Discard comments */
+       if (strncmp(input+strspn(input, " "), "\\ ", 2) == 0)
+           continue;
+       cp = input;
+       /* Echo? */
+       if (input[0] == '@') {
+           cp++;
+           flags |= SL_QUIET;
+       }
+       /* Error OK? */
+       if (input[0] == '-') {
+           cp++;
+           flags |= SL_IGNOREERR;
+       }
+       /* Allocate script line structure and copy line, flags */
+       sp = malloc(sizeof(struct includeline) + strlen(cp) + 1);
+       sp->text = (char *)sp + sizeof(struct includeline);
+       strcpy(sp->text, cp);
+       sp->flags = flags;
+       sp->line = line;
+       sp->next = NULL;
+
+       if (script == NULL) {
+           script = sp;
+       } else {
+           se->next = sp;
+       }
+       se = sp;
+    }
+    close(fd);
+
+    /*
+     * Execute the script
+     */
+    argv = NULL;
+    res = CMD_OK;
+    for (sp = script; sp != NULL; sp = sp->next) {
+
+       /* print if not being quiet */
+       if (!(sp->flags & SL_QUIET)) {
+           prompt();
+           printf("%s\n", sp->text);
+       }
+
+       /* Parse the command */
+       if (!parse(&argc, &argv, sp->text)) {
+           if ((argc > 0) && (perform(argc, argv) != 0)) {
+               /* normal command */
+               printf("%s: %s\n", argv[0], command_errmsg);
+               if (!(sp->flags & SL_IGNOREERR)) {
+                   res=CMD_ERROR;
+                   break;
+               }
+           }
+           free(argv);
+           argv = NULL;
+       } else {
+           printf("%s line %d: parse error\n", filename, sp->line);
+           res=CMD_ERROR;
+           break;
+       }
+    }
+    if (argv != NULL)
+       free(argv);
+    while(script != NULL) {
+       se = script;
+       script = script->next;
+       free(se);
+    }
+    return(res);
+}
+
+/*
+ * Emit the current prompt; use the same syntax as the parser
+ * for embedding environment variables.
+ */
+static void
+prompt(void)
+{
+    char       *pr, *p, *cp, *ev;
+
+    if ((cp = getenv("prompt")) == NULL)
+       cp = ">";
+    pr = p = strdup(cp);
+
+    while (*p != 0) {
+       if ((*p == '$') && (*(p+1) == '{')) {
+           for (cp = p + 2; (*cp != 0) && (*cp != '}'); cp++)
+               ;
+           *cp = 0;
+           ev = getenv(p + 2);
+
+           if (ev != NULL)
+               printf("%s", ev);
+           p = cp + 1;
+           continue;
+       }
+       putchar(*p++);
+    }
+    putchar(' ');
+    free(pr);
+}
diff --git a/sys/boot/common/do_dloader.c b/sys/boot/common/do_dloader.c
new file mode 100644 (file)
index 0000000..f0a17f5
--- /dev/null
@@ -0,0 +1,337 @@
+/*-
+ * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 AUTHOR 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.
+ *
+ * $FreeBSD: src/sys/boot/common/interp.c,v 1.29 2003/08/25 23:30:41 obrien Exp $
+ * $DragonFly: src/sys/boot/common/interp.c,v 1.4 2008/09/02 17:21:12 dillon Exp $
+ */
+
+/*
+ * Simple commandline interpreter, toplevel and misc.
+ *
+ * XXX may be obsoleted by BootFORTH or some other, better, interpreter.
+ */
+
+#include <stand.h>
+#include <string.h>
+#include "bootstrap.h"
+#include "dloader.h"
+
+static void    prompt(void);
+
+/*
+ * Perform the command
+ */
+int
+perform(int argc, char *argv[])
+{
+    int                                result;
+    struct bootblk_command     **cmdp;
+    bootblk_cmd_t              *cmd;
+    const char *av0;
+    char *ptr;
+
+    if (argc < 1)
+       return(CMD_OK);
+
+    av0 = argv[0];
+    if ((ptr = strchr(av0, '=')) != NULL)
+       av0 = "local";
+
+    /* set return defaults; a successful command will override these */
+    command_errmsg = command_errbuf;
+    strcpy(command_errbuf, "no error message");
+    cmd = NULL;
+    result = CMD_ERROR;
+
+    /* search the command set for the command */
+    SET_FOREACH(cmdp, Xcommand_set) {
+       if (((*cmdp)->c_name != NULL) && !strcmp(av0, (*cmdp)->c_name))
+           cmd = (*cmdp)->c_fn;
+    }
+    if (cmd != NULL) {
+       result = (cmd)(argc, argv);
+    } else {
+       command_errmsg = "unknown command";
+    }
+    return(result);
+}
+
+/*
+ * Interactive mode
+ */
+void
+interact(void)
+{
+    char       input[256];                     /* big enough? */
+    int                argc;
+    char       **argv;
+
+    /*
+     * We may be booting from the boot partition, or we may be booting
+     * from the root partition with a /boot sub-directory.  If the latter
+     * chdir into /boot.  Ignore any error.  Only rel_open() uses the chdir
+     * info.
+     */
+    chdir("/boot");
+    setenv("base", DirBase, 1);
+
+    /*
+     * Read our default configuration
+     */
+    if (include("dloader.rc")!=CMD_OK)
+       include("boot.conf");
+    printf("\n");
+    /*
+     * Before interacting, we might want to autoboot.
+     */
+    autoboot_maybe();
+
+    dloader_init_cmds();
+
+    /*
+     * Not autobooting, go manual
+     */
+    printf("\nType '?' for a list of commands, 'help' for more detailed help.\n");
+    if (getenv("prompt") == NULL)
+       setenv("prompt", "${interpret}", 1);
+    if (getenv("interpret") == NULL)
+        setenv("interpret", "OK", 1);
+
+
+    for (;;) {
+       input[0] = '\0';
+       prompt();
+       ngets(input, sizeof(input));
+       if (!parse(&argc, &argv, input)) {
+           if (perform(argc, argv))
+               printf("%s: %s\n", argv[0], command_errmsg);
+           free(argv);
+       } else {
+           printf("parse error\n");
+       }
+    }
+}
+
+/*
+ * Read commands from a file, then execute them.
+ *
+ * We store the commands in memory and close the source file so that the media
+ * holding it can safely go away while we are executing.
+ *
+ * Commands may be prefixed with '@' (so they aren't displayed) or '-' (so
+ * that the script won't stop if they fail).
+ */
+COMMAND_SET(include, "include", "run commands from file", command_include);
+
+static int
+command_include(int argc, char *argv[])
+{
+    int                i;
+    int                res;
+    char       **argvbuf;
+
+    /*
+     * Since argv is static, we need to save it here.
+     */
+    argvbuf = (char**) calloc((u_int)argc, sizeof(char*));
+    for (i = 0; i < argc; i++)
+       argvbuf[i] = strdup(argv[i]);
+
+    res=CMD_OK;
+    for (i = 1; (i < argc) && (res == CMD_OK); i++)
+       res = include(argvbuf[i]);
+
+    for (i = 0; i < argc; i++)
+       free(argvbuf[i]);
+    free(argvbuf);
+
+    return(res);
+}
+COMMAND_SET(optinclude, "optinclude", "run commands from file",
+           command_optinclude);
+
+static int
+command_optinclude(int argc, char *argv[])
+{
+    int                i;
+    int                res;
+    char       **argvbuf;
+
+    /*
+     * Since argv is static, we need to save it here.
+     */
+    argvbuf = (char**) calloc((u_int)argc, sizeof(char*));
+    for (i = 0; i < argc; i++)
+       argvbuf[i] = strdup(argv[i]);
+
+    res=CMD_OK;
+    for (i = 1; (i < argc) && (res == CMD_OK); i++)
+       include(argvbuf[i]);
+
+    for (i = 0; i < argc; i++)
+       free(argvbuf[i]);
+    free(argvbuf);
+
+    return(res);
+}
+
+struct includeline
+{
+    char               *text;
+    int                        flags;
+    int                        line;
+#define SL_QUIET       (1<<0)
+#define SL_IGNOREERR   (1<<1)
+    struct includeline *next;
+};
+
+int
+include(const char *filename)
+{
+    struct includeline *script, *se, *sp;
+    char               input[256];                     /* big enough? */
+    int                        argc,res;
+    char               **argv, *cp;
+    int                        fd, flags, line;
+
+    if (((fd = rel_open(filename, NULL, O_RDONLY)) == -1)) {
+       command_errmsg = command_errbuf;
+       snprintf(command_errbuf, 256, "cannot find \"%s\"", filename);
+       return(CMD_ERROR);
+    }
+
+    /*
+     * Read the script into memory.
+     */
+    script = se = NULL;
+    line = 0;
+
+    while (fgetstr(input, sizeof(input), fd) >= 0) {
+       line++;
+       flags = 0;
+       /* Discard comments */
+       if (strncmp(input+strspn(input, " "), "\\ ", 2) == 0)
+           continue;
+       cp = input;
+       /* Echo? */
+       if (input[0] == '@') {
+           cp++;
+           flags |= SL_QUIET;
+       }
+       /* Error OK? */
+       if (input[0] == '-') {
+           cp++;
+           flags |= SL_IGNOREERR;
+       }
+       /* Allocate script line structure and copy line, flags */
+       sp = malloc(sizeof(struct includeline) + strlen(cp) + 1);
+       sp->text = (char *)sp + sizeof(struct includeline);
+       strcpy(sp->text, cp);
+       sp->flags = flags;
+       sp->line = line;
+       sp->next = NULL;
+
+       if (script == NULL) {
+           script = sp;
+       } else {
+           se->next = sp;
+       }
+       se = sp;
+    }
+    close(fd);
+
+    /*
+     * Execute the script
+     */
+    argv = NULL;
+    res = CMD_OK;
+    for (sp = script; sp != NULL; sp = sp->next) {
+
+#if 0
+       /* print if not being quiet */
+       if (!(sp->flags & SL_QUIET)) {
+           prompt();
+           printf("%s\n", sp->text);
+       }
+#endif
+
+       /* Parse the command */
+       if (!parse(&argc, &argv, sp->text)) {
+           if ((argc > 0) && (perform(argc, argv) != 0)) {
+               /* normal command */
+               printf("%s: %s\n", argv[0], command_errmsg);
+               if (!(sp->flags & SL_IGNOREERR)) {
+                   res=CMD_ERROR;
+                   break;
+               }
+           }
+           free(argv);
+           argv = NULL;
+       } else {
+           printf("%s line %d: parse error\n", filename, sp->line);
+           res=CMD_ERROR;
+           break;
+       }
+    }
+    if (argv != NULL)
+       free(argv);
+    while(script != NULL) {
+       se = script;
+       script = script->next;
+       free(se);
+    }
+    return(res);
+}
+
+/*
+ * Emit the current prompt; use the same syntax as the parser
+ * for embedding environment variables.
+ */
+static void
+prompt(void)
+{
+    char       *pr, *p, *cp, *ev;
+
+    if ((cp = getenv("prompt")) == NULL)
+       cp = ">";
+    pr = p = strdup(cp);
+
+    while (*p != 0) {
+       if ((*p == '$') && (*(p+1) == '{')) {
+           for (cp = p + 2; (*cp != 0) && (*cp != '}'); cp++)
+               ;
+           *cp = 0;
+           ev = getenv(p + 2);
+
+           if (ev != NULL)
+               printf("%s", ev);
+           p = cp + 1;
+           continue;
+       }
+       putchar(*p++);
+    }
+    putchar(' ');
+    free(pr);
+}
diff --git a/sys/boot/common/do_forth.c b/sys/boot/common/do_forth.c
new file mode 100644 (file)
index 0000000..3e56dc9
--- /dev/null
@@ -0,0 +1,238 @@
+/*-
+ * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 AUTHOR 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.
+ *
+ * $FreeBSD: src/sys/boot/common/interp.c,v 1.29 2003/08/25 23:30:41 obrien Exp $
+ * $DragonFly: src/sys/boot/common/interp.c,v 1.4 2008/09/02 17:21:12 dillon Exp $
+ */
+
+/*
+ * Simple commandline interpreter, toplevel and misc.
+ *
+ * XXX may be obsoleted by BootFORTH or some other, better, interpreter.
+ */
+
+#include <stand.h>
+#include <string.h>
+#include "bootstrap.h"
+
+#include "ficl.h"
+#define        RETURN(x)       stackPushINT(bf_vm->pStack,!x); return(x)
+
+extern FICL_VM *bf_vm;
+
+#define        MAXARGS 20                      /* maximum number of arguments allowed */
+
+static void    prompt(void);
+
+/*
+ * Interactive mode
+ */
+void
+interact(void)
+{
+    char       input[256];                     /* big enough? */
+
+    bf_init();
+
+    /*
+     * We may be booting from the boot partition, or we may be booting
+     * from the root partition with a /boot sub-directory.  If the latter
+     * chdir into /boot.  Ignore any error.  Only rel_open() uses the chdir
+     * info.
+     */
+    chdir("/boot");
+
+    /*
+     * Read our default configuration
+     */
+    if(include("loader.rc")!=CMD_OK)
+       include("boot.conf");
+    printf("\n");
+    /*
+     * Before interacting, we might want to autoboot.
+     */
+    autoboot_maybe();
+
+    /*
+     * Not autobooting, go manual
+     */
+    printf("\nType '?' for a list of commands, 'help' for more detailed help.\n");
+    if (getenv("prompt") == NULL)
+       setenv("prompt", "${interpret}", 1);
+    if (getenv("interpret") == NULL)
+        setenv("interpret", "OK", 1);
+
+
+    for (;;) {
+       input[0] = '\0';
+       prompt();
+       ngets(input, sizeof(input));
+       bf_vm->sourceID.i = 0;
+       bf_run(input);
+    }
+}
+
+/*
+ * Read commands from a file, then execute them.
+ *
+ * We store the commands in memory and close the source file so that the media
+ * holding it can safely go away while we are executing.
+ *
+ * Commands may be prefixed with '@' (so they aren't displayed) or '-' (so
+ * that the script won't stop if they fail).
+ */
+COMMAND_SET(include, "include", "read commands from a file", command_include);
+
+static int
+command_include(int argc, char *argv[])
+{
+    int                i;
+    int                res;
+    char       **argvbuf;
+
+    /*
+     * Since argv is static, we need to save it here.
+     */
+    argvbuf = (char**) calloc((u_int)argc, sizeof(char*));
+    for (i = 0; i < argc; i++)
+       argvbuf[i] = strdup(argv[i]);
+
+    res=CMD_OK;
+    for (i = 1; (i < argc) && (res == CMD_OK); i++)
+       res = include(argvbuf[i]);
+
+    for (i = 0; i < argc; i++)
+       free(argvbuf[i]);
+    free(argvbuf);
+
+    return(res);
+}
+
+struct includeline
+{
+    char               *text;
+    int                        flags;
+    int                        line;
+#define SL_QUIET       (1<<0)
+#define SL_IGNOREERR   (1<<1)
+    struct includeline *next;
+};
+
+int
+include(const char *filename)
+{
+    struct includeline *script, *se, *sp;
+    char               input[256];                     /* big enough? */
+    int                        res;
+    char               *cp;
+    int                        prevsrcid, fd, line;
+
+    if (((fd = rel_open(filename, NULL, O_RDONLY)) == -1)) {
+       sprintf(command_errbuf,"can't open '%s': %s\n", filename, strerror(errno));
+       return(CMD_ERROR);
+    }
+
+    /*
+     * Read the script into memory.
+     */
+    script = se = NULL;
+    line = 0;
+
+    while (fgetstr(input, sizeof(input), fd) >= 0) {
+       line++;
+
+       cp = input;
+
+       /* Allocate script line structure and copy line, flags */
+       sp = malloc(sizeof(struct includeline) + strlen(cp) + 1);
+       sp->text = (char *)sp + sizeof(struct includeline);
+       strcpy(sp->text, cp);
+       sp->line = line;
+       sp->next = NULL;
+
+       if (script == NULL) {
+           script = sp;
+       } else {
+           se->next = sp;
+       }
+       se = sp;
+    }
+    close(fd);
+
+    /*
+     * Execute the script
+     */
+    prevsrcid = bf_vm->sourceID.i;
+    bf_vm->sourceID.i = fd;
+    res = CMD_OK;
+    for (sp = script; sp != NULL; sp = sp->next) {
+
+       res = bf_run(sp->text);
+       if (res != VM_OUTOFTEXT) {
+               sprintf(command_errbuf, "Error while including %s, in the line:\n%s", filename, sp->text);
+               res = CMD_ERROR;
+               break;
+       } else
+               res = CMD_OK;
+    }
+    bf_vm->sourceID.i = prevsrcid;
+    while(script != NULL) {
+       se = script;
+       script = script->next;
+       free(se);
+    }
+    return(res);
+}
+
+/*
+ * Emit the current prompt; use the same syntax as the parser
+ * for embedding environment variables.
+ */
+static void
+prompt(void)
+{
+    char       *pr, *p, *cp, *ev;
+
+    if ((cp = getenv("prompt")) == NULL)
+       cp = ">";
+    pr = p = strdup(cp);
+
+    while (*p != 0) {
+       if ((*p == '$') && (*(p+1) == '{')) {
+           for (cp = p + 2; (*cp != 0) && (*cp != '}'); cp++)
+               ;
+           *cp = 0;
+           ev = getenv(p + 2);
+
+           if (ev != NULL)
+               printf("%s", ev);
+           p = cp + 1;
+           continue;
+       }
+       putchar(*p++);
+    }
+    putchar(' ');
+    free(pr);
+}
index 5fa2ddc..18d82b2 100644 (file)
@@ -99,7 +99,18 @@ parse(int *argc, char ***argv, char *str)
     while (*p) {
        switch (state) {
        case STR:
-           if ((*p == '\\') && p[1]) {
+           /*
+            * Check comment
+            */
+           if (*p == '#' && quote == 0) {
+               *p = 0;
+               break;
+           }
+
+           /*
+            * Check line continuation
+            */
+           if (*p == '\\' && p[1]) {
                p++;
                PARSE_FAIL(i == (PARSE_BUFSIZE - 1));
                buf[i++] = *p++;
@@ -164,8 +175,8 @@ parse(int *argc, char ***argv, char *str)
     }
     args[ac] = NULL;
     *argc = ac;
-    *argv = (char **)malloc((sizeof(char *) * ac + 1));
-    bcopy(args, *argv, sizeof(char *) * ac + 1);
+    *argv = (char **)malloc(sizeof(char *) * (ac + 1));
+    bcopy(args, *argv, sizeof(char *) * (ac + 1));
     free(buf);
     free(copy);
     return 0;
index dd4cd66..ffe4858 100644 (file)
@@ -45,7 +45,7 @@ filedup(const char *path, int flags)
     int                fd;
     size_t     size, result;
     
-    if ((fd = rel_open(path, F_READ | flags)) == -1)
+    if ((fd = rel_open(path, NULL, F_READ | flags)) == -1)
        return(NULL);
     
     printf("%s open, flags 0x%x\n", path, files[fd].f_flags);
@@ -87,7 +87,7 @@ filedup(const char *path, int flags)
     close(fd);
 
     /* reopen the file, realloc the buffer */
-    if ((fd = rel_open(path, F_READ | flags)) == -1)
+    if ((fd = rel_open(path, NULL, F_READ | flags)) == -1)
        return(NULL);
     buf = alloc(size);
     result = read(fd, buf, size);
index aa6307a..e20244b 100644 (file)
@@ -98,6 +98,7 @@ __elfN(loadfile)(char *filename, u_int64_t dest, struct preloaded_file **result)
     int                                err;
     u_int                      pad;
     ssize_t                    bytes_read;
+    char                       *fullpath;
 
     fp = NULL;
     bzero(&ef, sizeof(struct elf_file));
@@ -107,11 +108,12 @@ __elfN(loadfile)(char *filename, u_int64_t dest, struct preloaded_file **result)
      */
     if (filename == NULL)      /* can't handle nameless */
        return(EFTYPE);
-    if ((ef.fd = rel_open(filename, O_RDONLY)) == -1)
+    if ((ef.fd = rel_open(filename, &fullpath, O_RDONLY)) == -1)
        return(errno);
     ef.firstpage = malloc(PAGE_SIZE);
     if (ef.firstpage == NULL) {
        close(ef.fd);
+       free(fullpath);
        return(ENOMEM);
     }
     bytes_read = read(ef.fd, ef.firstpage, PAGE_SIZE);
@@ -194,8 +196,30 @@ __elfN(loadfile)(char *filename, u_int64_t dest, struct preloaded_file **result)
            err = EPERM;
            goto out;
     }
-    if (ef.kernel)
-       setenv("kernelname", filename, 1);
+
+    /*
+     * Set the kernel name and module path correctly for the kernel's
+     * consumption.  Always prepend a /boot if we don't have one.
+     */
+    if (ef.kernel) {
+       char *mptr;
+       char *fpend;
+       const char *prefix = "";
+
+       mptr = malloc(strlen(fullpath) * 2 + 10 + 16);
+       if (strncmp(fullpath, "/boot/", 6) != 0)
+               prefix = "/boot";
+       sprintf(mptr, "%s%s", prefix, fullpath);
+       setenv("kernelname", mptr, 1);
+
+       fpend = strrchr(mptr, '/');
+       *fpend = 0;
+       if (strcmp(mptr, "/boot") == 0)
+               sprintf(mptr, "/boot/modules");
+       /* this will be moved to "module_path" on boot */
+       setenv("exported_module_path", mptr, 1);
+       free(mptr);
+    }
     fp->f_name = strdup(filename);
     fp->f_type = strdup(ef.kernel ? __elfN(kerneltype) : __elfN(moduletype));
 
@@ -226,6 +250,8 @@ __elfN(loadfile)(char *filename, u_int64_t dest, struct preloaded_file **result)
     if (ef.firstpage)
        free(ef.firstpage);
     close(ef.fd);
+    if (fullpath)
+       free(fullpath);
     return(err);
 }
 
index d3afbdc..8470f11 100644 (file)
@@ -97,7 +97,7 @@ __elfN(obj_loadfile)(char *filename, u_int64_t dest,
         */
        if (filename == NULL)   /* can't handle nameless */
                return(EFTYPE);
-       if ((ef.fd = rel_open(filename, O_RDONLY)) == -1)
+       if ((ef.fd = rel_open(filename, NULL, O_RDONLY)) == -1)
                return(errno);
 
        hdr = &ef.hdr;
index d06b2fa..27b25ab 100644 (file)
@@ -108,7 +108,7 @@ command_ls(int argc, char *argv[])
                buf = malloc(strlen(path) + strlen(d->d_name) + 2);
                sprintf(buf, "%s/%s", path, d->d_name);
                /* ignore return, could be symlink, etc. */
-               if (stat(buf, &sb))
+               if (rel_stat(buf, &sb))
                    sb.st_size = 0;
                free(buf);
                sprintf(lbuf, " %c %8d %s\n", typestr[d->d_type],
@@ -154,11 +154,7 @@ ls_getdir(char **pathp)
        goto out;
     }
     
-    /* If there's no path on the device, assume '/' */
-    if (*cp == 0)
-       strcat(path, "/");
-
-    fd = rel_open(path, O_RDONLY);
+    fd = rel_open(cp, NULL, O_RDONLY);
     if (fd < 0) {
        sprintf(command_errbuf, "open '%s' failed: %s", path, strerror(errno));
        goto out;
index 8c7bd2d..0ba83c3 100644 (file)
@@ -66,7 +66,7 @@ static void                   moduledir_rebuild(void);
 /* load address should be tweaked by first module loaded (kernel) */
 static vm_offset_t     loadaddr = 0;
 
-static const char      *default_searchpath ="/boot;/boot/modules;/;/modules";
+static const char      *default_searchpath ="modules;KERNEL";
 
 static STAILQ_HEAD(, moduledir) moduledir_list = STAILQ_HEAD_INITIALIZER(moduledir_list);
 
@@ -327,7 +327,7 @@ file_loadraw(char *type, char *name)
     }
     name = cp;
     
-    if ((fd = rel_open(name, O_RDONLY)) < 0) {
+    if ((fd = rel_open(name, NULL, O_RDONLY)) < 0) {
        sprintf(command_errbuf, "can't open '%s': %s", name, strerror(errno));
        free(name);
        return(CMD_ERROR);
@@ -589,8 +589,9 @@ file_lookup(const char *path, const char *name, int namelen, char **extlist)
     cp += namelen;
     for (cpp = extlist; *cpp; cpp++) {
        strcpy(cp, *cpp);
-       if (stat(result, &st) == 0 && S_ISREG(st.st_mode))
+       if (rel_stat(result, &st) == 0 && S_ISREG(st.st_mode)) {
            return result;
+       }
     }
     free(result);
     return NULL;
@@ -635,7 +636,7 @@ file_search(const char *name, char **extlist)
 
     if (file_havepath(name)) {
        /* Qualified, so just see if it exists */
-       if (stat(name, &sb) == 0)
+       if (rel_stat(name, &sb) == 0)
            return(strdup(name));
        return(NULL);
     }
@@ -864,8 +865,8 @@ moduledir_readhints(struct moduledir *mdp)
     if (mdp->d_hints != NULL || (mdp->d_flags & MDIR_NOHINTS))
        return;
     path = moduledir_fullpath(mdp, "linker.hints");
-    if (stat(path, &st) != 0 || st.st_size < (sizeof(version) + sizeof(int)) ||
-       st.st_size > 100 * 1024 || (fd = rel_open(path, O_RDONLY)) < 0) {
+    if (rel_stat(path, &st) != 0 || st.st_size < (sizeof(version) + sizeof(int)) ||
+       st.st_size > 100 * 1024 || (fd = rel_open(path, NULL, O_RDONLY)) < 0) {
        free(path);
        mdp->d_flags |= MDIR_NOHINTS;
        return;
index 9a2def8..d4ee385 100644 (file)
@@ -176,7 +176,7 @@ pnp_readconf(char *path)
     char               *cp, *ep, *tp, c;
 
     /* try to open the file */
-    if ((fd = rel_open(path, O_RDONLY)) >= 0) {
+    if ((fd = rel_open(path, NULL, O_RDONLY)) >= 0) {
        line = 0;
        currbus = NULL;
        
index 04259dd..728999c 100644 (file)
 #include <string.h>
 #include "bootstrap.h"
 
-const char *DirBase;
+char *DirBase;
+
+COMMAND_SET(cd, "cd", "Change directory", command_chdir);
+COMMAND_SET(optcd, "optcd", "Change directory", command_optchdir);
+
+int
+command_chdir(int ac, char **av)
+{
+       if (ac != 2) {
+               sprintf(command_errbuf, "Missing path");
+               return(CMD_ERROR);
+       }
+       return(chdir(av[1]));
+}
+
+int
+command_optchdir(int ac, char **av)
+{
+       if (ac == 2)
+               chdir(av[1]);
+       return(CMD_OK);
+}
 
 int
 chdir(const char *path)
 {
        struct stat st;
+       char *base;
+       char *p;
+       char *b;
+       char *s;
+       char *w;
+       int len;
+       int dlen;
+       int res;
+
+       if (DirBase == NULL)
+               DirBase = strdup("/");
+
+       len = strlen(path);
+       if (path[0] == '/') {
+               base = malloc(len + 2);         /* room for trailing / */
+               bcopy(path, base, len + 1);
+       } else {
+               while (len && path[len-1] == '/')
+                       --len;
+               dlen = strlen(DirBase);
+               base = malloc(dlen + len + 2);  /* room for trailing / */
+               bcopy(DirBase, base, dlen);
+               bcopy(path, base + dlen, len);
+               base[dlen + len] = 0;
+       }
+
+       if (stat(base, &st) == 0 && S_ISDIR(st.st_mode)) {
+               p = b = w = s = base;
+               while (*s) {
+                       if (*s == '/') {
+                               if (s - b == 2 && b[0] == '.' && b[1] == '.') {
+                                       w = p;
+                               } else {
+                                       p = b;
+                                       b = s + 1;
+                               }
+                               while (s[1] == '/')
+                                       ++s;
+                       }
+                       *w = *s;
+                       ++w;
+                       ++s;
+               }
+               if (s - b == 2 && b[0] == '.' && b[1] == '.')
+                       w = p;
+               while (w > base && w[-1] == '/')
+                       --w;
+               *w++ = '/';
+               *w = 0;
+
+               if (DirBase)
+                       free(DirBase);
+               DirBase = base;
+               res = CMD_OK;
+       } else {
+               free(base);
+               sprintf(command_errbuf, "Unable to find directory");
+               res = CMD_ERROR;
+       }
+       return (res);
+}
+
+COMMAND_SET(pwd, "pwd", "Get current directory", command_pwd);
 
-       if (stat(path, &st) == 0 && S_ISDIR(st.st_mode))
-               DirBase = path;
-       return 0;
+int
+command_pwd(int ac, char **av)
+{
+       printf("%s\n", DirBase ? DirBase : "/");
+       return(0);
 }
 
 int
-rel_open(const char *path, int flags)
+rel_open(const char *path, char **abspathp, int flags)
 {
        int fd;
        char *ptr;
 
-       if (DirBase && path[0] != '/') {
-               ptr = malloc(strlen(DirBase) + strlen(path) + 2);
-               sprintf(ptr, "%s/%s", DirBase, path);
+       if (DirBase == NULL)
+               DirBase = strdup("/");
+
+       if (path[0] != '/') {
+               ptr = malloc(strlen(DirBase) + strlen(path) + 1);
+               sprintf(ptr, "%s%s", DirBase, path);
                fd = open(ptr, flags);
-               free(ptr);
+               if (abspathp && fd >= 0)
+                       *abspathp = ptr;
+               else if (abspathp)
+                       *abspathp = NULL;
+               else
+                       free(ptr);
        } else {
                fd = open(path, flags);
+               if (abspathp && fd >= 0)
+                       *abspathp = strdup(path);
+               else if (abspathp)
+                       *abspathp = NULL;
        }
        return(fd);
 }
 
+int
+rel_stat(const char *path, struct stat *st)
+{
+       char *ptr;
+       int res;
+
+       if (DirBase == NULL)
+               DirBase = strdup("/");
+
+       if (path[0] != '/') {
+               ptr = malloc(strlen(DirBase) + strlen(path) + 1);
+               sprintf(ptr, "%s%s", DirBase, path);
+               res = stat(ptr, st);
+               free(ptr);
+       } else {
+               res = stat(path, st);
+       }
+       return(res);
+}
+
diff --git a/sys/boot/dloader/Makefile b/sys/boot/dloader/Makefile
new file mode 100644 (file)
index 0000000..de1fb22
--- /dev/null
@@ -0,0 +1,51 @@
+# The DragonFly Loader
+#
+#
+.if exists(../${MACHINE_PLATFORM}/Makefile.inc)
+.include "../${MACHINE_PLATFORM}/Makefile.inc"
+.endif
+
+.PATH: ${.CURDIR}/${MACHINE_ARCH}
+SRCS=  subs.c config.c cmds.c
+
+CFLAGS+=       -ffreestanding
+.if HAVE_PNP
+CFLAGS+=       -DHAVE_PNP
+.endif
+.ifmake testmain
+CFLAGS+=       -DTESTMAIN -D_TESTMAIN
+SRCS+=         testmain.c
+PROG=          testmain
+OBJS+=         rel_open.o
+
+rel_open.o: ../common/rel_open.c
+
+.include <bsd.prog.mk>
+.else
+OBJS+=         stack_protector.o
+LIB=           dloader
+INTERNALLIB=   yes
+
+stack_protector.o: ../../libkern/stack_protector.c
+
+.include <bsd.lib.mk>
+.endif
+
+.if defined(REALLY_X86_64)
+CFLAGS+=       -m32 -I.
+.endif
+
+CFLAGS+=       -I${.CURDIR}
+CFLAGS+=       -I${.CURDIR}/${MACHINE_ARCH}
+CFLAGS+=       -I${.CURDIR}/../common
+
+.if defined(REALLY_X86_64)
+${SRCS:M*.c:R:S/$/.o/g}: machine
+
+beforedepend ${OBJS}: machine
+
+machine:
+       ${LN} -sf ${.CURDIR}/../../i386/include machine
+
+CLEANFILES+=   machine
+.endif
diff --git a/sys/boot/dloader/cmds.c b/sys/boot/dloader/cmds.c
new file mode 100644 (file)
index 0000000..3fb37bd
--- /dev/null
@@ -0,0 +1,378 @@
+/*
+ * Copyright (c) 2010 The DragonFly Project.  All rights reserved.
+ *
+ * This code is derived from software contributed to The DragonFly Project
+ * by Matthew Dillon <dillon@backplane.com>
+ *
+ * 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. Neither the name of The DragonFly Project nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific, prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``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
+ * COPYRIGHT HOLDERS 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 <stand.h>
+#include <string.h>
+#include "bootstrap.h"
+#include "dloader.h"
+
+static void menu_display(void);
+static int menu_execute(int);
+
+/*
+ * This is called from common and must reference files to bring
+ * library modules into common during linking.
+ */
+void
+dloader_init_cmds(void)
+{
+}
+
+/*
+ * This intercepts lines of the form 'a=b'
+ */
+COMMAND_SET(local, "local", "List local variables", command_local);
+COMMAND_SET(lunset, "lunset", "Unset local variables", command_lunset);
+COMMAND_SET(lunsetif, "lunsetif", "Unset local if envvar set to 1 or YES", command_lunsetif);
+COMMAND_SET(loadall, "loadall", "Load kernel + modules", command_loadall);
+COMMAND_SET(menuclear, "menuclear", "Clear all menus", command_menuclear);
+COMMAND_SET(menuitem, "menuitem", "Add menu bullet", command_menuitem);
+COMMAND_SET(menuadd, "menuadd", "Add script line for bullet", command_menuadd);
+COMMAND_SET(menu, "menu", "Run menu system", command_menu);
+
+static int curitem;
+static int curadd;
+
+/*
+ * Set local variable.  Sniff "module_path"
+ *
+ * format a=b (one argument) - in av[0]
+ */
+static int
+command_local(int ac, char **av)
+{
+       char *name;
+       char *data;
+       dvar_t dvar;
+       int i;
+       int j;
+
+       /*
+        * local command executed directly.
+        */
+       if (strcmp(av[0], "local") == 0) {
+               for (dvar = dvar_first(); dvar; dvar = dvar_next(dvar)) {
+                       for (j = 1; j < ac; ++j) {
+                               if (!strncmp(dvar->name, av[j], strlen(av[j])))
+                                       break;
+                       }
+                       if (ac > 1 && j == ac)
+                               continue;
+
+                       printf("%s=", dvar->name);
+                       for (i = 0; i < dvar->count; ++i) {
+                               if (i)
+                                       printf(",");
+                               printf("\"%s\"", dvar->data[i]);
+                       }
+                       printf("\n");
+               }
+               return(CMD_OK);
+       }
+
+       /*
+        * local command intercept for blah=blah
+        */
+       name = av[0];
+       data = strchr(name, '=');
+       if (data == NULL) {
+               sprintf(command_errbuf, "Bad variable syntax");
+               return (CMD_ERROR);
+       }
+       *data++ = 0;
+
+       if (*data)
+               dvar_set(name, &data, 1);
+       else
+               dvar_unset(name);
+
+       if (strchr(name, '.') ||
+           strcmp(name, "kernelname") == 0 ||
+           strcmp(name, "module_path") == 0) {
+               if (*data)
+                       setenv(name, data, 1);
+               else
+                       unsetenv(name);
+       }
+       return(CMD_OK);
+}
+
+/*
+ * Unset local variables
+ */
+static int
+command_lunset(int ac, char **av)
+{
+       int i;
+
+       for (i = 1; i < ac; ++i)
+               dvar_unset(av[i]);
+       return(0);
+}
+
+static int
+command_lunsetif(int ac, char **av)
+{
+       char *envdata;
+
+       if (ac != 3) {
+               sprintf(command_errbuf,
+                       "syntax error use lunsetif lname envname");
+               return(CMD_ERROR);
+       }
+       envdata = getenv(av[2]);
+       if (strcmp(envdata, "yes") == 0 ||
+           strcmp(envdata, "YES") == 0 ||
+           strtol(envdata, NULL, 0)) {
+               dvar_unset(av[1]);
+       }
+       return (CMD_OK);
+}
+
+/*
+ * Load the kernel + all modules specified with
+ */
+static int
+command_loadall(int ac, char **av)
+{
+       char *argv[4];
+       dvar_t dvar;
+       int len;
+       int argc;
+       int res;
+       int tmp;
+
+       argv[0] = "unload";
+       (void)perform(1, argv);
+
+       /*
+        * Load kernel
+        */
+       argv[0] = "load";
+       argv[1] = getenv("kernelname");
+       if (argv[1] == NULL)
+               argv[1] = strdup("kernel");
+       res = perform(2, argv);
+       free(argv[1]);
+
+       if (res != CMD_OK) {
+               printf("Unable to load %s%s\n", DirBase, argv[1]);
+               return(res);
+       }
+
+       /*
+        * Load modules
+        */
+       for (dvar = dvar_first(); dvar; dvar = dvar_next(dvar)) {
+               len = strlen(dvar->name);
+               if (len <= 5 || strcmp(dvar->name + len - 5, "_load"))
+                       continue;
+               if (strcmp(dvar->data[0], "yes") != 0 &&
+                   strcmp(dvar->data[0], "YES") != 0) {
+                       continue;
+               }
+               argv[0] = "load";
+               argv[1] = strdup(dvar->name);
+               argv[1][len - 5] = 0;
+               tmp = perform(2, argv);
+               free(argv[1]);
+               if (tmp != CMD_OK) {
+                       time_t t = time(NULL);
+                       printf("Unable to load %s%s\n", DirBase, argv[1]);
+                       while (time(NULL) == t)
+                               ;
+                       /* don't kill the boot sequence */
+                       /* res = tmp; */
+               }
+
+       }
+       return(res);
+}
+
+/*
+ * Clear all menus
+ */
+static int
+command_menuclear(int ac, char **av)
+{
+       dvar_unset("menu_*");
+       dvar_unset("item_*");
+       curitem = 0;
+       curadd = 0;
+       return(0);
+}
+
+/*
+ * Add menu bullet
+ */
+static int
+command_menuitem(int ac, char **av)
+{
+       char namebuf[32];
+
+       if (ac != 3) {
+               sprintf(command_errbuf, "Bad menuitem syntax");
+               return (CMD_ERROR);
+       }
+       curitem = strtol(av[1], NULL, 0);
+       snprintf(namebuf, sizeof(namebuf), "menu_%d", curitem);
+       dvar_set(namebuf, &av[2], 1);
+       curadd = 0;
+
+       return(CMD_OK);
+}
+
+/*
+ * Add execution item
+ */
+static int
+command_menuadd(int ac, char **av)
+{
+       char namebuf[32];
+       int i;
+
+       if (ac == 1)
+               return(CMD_OK);
+       snprintf(namebuf, sizeof(namebuf), "item_%d_%d", curitem, curadd);
+       dvar_set(namebuf, &av[1], ac - 1);
+       ++curadd;
+       return (CMD_OK);
+}
+
+/*
+ * Execute menu system
+ */
+static int
+command_menu(int ac, char **av)
+{
+       int timeout = -1;
+       time_t time_target;
+       time_t time_last;
+       time_t t;
+       char *cp;
+       int c;
+       int res;
+
+       menu_display();
+       if ((cp = getenv("autoboot_delay")) != NULL)
+               timeout = strtol(cp, NULL, 0);
+       if (timeout <= 0)
+               timeout = 10;
+       if (timeout > 24 * 60 * 60)
+               timeout = 24 * 60 * 60;
+
+       time_target = time(NULL) + timeout;
+       time_last = 0;
+       c = '1';
+       for (;;) {
+               if (ischar()) {
+                       c = getchar();
+                       if (c == '\r' || c == '\n') {
+                               c = '1';
+                               break;
+                       }
+                       if (c == 0x1b) {
+                               setenv("autoboot_delay", "NO", 1);
+                               return(CMD_OK);
+                       }
+                       res = menu_execute(c);
+                       if (res >= 0) {
+                               setenv("autoboot_delay", "NO", 1);
+                               return(CMD_OK);
+                       }
+                       /* else ignore char */
+               }
+               t = time(NULL);
+               if (time_last == t)
+                       continue;
+               time_last = t;
+               printf("\rBooting in %d second%s... ",
+                       (int)(time_target - t),
+                       ((time_target - t) == 1 ? "" : "s"));
+               if ((int)(time_target - t) <= 0) {
+                       c = '1';
+                       break;
+               }
+       }
+       res = menu_execute(c);
+       if (res != CMD_OK)
+               setenv("autoboot_delay", "NO", 1);
+       return (res);
+}
+
+static void
+menu_display(void)
+{
+       dvar_t dvar;
+
+       for (dvar = dvar_first(); dvar; dvar = dvar_next(dvar)) {
+               if (strncmp(dvar->name, "menu_", 5) == 0) {
+                       printf("%c. %s\n", dvar->name[5], dvar->data[0]);
+               }
+       }
+       printf("\n");
+}
+
+static int
+menu_execute(int c)
+{
+       dvar_t dvar;
+       char namebuf[32];
+       int res;
+
+       printf("\n");
+
+       snprintf(namebuf, sizeof(namebuf), "item_%c_0", c);
+
+       /*
+        * Does this menu option exist?
+        */
+       if (dvar_get(namebuf) == NULL)
+               return(-1);
+
+       snprintf(namebuf, sizeof(namebuf), "item_%c", c);
+       res = CMD_OK;
+       for (dvar = dvar_first(); dvar; dvar = dvar_next(dvar)) {
+               if (strncmp(dvar->name, namebuf, 6) == 0) {
+                       res = perform(dvar->count, dvar->data);
+                       if (res != CMD_OK) {
+                               printf("%s: %s\n",
+                                       dvar->data[0], command_errmsg);
+                               setenv("autoboot_delay", "NO", 1);
+                               break;
+                       }
+               }
+       }
+       return(res);
+}
similarity index 71%
copy from sys/boot/common/rel_open.c
copy to sys/boot/dloader/config.c
index 04259dd..769f1f5 100644 (file)
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2008 The DragonFly Project.  All rights reserved.
- * 
+ * Copyright (c) 2010 The DragonFly Project.  All rights reserved.
+ *
  * This code is derived from software contributed to The DragonFly Project
  * by Matthew Dillon <dillon@backplane.com>
- * 
+ *
  * 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
@@ -17,7 +17,7 @@
  * 3. Neither the name of The DragonFly Project nor the names of its
  *    contributors may be used to endorse or promote products derived
  *    from this software without specific, prior written permission.
- * 
+ *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  * 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.
- * 
- * $DragonFly: src/sys/boot/common/rel_open.c,v 1.2 2008/09/04 17:30:52 swildner Exp $
  */
-
-#include <stand.h>
-#include <string.h>
-#include "bootstrap.h"
-
-const char *DirBase;
-
-int
-chdir(const char *path)
-{
-       struct stat st;
-
-       if (stat(path, &st) == 0 && S_ISDIR(st.st_mode))
-               DirBase = path;
-       return 0;
-}
-
-int
-rel_open(const char *path, int flags)
-{
-       int fd;
-       char *ptr;
-
-       if (DirBase && path[0] != '/') {
-               ptr = malloc(strlen(DirBase) + strlen(path) + 2);
-               sprintf(ptr, "%s/%s", DirBase, path);
-               fd = open(ptr, flags);
-               free(ptr);
-       } else {
-               fd = open(path, flags);
-       }
-       return(fd);
-}
-
similarity index 71%
copy from sys/boot/common/rel_open.c
copy to sys/boot/dloader/dloader.h
index 04259dd..ea2d981 100644 (file)
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2008 The DragonFly Project.  All rights reserved.
- * 
+ * Copyright (c) 2010 The DragonFly Project.  All rights reserved.
+ *
  * This code is derived from software contributed to The DragonFly Project
  * by Matthew Dillon <dillon@backplane.com>
- * 
+ *
  * 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
@@ -17,7 +17,7 @@
  * 3. Neither the name of The DragonFly Project nor the names of its
  *    contributors may be used to endorse or promote products derived
  *    from this software without specific, prior written permission.
- * 
+ *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  * 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.
- * 
- * $DragonFly: src/sys/boot/common/rel_open.c,v 1.2 2008/09/04 17:30:52 swildner Exp $
  */
 
-#include <stand.h>
-#include <string.h>
-#include "bootstrap.h"
+void dloader_init_cmds(void);
+int dloader_run(int ac, char **av);
 
-const char *DirBase;
+extern char *DirBase;
 
-int
-chdir(const char *path)
-{
-       struct stat st;
-
-       if (stat(path, &st) == 0 && S_ISDIR(st.st_mode))
-               DirBase = path;
-       return 0;
-}
-
-int
-rel_open(const char *path, int flags)
-{
-       int fd;
-       char *ptr;
-
-       if (DirBase && path[0] != '/') {
-               ptr = malloc(strlen(DirBase) + strlen(path) + 2);
-               sprintf(ptr, "%s/%s", DirBase, path);
-               fd = open(ptr, flags);
-               free(ptr);
-       } else {
-               fd = open(path, flags);
-       }
-       return(fd);
-}
+typedef struct dvar {
+       struct dvar *next;
+       char *name;
+       char **data;
+       int count;
+} *dvar_t;
 
+dvar_t dvar_get(const char *name);
+void dvar_set(const char *name, char **data, int count);
+void dvar_unset(const char *name);
+dvar_t dvar_first(void);
+dvar_t dvar_next(dvar_t var);
+int perform(int ac, char **av);
diff --git a/sys/boot/dloader/dloader.menu b/sys/boot/dloader/dloader.menu
new file mode 100644 (file)
index 0000000..953b3e0
--- /dev/null
@@ -0,0 +1,133 @@
+# Default menu
+#
+#
+
+menuclear
+unload
+
+unset boot_askname
+unset boot_cdrom
+unset boot_userconfig
+unset boot_ddb
+unset boot_gdb
+unset boot_single
+unset boot_verbose
+unset boot_vidcons
+unset boot_serial
+
+# Re-CD into the originally calculated base directory and set the
+# module_path.
+#
+# The module_path is a bit fragile, we want to set it to the current h
+# directory and ./modules subdirectory only, which is "<empty>;modules"
+#
+cd ${base}
+set module_path=";modules"
+
+acpi_load="YES"
+ahci_load="YES"
+ehci_load="YES"
+
+menuitem 1 "Boot DragonFly [default]"
+menuadd optcd kernel
+menuadd optinclude loader.conf
+menuadd optinclude loader.conf.local
+menuadd lunsetif acpi_load hint.acpi.0.disabled
+menuadd lunsetif ehci_load hint.ehci.0.disabled
+menuadd lunsetif ahci_load hint.ahci.disabled
+menuadd loadall
+menuadd boot
+
+menuitem 2 "Boot DragonFly in Safe Mode"
+menuadd optcd kernel
+menuadd optinclude loader.conf
+menuadd optinclude loader.conf.local
+menuadd set hint.acpi.0.disabled=1
+menuadd set loader.acpi_disabled_by_user=1
+menuadd set hint.ehci.0.disabled=1
+menuadd set loader.ehci_disabled_by_user=1
+menuadd set hw.ata.ata_dma=0
+menuadd set hw.ata.atapi_dma=0
+menuadd set hw.ata.wc=0
+menuadd set hw.eisa_slots=0
+menuadd lunsetif acpi_load hint.acpi.0.disabled
+menuadd lunsetif ehci_load hint.ehci.0.disabled
+menuadd lunsetif ahci_load hint.ahci.disabled
+menuadd loadall
+menuadd boot
+menuadd set autoboot_delay=NO
+
+menuitem 3 "Boot DragonFly in single user mode"
+menuadd optcd kernel
+menuadd optinclude loader.conf
+menuadd optinclude loader.conf.local
+menuadd set boot_single="YES"
+menuadd lunsetif acpi_load hint.acpi.0.disabled
+menuadd lunsetif ehci_load hint.ehci.0.disabled
+menuadd lunsetif ahci_load hint.ahci.disabled
+menuadd loadall
+menuadd boot
+menuadd set autoboot_delay=NO
+
+menuitem 4 "Boot DragonFly with verbose logging"
+menuadd optcd kernel
+menuadd optinclude loader.conf
+menuadd optinclude loader.conf.local
+menuadd set boot_verbose=YES
+menuadd lunsetif acpi_load hint.acpi.0.disabled
+menuadd lunsetif ehci_load hint.ehci.0.disabled
+menuadd lunsetif ahci_load hint.ahci.disabled
+menuadd loadall
+menuadd boot
+menuadd set autoboot_delay=NO
+
+menuitem 5 "Boot DragonFly without AHCI driver"
+menuadd optcd kernel
+menuadd optinclude loader.conf
+menuadd optinclude loader.conf.local
+menuadd set hint.ahci.disabled=YES
+menuadd lunsetif acpi_load hint.acpi.0.disabled
+menuadd lunsetif ehci_load hint.ehci.0.disabled
+menuadd lunsetif ahci_load hint.ahci.disabled
+menuadd loadall
+menuadd boot
+menuadd set autoboot_delay=NO
+
+menuitem 6 "Boot DragonFly using kernel.alt"
+menuadd cd ${base}kernel.alt
+menuadd optinclude loader.conf
+menuadd optinclude loader.conf.local
+menuadd lunsetif acpi_load hint.acpi.0.disabled
+menuadd lunsetif ehci_load hint.ehci.0.disabled
+menuadd lunsetif ahci_load hint.ahci.disabled
+menuadd loadall
+menuadd boot
+menuadd set autoboot_delay=NO
+
+menuitem 7 "Boot DragonFly using kernel.old"
+menuadd cd ${base}kernel.old
+menuadd optinclude loader.conf
+menuadd optinclude loader.conf.local
+menuadd lunsetif acpi_load hint.acpi.0.disabled
+menuadd lunsetif ehci_load hint.ehci.0.disabled
+menuadd lunsetif ahci_load hint.ahci.disabled
+menuadd loadall
+menuadd boot
+menuadd set autoboot_delay=NO
+
+menuitem 8 "Boot Backup kernel kernel.bak"
+menuadd cd ${base}kernel.bak
+menuadd optinclude loader.conf
+menuadd optinclude loader.conf.local
+menuadd lunsetif acpi_load hint.acpi.0.disabled
+menuadd lunsetif ehci_load hint.ehci.0.disabled
+menuadd lunsetif ahci_load hint.ahci.disabled
+menuadd loadall
+menuadd boot
+menuadd set autoboot_delay=NO
+
+menuitem 9 "Escape to loader prompt (also ESC)"
+menuadd set autoboot_delay=NO
+
+menuitem R "Reboot"
+menuadd reboot
diff --git a/sys/boot/dloader/loader-bootp.conf b/sys/boot/dloader/loader-bootp.conf
new file mode 100644 (file)
index 0000000..b04cc07
--- /dev/null
@@ -0,0 +1,349 @@
+# This is loader.conf - a file full of useful variables that you can
+# set to change the default load behavior of your system. You should
+# not edit this file!  Put any overrides into one of the
+# loader_conf_files instead and you will be able to update these
+# defaults later without spamming your local configuration information.
+#
+# All arguments must be in double quotes.
+#
+# $FreeBSD: src/sys/boot/forth/loader.conf,v 1.72 2003/07/01 01:03:32 brueffer Exp $
+# $DragonFly: src/sys/boot/forth/loader-bootp.conf,v 1.27 2008/09/02 17:21:15 dillon Exp $
+
+##############################################################
+###  Basic configuration options  ############################
+##############################################################
+
+exec=".( Loading /boot/defaults/loader-bootp.conf ) cr"
+
+kernel="kernel.BOOTP"
+bootfile="kernel.BOOTP"        # Kernel name (possibly absolute path)
+kernel_options=""
+
+userconfig_script_load="NO"
+userconfig_script_name="/boot/kernel-bootp.conf"
+userconfig_script_type="userconfig_script"
+
+loader_conf_files="loader-bootp.conf loader-bootp.conf.local"
+nextboot_conf="nextboot-bootp.conf"
+nextboot_enable="NO"
+
+verbose_loading="NO"           # Set to YES for verbose loader output
+
+
+##############################################################
+###  Splash screen configuration  ############################
+##############################################################
+
+splash_bmp_load="NO"           # Set this to YES for bmp splash screen!
+splash_pcx_load="NO"           # Set this to YES for pcx splash screen!
+vesa_load="NO"                 # Set this to YES to load the vesa module
+bitmap_load="NO"               # Set this to YES if you want splash screen!
+bitmap_name="splash.bmp"       # Set this to the name of the bmp or pcx file
+bitmap_type="splash_image_data" # and place it on the module_path
+
+
+##############################################################
+###  Loader settings  ########################################
+##############################################################
+
+#autoboot_delay="10"           # Delay in seconds before autobooting
+#fred_disable="NO"             # Turn Fred's boot menu on and off
+#loader_color="NO"             # Set to YES for a color version of Fred
+#console="vidconsole"          # Set the current console
+#currdev="disk1s1a"            # Set the current device
+module_path="/boot;/boot/modules;/;/modules"   # Set the module search path
+#prompt="\\${interpret}"       # Set the command prompt
+#root_disk_unit="0"            # Force the root disk unit number
+#rootdev="disk1s1a"            # Set the root filesystem
+
+
+##############################################################
+###  Kernel settings  ########################################
+##############################################################
+
+                       # The following boot_ variables are enabled
+                       # by setting them to any value.
+#boot_askname=""       # Prompt the user for the name of the root device
+#boot_ddb=""           # Instructs the kernel to start in the DDB debugger
+#boot_gdb=""           # Selects gdb-remote mode for the kernel debugger
+#boot_single=""                # Start system in single-user mode
+#boot_userconfig=""    # Run kernel's interactive device configuration program
+#boot_verbose=""       # Causes extra debugging information to be printed
+#init_path="/sbin/init:/sbin/oinit:/sbin/init.bak"
+                       # Sets the list of init candidates
+#dumpdev="ad0s1b"      # Set device for crash dumps
+
+
+##############################################################
+###  Kernel tunables  ########################################
+##############################################################
+
+#hw.physmem="1G"               # Limit phyiscal memory. See loader(8)
+#kern.dfldsiz=""               # Set the initial data size limit
+#kern.dflssiz=""               # Set the initial stack size limit
+#kern.hz="100"                 # Set the kernel interval timer rate
+#kern.maxbcache=""             # Set the max buffer cache KVA storage
+#kern.maxdsiz=""               # Set the max data size
+#kern.maxfiles=""              # Set the sys. wide open files limit
+#kern.maxproc=""               # Set the maximum # of processes
+#kern.maxssiz=""               # Set the max stack size
+#kern.maxswzone=""             # Set the max swmeta KVA storage
+#kern.maxtsiz=""               # Set the max text size
+#kern.maxusers="32"            # Set size of various static tables
+#kern.nbuf=""                  # Set the number of buffer headers
+#kern.ncallout=""              # Set the maximum # of timer events
+#kern.sgrowsiz=""              # Set the amount to grow stack
+#kern.cam.scsi_delay="2000"    # Delay (in ms) before probing SCSI
+#kern.ipc.maxsockets=""                # Set the maximum number of sockets avaliable
+#kern.ipc.nmbclusters=""       # Set the number of mbuf clusters
+#kern.ipc.nmbufs=""            # Set the maximum number of mbufs
+#kern.vm.kmem.size=""          # Sets the size of kernel memory (bytes)
+#net.inet.tcp.tcbhashsize=""   # Set the value of TCBHASHSIZE
+#vfs.root.mountfrom=""         # Specify root partition in a way the
+                               # kernel understands. You can specify a semicolon
+                               # separated device list which will be tried.
+#debug.ktr.verbose="1"         # Enable console dump of KTR events
+#net.graph.maxalloc="128"      # Maximum number of queue items to allocate
+#net.graph.ngqfreemax="64"     # Maximum number of free queue items to cache
+
+
+##############################################################
+###  Filesystem and related modules  #########################
+##############################################################
+
+# Filesystems
+
+cd9660_load="NO"               # ISO 9660 filesystem
+ext2fs_load="NO"               # ext2 filesystem
+fdesc_load="NO"                        # Filedescriptors filesystem
+mfs_load="NO"                  # Memory filesystem
+msdos_load="NO"                        # FAT-12/16/32
+nfs_load="NO"                  # NFS
+ntfs_load="NO"                 # NTFS
+null_load="NO"                 # Null filesystem
+nwfs_load="NO"                 # NetWare volume
+portal_load="NO"               # Portal filesystem
+procfs_load="NO"               # Process filesystem
+smbfs_load="NO"                        # SMB/CIFS
+udf_load="NO"                  # UDF filesystem
+
+# Related stuff
+
+ccd_load="NO"                  # Concatenated disk driver
+vinum_load="NO"                        # Concatenated/mirror/raid driver
+md_load="NO"                   # Memory disk driver (vnode/swap/malloc)
+
+
+##############################################################
+###  Screen saver modules  ###################################
+##############################################################
+
+# This is best done in rc.conf
+
+screensave_load="NO"           # Set to YES to load a screensaver module
+screensave_name="green_saver"  # Set to the name of the screensaver module
+
+
+##############################################################
+###  Emulation modules  ######################################
+##############################################################
+
+linux_load="NO"                        # Linux emulation
+
+
+##############################################################
+###  Networking modules  #####################################
+##############################################################
+
+if_disc_load="NO"              # Discard device
+if_ef_load="NO"                        # pseudo-device providing support for multiple ethernet frame types
+if_faith_load="NO"             # IPv6-to-IPv4 TCP relay capturing interface
+if_gif_load="NO"               # generic tunnel interface
+if_gre_load="NO"               # encapsulating network device
+if_ppp_load="NO"               # Kernel ppp
+if_sl_load="NO"                        # SLIP
+if_stf_load="NO"               # 6to4 tunnel interface
+if_tap_load="NO"               # Ethernet tunnel software network interface
+if_tun_load="NO"               # Tunnel driver (user process ppp)
+if_vlan_load="NO"              # IEEE 802.1Q VLAN network interface
+ipfw_load="NO"                 # Firewall
+pf_load="NO"                   # OpenBSD's packet filter
+
+
+##############################################################
+###  Networking drivers  #####################################
+##############################################################
+#
+# NOTE! most of these will be built into a generic kernel, but some cannot
+# be and those should be enabled here for PXE boots or the kernel may not
+# be able to mount the root filesystem via NFS.
+
+miibus_load="NO"               # miibus support, needed for some drivers
+if_acx_load="NO"               # TI ACX100/ACX111 802.11 wireless NICs
+if_an_load="NO"                        # Aironet 4500/4800 802.11 wireless NICs
+if_ar_load="NO"                        # Digi SYNC/570i
+if_ath_load="NO"               # Atheros 802.11 wireless NICs
+if_bce_load="NO"               # Broadcom BCM5706/BCM5708 gigabit ethernet
+if_bfe_load="NO"               # Broadcom BCM4401 PCI ethernet
+if_bge_load="NO"               # Broadcom BCM570x PCI gigabit ethernet
+if_bwi_load="NO"               # Broadcom BCM430x/4318 IEEE 802.11b/g wireless
+if_dc_load="NO"                        # DEC/Intel 21143 and various workalikes
+if_ed_load="NO"                        # National Semiconductor DS8390/WD83C690 ethernet
+if_em_load="NO"                        # Intel(R) PRO/1000 gigabit ethernet
+if_ep_load="NO"                        # 3Com Etherlink III (3c5x9)
+if_et_load="NO"                        # Agere ET1310 10/100/Gigabit ethernet
+if_fwe_load="NO"               # Ethernet emulation driver for FireWire
+if_fxp_load="NO"               # Intel EtherExpress PRO/100B (82557, 82558)
+if_iwi_load="NO"               # Intel(R) PRO/Wireless 2200BG/2915ABG MiniPCI
+if_iwl_load="NO"               # Intel(R) PRO/Wireless 2100 MiniPCI
+if_lge_load="NO"               # Level 1 LXT1001 NetCellerator PCI gigabit ethernet
+if_lnc_load="NO"               # AMD Lance/PCnet Ethernet
+if_msk_load="NO"               # Marvell/SysKonnect Yukon II Gigabit Ethernet
+if_my_load="NO"                        # Myson PCI fast ethernet
+#if_ndis_load="NO"             # NDIS miniport driver wrapper
+if_nfe_load="NO"               # NVIDIA nForce MCP 10/100/Gigabit ethernet
+if_nge_load="NO"               # National Semiconductor PCI gigabit ethernet
+if_pcn_load="NO"               # AMD PCnet PCI
+if_ral_load="NO"               # Ralink Technology 802.11 wireless NICs
+if_re_load="NO"                        # RealTek 8139C+/8169/816xS/811xS/8101E
+if_rl_load="NO"                        # RealTek 8129/8139
+if_rtw_load="NO"               # Realtek RTL8180L IEEE 802.11b wireless NICs
+if_sbni_load="NO"              # Granch SBNI12 leased line adapters
+if_sbsh_load="NO"              # Granch SBNI16 SHDSL modem
+if_sf_load="NO"                        # Adaptec Duralink PCI (AIC-6915 "starfire")
+if_sis_load="NO"               # Silicon Integrated Systems SiS 900/7016
+if_sk_load="NO"                        # SysKonnect SK-984x series PCI gigabit ethernet
+if_sr_load="NO"                        # synchronous RISCom/N2 / WANic 400/405
+if_ste_load="NO"               # Sundance Technologies ST201 fast ethernet
+if_stge_load="NO"              # Sundance/Tamarack TC9021 gigabit ethernet
+if_ti_load="NO"                        # Alteon Networks Tigon 1 and Tigon 2
+if_tl_load="NO"                        # Texas Instruments TNETE100 ("ThunderLAN")
+if_tx_load="NO"                        # SMC 83c17x fast ethernet
+if_txp_load="NO"               # 3Com 3XP Typhoon/Sidewinder (3CR990)
+if_vge_load="NO"               # VIA VT6122 PCI gigabit ethernet
+if_vr_load="NO"                        # VIA Rhine I and Rhine II
+if_vx_load="NO"                        # 3Com 3C590 family
+if_wb_load="NO"                        # Winbond W89C840F
+if_wi_load="NO"                        # WaveLAN/IEEE 802.11 wireless NICs
+if_xe_load="NO"                        # Xircom CreditCard PCMCIA
+if_xl_load="NO"                        # 3Com Etherlink XL (3c900, 3c905, 3c905B)
+
+
+##############################################################
+###  Netgraph modules  #######################################
+##############################################################
+
+ng_UI_load="NO"                        # UI netgraph node type
+ng_async_load="NO"             # asynchronous framing netgraph node type
+ng_bpf_load="NO"               # Berkeley packet filter netgraph node type
+ng_bridge_load="NO"            # Ethernet bridging netgraph node type
+ng_cisco_load="NO"             # Cisco HDLC protocol netgraph node type
+ng_echo_load="NO"              # Netgraph echo node type
+ng_ether_load="NO"             # Ethernet netgraph node type
+ng_frame_relay_load="NO"       # frame relay netgraph node type
+ng_hole_load="NO"              # Netgraph discard node type
+ng_iface_load="NO"             # interface Netgraph node type
+ng_ksocket_load="NO"           # kernel socket netgraph node type
+ng_lmi_load="NO"               # frame relay LMI protocol netgraph node type
+ng_mppc_load="NO"              # Microsoft MPPC/MPPE compression and encryption netgraph node type
+ng_one2many_load="NO"          # packet multiplexing netgraph node type
+ng_ppp_load="NO"               # PPP protocol netgraph node type
+ng_pppoe_load="NO"             # RFC 2516 PPPOE protocol netgraph node type
+ng_pptpgre_load="NO"           # PPTP GRE protocol netgraph node type
+ng_rfc1490_load="NO"           # RFC 1490 netgraph node type
+ng_socket_load="NO"            # Netgraph socket node type
+ng_tee_load="NO"               # Netgraph ``tee'' node type
+ng_tty_load="NO"               # Netgraph node type that is also a line discipline
+ng_vjc_load="NO"               # Van Jacobsen compression netgraph node type
+
+
+##############################################################
+###  Sound modules  ##########################################
+##############################################################
+
+sound_load="NO"                        # Digital sound subsystem
+snd_ad1816_load="NO"           # ad1816
+snd_als4000_load="NO"          # als4000
+snd_atiixp_load="NO"           # atiixp
+snd_cmi_load="NO"              # cmi
+snd_csa_load="NO"              # csa
+snd_cs4281_load="NO"           # cs4281
+snd_ds1_load="NO"              # ds1
+snd_emu10k1_load="NO"          # Creative Sound Blaster Live
+snd_ess_load="NO"              # ess
+snd_es137x_load="NO"           # es137x
+snd_fm801_load="NO"            # fm801
+snd_hda_load="NO"              # hda
+snd_ich_load="NO"              # Intel ICH
+snd_maestro_load="NO"          # Maestro
+snd_maestro3_load="NO"         # Maestro3
+snd_mss_load="NO"              # Mss
+snd_neomagic_load="NO"         # Neomagic
+snd_sbc_load="NO"              # Sbc
+snd_sb8_load="NO"              # Sound Blaster Pro
+snd_sb16_load="NO"             # Sound Blaster 16
+snd_solo_load="NO"             # Solo
+snd_t4dwave_load="NO"          # t4dwave
+snd_via8233_load="NO"          # via8233
+snd_via82c686_load="NO"                # via82c686
+snd_driver_load="NO"           # All sound drivers
+
+
+##############################################################
+###  USB modules  ############################################
+##############################################################
+
+usb_load="NO"                  # USB subsystem
+ugen_load="NO"                 # USB generic device, if all else fails ...
+ufm_load="NO"                  # Fm Radio
+uhid_load="NO"                 # Human Interface Devices
+ukbd_load="NO"                 # Keyboard
+ulpt_load="NO"                 # Printer
+ums_load="NO"                  # Mouse
+umass_load="NO"                        # Mass Storage Devices
+umodem_load="NO"               # Modems
+uscanner_load="NO"             # Scanners
+if_aue_load="NO"               # ADMtek USB ethernet
+if_axe_load="NO"               # ASIX Electronics AX88172 USB ethernet
+if_cue_load="NO"               # CATC USB ethernet
+if_kue_load="NO"               # Kawasaki LSI USB ethernet
+if_rue_load="NO"               # RealTek RTL8150 USB fast ethernet
+if_rum_load="NO"               # Ralink RT2501USB/RT2601USB 802.11 wireless NICs
+if_ural_load="NO"              # Ralink RT2500USB 802.11 wireless NICs
+snd_uaudio_load="NO"           # USB audio
+
+
+##############################################################
+###  Other modules  ##########################################
+##############################################################
+
+bktr_load="NO"                 # Brooktree Bt848/Bt878 TV/Video Capture Card
+ispfw_load="NO"                        # Qlogic ISP Firmware
+agp_load="NO"                  # agp module
+accf_data_load="NO"            # Wait for data accept filter
+accf_http_load="NO"            # Wait for full HTTP request accept filter
+random_load="NO"               # Random device
+atspeaker_load="NO"            # AT speaker module
+
+
+##############################################################
+###  ACPI settings  ##########################################
+##############################################################
+
+acpi_dsdt_load="NO"            # DSDT Overriding
+acpi_dsdt_type="acpi_dsdt"     # Don't change this
+acpi_dsdt_name="/boot/acpi_dsdt.aml"
+                               # Override DSDT in BIOS by this file
+
+
+##############################################################
+###  Module loading syntax example  ##########################
+##############################################################
+
+#module_load="YES"             # loads module "module"
+#module_name="realname"                # uses "realname" instead of "module"
+#module_type="type"            # passes "-t type" to load
+#module_flags="flags"          # passes "flags" to the module
+#module_before="cmd"           # executes "cmd" before loading the module
+#module_after="cmd"            # executes "cmd" after loading the module
+#module_error="cmd"            # executes "cmd" if load fails
diff --git a/sys/boot/dloader/loader.conf b/sys/boot/dloader/loader.conf
new file mode 100644 (file)
index 0000000..253659a
--- /dev/null
@@ -0,0 +1,347 @@
+# This is loader.conf - a file full of useful variables that you can
+# set to change the default load behavior of your system. You should
+# not edit this file!  Put any overrides into one of the
+# loader_conf_files instead and you will be able to update these
+# defaults later without spamming your local configuration information.
+#
+# All arguments must be in double quotes.
+#
+# $FreeBSD: src/sys/boot/forth/loader.conf,v 1.72 2003/07/01 01:03:32 brueffer Exp $
+# $DragonFly: src/sys/boot/forth/loader.conf,v 1.34 2008/09/02 17:21:15 dillon Exp $
+
+##############################################################
+###  Basic configuration options  ############################
+##############################################################
+
+exec=".( Loading /boot/defaults/loader.conf ) cr"
+
+kernel="kernel"
+bootfile="kernel"      # Kernel name (possibly absolute path)
+kernel_options=""
+
+userconfig_script_load="NO"
+userconfig_script_name="/boot/kernel.conf"
+userconfig_script_type="userconfig_script"
+
+# Must be accessible if either / or /boot is the boot directory.
+#
+loader_conf_files="loader.conf loader.conf.local"
+nextboot_conf="nextboot.conf"
+nextboot_enable="NO"
+
+verbose_loading="NO"           # Set to YES for verbose loader output
+
+
+##############################################################
+###  Splash screen configuration  ############################
+##############################################################
+
+splash_bmp_load="NO"           # Set this to YES for bmp splash screen!
+splash_pcx_load="NO"           # Set this to YES for pcx splash screen!
+vesa_load="NO"                 # Set this to YES to load the vesa module
+bitmap_load="NO"               # Set this to YES if you want splash screen!
+bitmap_name="splash.bmp"       # Set this to the name of the bmp or pcx file
+bitmap_type="splash_image_data" # and place it on the module_path
+
+
+##############################################################
+###  Loader settings  ########################################
+##############################################################
+
+#autoboot_delay="10"           # Delay in seconds before autobooting
+#fred_disable="NO"             # Turn Fred's boot menu on and off
+#loader_color="NO"             # Set to YES for a color version of Fred
+#console="vidconsole"          # Set the current console
+#currdev="disk1s1a"            # Set the current device
+#module_path=";modules"                # Set the module search path
+#prompt="\\${interpret}"       # Set the command prompt
+#root_disk_unit="0"            # Force the root disk unit number
+#rootdev="disk1s1a"            # Set the root filesystem
+
+
+##############################################################
+###  Kernel settings  ########################################
+##############################################################
+
+                       # The following boot_ variables are enabled
+                       # by setting them to any value.
+#boot_askname=""       # Prompt the user for the name of the root device
+#boot_ddb=""           # Instructs the kernel to start in the DDB debugger
+#boot_gdb=""           # Selects gdb-remote mode for the kernel debugger
+#boot_single=""                # Start system in single-user mode
+#boot_userconfig=""    # Run kernel's interactive device configuration program
+#boot_verbose=""       # Causes extra debugging information to be printed
+#init_path="/sbin/init:/sbin/oinit:/sbin/init.bak"
+                       # Sets the list of init candidates
+#dumpdev="ad0s1b"      # Set device for crash dumps
+
+
+##############################################################
+###  Kernel tunables  ########################################
+##############################################################
+
+#hw.physmem="1G"               # Limit physical memory. See loader(8)
+#kern.dfldsiz=""               # Set the initial data size limit
+#kern.dflssiz=""               # Set the initial stack size limit
+#kern.hz="100"                 # Set the kernel interval timer rate
+#kern.maxbcache=""             # Set the max buffer cache KVA storage
+#kern.maxdsiz=""               # Set the max data size
+#kern.maxfiles=""              # Set the sys. wide open files limit
+#kern.maxproc=""               # Set the maximum # of processes
+#kern.maxssiz=""               # Set the max stack size
+#kern.maxswzone=""             # Set the max swmeta KVA storage
+#kern.maxtsiz=""               # Set the max text size
+#kern.maxusers="32"            # Set size of various static tables
+#kern.nbuf=""                  # Set the number of buffer headers
+#kern.ncallout=""              # Set the maximum # of timer events
+#kern.sgrowsiz=""              # Set the amount to grow stack
+#kern.cam.scsi_delay="2000"    # Delay (in ms) before probing SCSI
+#kern.ipc.maxsockets=""                # Set the maximum number of sockets avaliable
+#kern.ipc.nmbclusters=""       # Set the number of mbuf clusters
+#kern.ipc.nmbufs=""            # Set the maximum number of mbufs
+#kern.vm.kmem.size=""          # Sets the size of kernel memory (bytes)
+#net.inet.tcp.tcbhashsize=""   # Set the value of TCBHASHSIZE
+#vfs.root.mountfrom=""         # Specify root partition in a way the
+                               # kernel understands. You can specify a semicolon
+                               # separated device list which will be tried.
+#debug.ktr.verbose="1"         # Enable console dump of KTR events
+#net.graph.maxalloc="128"      # Maximum number of queue items to allocate
+#net.graph.ngqfreemax="64"     # Maximum number of free queue items to cache
+
+
+##############################################################
+###  Filesystem and related modules  #########################
+##############################################################
+
+# Filesystems
+
+cd9660_load="NO"               # ISO 9660 filesystem
+ext2fs_load="NO"               # ext2 filesystem
+fdesc_load="NO"                        # Filedescriptors filesystem
+mfs_load="NO"                  # Memory filesystem
+msdos_load="NO"                        # FAT-12/16/32
+nfs_load="NO"                  # NFS
+ntfs_load="NO"                 # NTFS
+null_load="NO"                 # Null filesystem
+nwfs_load="NO"                 # NetWare volume
+portal_load="NO"               # Portal filesystem
+procfs_load="NO"               # Process filesystem
+smbfs_load="NO"                        # SMB/CIFS
+udf_load="NO"                  # UDF filesystem
+
+# Related stuff
+
+ccd_load="NO"                  # Concatenated disk driver
+vinum_load="NO"                        # Concatenated/mirror/raid driver
+md_load="NO"                   # Memory disk driver (vnode/swap/malloc)
+
+
+##############################################################
+###  Screen saver modules  ###################################
+##############################################################
+
+# This is best done in rc.conf
+
+screensave_load="NO"           # Set to YES to load a screensaver module
+screensave_name="green_saver"  # Set to the name of the screensaver module
+
+
+##############################################################
+###  Emulation modules  ######################################
+##############################################################
+
+linux_load="NO"                        # Linux emulation
+
+
+##############################################################
+###  Networking modules  #####################################
+##############################################################
+
+if_disc_load="NO"              # Discard device
+if_ef_load="NO"                        # pseudo-device providing support for multiple ethernet frame types
+if_faith_load="NO"             # IPv6-to-IPv4 TCP relay capturing interface
+if_gif_load="NO"               # generic tunnel interface
+if_gre_load="NO"               # encapsulating network device
+if_ppp_load="NO"               # Kernel ppp
+if_sl_load="NO"                        # SLIP
+if_stf_load="NO"               # 6to4 tunnel interface
+if_tap_load="NO"               # Ethernet tunnel software network interface
+if_tun_load="NO"               # Tunnel driver (user process ppp)
+if_vlan_load="NO"              # IEEE 802.1Q VLAN network interface
+ipfw_load="NO"                 # Firewall
+pf_load="NO"                   # OpenBSD's packet filter
+
+
+##############################################################
+###  Networking drivers  #####################################
+##############################################################
+
+miibus_load="NO"               # miibus support, needed for some drivers
+if_acx_load="NO"               # TI ACX100/ACX111 802.11 wireless NICs
+if_an_load="NO"                        # Aironet 4500/4800 802.11 wireless NICs
+if_ar_load="NO"                        # Digi SYNC/570i
+if_ath_load="NO"               # Atheros 802.11 wireless NICs
+if_bce_load="NO"               # Broadcom BCM5706/BCM5708 gigabit ethernet
+if_bfe_load="NO"               # Broadcom BCM4401 PCI ethernet
+if_bge_load="NO"               # Broadcom BCM570x PCI gigabit ethernet
+if_bwi_load="NO"               # Broadcom BCM430x/4318 IEEE 802.11b/g wireless
+if_dc_load="NO"                        # DEC/Intel 21143 and various workalikes
+if_ed_load="NO"                        # National Semiconductor DS8390/WD83C690 ethernet
+if_em_load="NO"                        # Intel(R) PRO/1000 gigabit ethernet
+if_ep_load="NO"                        # 3Com Etherlink III (3c5x9)
+if_et_load="NO"                        # Agere ET1310 10/100/Gigabit ethernet
+if_fwe_load="NO"               # Ethernet emulation driver for FireWire
+if_fxp_load="NO"               # Intel EtherExpress PRO/100B (82557, 82558)
+if_iwi_load="NO"               # Intel(R) PRO/Wireless 2200BG/2915ABG MiniPCI
+if_iwl_load="NO"               # Intel(R) PRO/Wireless 2100 MiniPCI
+if_lge_load="NO"               # Level 1 LXT1001 NetCellerator PCI gigabit ethernet
+if_lnc_load="NO"               # AMD Lance/PCnet Ethernet
+if_msk_load="NO"               # Marvell/SysKonnect Yukon II Gigabit Ethernet
+if_my_load="NO"                        # Myson PCI fast ethernet
+#if_ndis_load="NO"             # NDIS miniport driver wrapper
+if_nfe_load="NO"               # NVIDIA nForce MCP 10/100/Gigabit ethernet
+if_nge_load="NO"               # National Semiconductor PCI gigabit ethernet
+if_pcn_load="NO"               # AMD PCnet PCI
+if_ral_load="NO"               # Ralink Technology 802.11 wireless NICs
+if_re_load="NO"                        # RealTek 8139C+/8169/816xS/811xS/8101E
+if_rl_load="NO"                        # RealTek 8129/8139
+if_rtw_load="NO"               # Realtek RTL8180L IEEE 802.11b wireless NICs
+if_sbni_load="NO"              # Granch SBNI12 leased line adapters
+if_sbsh_load="NO"              # Granch SBNI16 SHDSL modem
+if_sf_load="NO"                        # Adaptec Duralink PCI (AIC-6915 "starfire")
+if_sis_load="NO"               # Silicon Integrated Systems SiS 900/7016
+if_sk_load="NO"                        # SysKonnect SK-984x series PCI gigabit ethernet
+if_sr_load="NO"                        # synchronous RISCom/N2 / WANic 400/405
+if_ste_load="NO"               # Sundance Technologies ST201 fast ethernet
+if_stge_load="NO"              # Sundance/Tamarack TC9021 gigabit ethernet
+if_ti_load="NO"                        # Alteon Networks Tigon 1 and Tigon 2
+if_tl_load="NO"                        # Texas Instruments TNETE100 ("ThunderLAN")
+if_tx_load="NO"                        # SMC 83c17x fast ethernet
+if_txp_load="NO"               # 3Com 3XP Typhoon/Sidewinder (3CR990)
+if_vge_load="NO"               # VIA VT6122 PCI gigabit ethernet
+if_vr_load="NO"                        # VIA Rhine I and Rhine II
+if_vx_load="NO"                        # 3Com 3C590 family
+if_wb_load="NO"                        # Winbond W89C840F
+if_wi_load="NO"                        # WaveLAN/IEEE 802.11 wireless NICs
+if_xe_load="NO"                        # Xircom CreditCard PCMCIA
+if_xl_load="NO"                        # 3Com Etherlink XL (3c900, 3c905, 3c905B)
+
+
+##############################################################
+###  Netgraph modules  #######################################
+##############################################################
+
+ng_UI_load="NO"                        # UI netgraph node type
+ng_async_load="NO"             # asynchronous framing netgraph node type
+ng_bpf_load="NO"               # Berkeley packet filter netgraph node type
+ng_bridge_load="NO"            # Ethernet bridging netgraph node type
+ng_cisco_load="NO"             # Cisco HDLC protocol netgraph node type
+ng_echo_load="NO"              # Netgraph echo node type
+ng_ether_load="NO"             # Ethernet netgraph node type
+ng_frame_relay_load="NO"       # frame relay netgraph node type
+ng_hole_load="NO"              # Netgraph discard node type
+ng_iface_load="NO"             # interface Netgraph node type
+ng_ksocket_load="NO"           # kernel socket netgraph node type
+ng_lmi_load="NO"               # frame relay LMI protocol netgraph node type
+ng_mppc_load="NO"              # Microsoft MPPC/MPPE compression and encryption netgraph node type
+ng_one2many_load="NO"          # packet multiplexing netgraph node type
+ng_ppp_load="NO"               # PPP protocol netgraph node type
+ng_pppoe_load="NO"             # RFC 2516 PPPOE protocol netgraph node type
+ng_pptpgre_load="NO"           # PPTP GRE protocol netgraph node type
+ng_rfc1490_load="NO"           # RFC 1490 netgraph node type
+ng_socket_load="NO"            # Netgraph socket node type
+ng_tee_load="NO"               # Netgraph ``tee'' node type
+ng_tty_load="NO"               # Netgraph node type that is also a line discipline
+ng_vjc_load="NO"               # Van Jacobsen compression netgraph node type
+
+
+##############################################################
+###  Sound modules  ##########################################
+##############################################################
+
+sound_load="NO"                        # Digital sound subsystem
+snd_ad1816_load="NO"           # ad1816
+snd_als4000_load="NO"          # als4000
+snd_atiixp_load="NO"           # atiixp
+snd_cmi_load="NO"              # cmi
+snd_csa_load="NO"              # csa
+snd_cs4281_load="NO"           # cs4281
+snd_ds1_load="NO"              # ds1
+snd_emu10k1_load="NO"          # Creative Sound Blaster Live
+snd_ess_load="NO"              # ess
+snd_es137x_load="NO"           # es137x
+snd_fm801_load="NO"            # fm801
+snd_hda_load="NO"              # hda
+snd_ich_load="NO"              # Intel ICH
+snd_maestro_load="NO"          # Maestro
+snd_maestro3_load="NO"         # Maestro3
+snd_mss_load="NO"              # Mss
+snd_neomagic_load="NO"         # Neomagic
+snd_sbc_load="NO"              # Sbc
+snd_sb8_load="NO"              # Sound Blaster Pro
+snd_sb16_load="NO"             # Sound Blaster 16
+snd_solo_load="NO"             # Solo
+snd_t4dwave_load="NO"          # t4dwave
+snd_via8233_load="NO"          # via8233
+snd_via82c686_load="NO"                # via82c686
+snd_driver_load="NO"           # All sound drivers
+
+
+##############################################################
+###  USB modules  ############################################
+##############################################################
+
+usb_load="NO"                  # USB subsystem
+ugen_load="NO"                 # USB generic device, if all else fails ...
+ufm_load="NO"                  # Fm Radio
+uhid_load="NO"                 # Human Interface Devices
+ukbd_load="NO"                 # Keyboard
+ulpt_load="NO"                 # Printer
+ums_load="NO"                  # Mouse
+umass_load="NO"                        # Mass Storage Devices
+umodem_load="NO"               # Modems
+uscanner_load="NO"             # Scanners
+if_aue_load="NO"               # ADMtek USB ethernet
+if_axe_load="NO"               # ASIX Electronics AX88172 USB ethernet
+if_cue_load="NO"               # CATC USB ethernet
+if_kue_load="NO"               # Kawasaki LSI USB ethernet
+if_rue_load="NO"               # RealTek RTL8150 USB fast ethernet
+if_rum_load="NO"               # Ralink RT2501USB/RT2601USB 802.11 wireless NICs
+if_ural_load="NO"              # Ralink RT2500USB 802.11 wireless NICs
+snd_uaudio_load="NO"           # USB audio
+
+
+##############################################################
+###  Other modules  ##########################################
+##############################################################
+
+bktr_load="NO"                 # Brooktree Bt848/Bt878 TV/Video Capture Card
+ispfw_load="NO"                        # Qlogic ISP Firmware
+agp_load="NO"                  # agp module
+accf_data_load="NO"            # Wait for data accept filter
+accf_http_load="NO"            # Wait for full HTTP request accept filter
+random_load="NO"               # Random device
+atspeaker_load="NO"            # AT speaker module
+
+
+##############################################################
+###  ACPI settings  ##########################################
+##############################################################
+
+acpi_dsdt_load="NO"            # DSDT Overriding
+acpi_dsdt_type="acpi_dsdt"     # Don't change this
+acpi_dsdt_name="/boot/acpi_dsdt.aml"
+                               # Override DSDT in BIOS by this file
+
+
+##############################################################
+###  Module loading syntax example  ##########################
+##############################################################
+
+#module_load="YES"             # loads module "module"
+#module_name="realname"                # uses "realname" instead of "module"
+#module_type="type"            # passes "-t type" to load
+#module_flags="flags"          # passes "flags" to the module
+#module_before="cmd"           # executes "cmd" before loading the module
+#module_after="cmd"            # executes "cmd" after loading the module
+#module_error="cmd"            # executes "cmd" if load fails
similarity index 51%
copy from sys/boot/common/rel_open.c
copy to sys/boot/dloader/subs.c
index 04259dd..c560d30 100644 (file)
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2008 The DragonFly Project.  All rights reserved.
- * 
+ * Copyright (c) 2010 The DragonFly Project.  All rights reserved.
+ *
  * This code is derived from software contributed to The DragonFly Project
  * by Matthew Dillon <dillon@backplane.com>
- * 
+ *
  * 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
@@ -17,7 +17,7 @@
  * 3. Neither the name of The DragonFly Project nor the names of its
  *    contributors may be used to endorse or promote products derived
  *    from this software without specific, prior written permission.
- * 
+ *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  * 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.
- * 
- * $DragonFly: src/sys/boot/common/rel_open.c,v 1.2 2008/09/04 17:30:52 swildner Exp $
  */
 
 #include <stand.h>
 #include <string.h>
 #include "bootstrap.h"
+#include "dloader.h"
 
-const char *DirBase;
+static void dvar_free(dvar_t *lastp);
 
-int
-chdir(const char *path)
+dvar_t dvbase;
+dvar_t *dvlastp = &dvbase;
+
+dvar_t
+dvar_get(const char *name)
 {
-       struct stat st;
+       dvar_t var;
 
-       if (stat(path, &st) == 0 && S_ISDIR(st.st_mode))
-               DirBase = path;
-       return 0;
+       for (var = dvbase; var; var = var->next) {
+               if (strcmp(name, var->name) == 0)
+                       return(var);
+       }
+       return(NULL);
 }
 
-int
-rel_open(const char *path, int flags)
+void
+dvar_set(const char *name, char **data, int count)
 {
-       int fd;
-       char *ptr;
+       dvar_t var;
 
-       if (DirBase && path[0] != '/') {
-               ptr = malloc(strlen(DirBase) + strlen(path) + 2);
-               sprintf(ptr, "%s/%s", DirBase, path);
-               fd = open(ptr, flags);
-               free(ptr);
+       for (var = dvbase; var; var = var->next) {
+               if (strcmp(name, var->name) == 0)
+                       break;
+       }
+       if (var == NULL) {
+               var = malloc(sizeof(*var) + strlen(name) + 1);
+               var->name = (char *)(void *)(var + 1);
+               strcpy(var->name, name);
+               var->count = count;
+               var->data = malloc(sizeof(char *) * (count + 1));
+               var->data[count] = NULL;
+               while (--count >= 0)
+                       var->data[count] = strdup(data[count]);
+               var->next = NULL;
+               *dvlastp = var;
+               dvlastp = &var->next;
+       }
+}
+
+void
+dvar_unset(const char *name)
+{
+       dvar_t *lastp;
+       dvar_t var;
+       char *p;
+
+       lastp = &dvbase;
+       if ((p = strchr(name, '*')) != NULL) {
+               while ((var = *lastp) != NULL) {
+                       if (strlen(var->name) >= p - name &&
+                           strncmp(var->name, name, p - name) == 0) {
+                               dvar_free(lastp);
+                       } else {
+                               lastp = &var->next;
+                       }
+               }
        } else {
-               fd = open(path, flags);
+               while ((var = *lastp) != NULL) {
+                       if (strcmp(name, var->name) == 0) {
+                               dvar_free(lastp);
+                               break;
+                       }
+                       lastp = &var->next;
+               }
        }
-       return(fd);
 }
 
+dvar_t
+dvar_first(void)
+{
+       return(dvbase);
+}
+
+dvar_t
+dvar_next(dvar_t var)
+{
+       return(var->next);
+}
+
+static void
+dvar_free(dvar_t *lastp)
+{
+       dvar_t dvar = *lastp;
+
+       if (dvlastp == &dvar->next)
+               dvlastp = lastp;
+       *lastp = dvar->next;
+       while (--dvar->count >= 0)
+               free(dvar->data[dvar->count]);
+       free(dvar->data);
+       free(dvar);
+}
index 2177018..8442a30 100644 (file)
@@ -16,13 +16,12 @@ CFLAGS+=    -ffreestanding
 
 .if !defined(NOFORTH)
 # Enable BootForth
-BOOT_FORTH=    yes
-CFLAGS+=       -DBOOT_FORTH
-CFLAGS+=       -I${.CURDIR}/../../ficl -I${.CURDIR}/../../ficl/${MACHINE_ARCH}
-.if exists(${.OBJDIR}/../../ficl/libficl.a)
-LIBFICL=       ${.OBJDIR}/../../ficl/libficl.a
+BOOT_DLOADER=  yes
+CFLAGS+=       -I${.CURDIR}/../../dloader -I${.CURDIR}/../../dloader/${MACHINE_ARCH}
+.if exists(${.OBJDIR}/../../dloader/libdloader.a)
+LIBDLOADER=    ${.OBJDIR}/../../dloader/libdloader.a
 .else
-LIBFICL=       ${.CURDIR}/../../ficl/libficl.a
+LIBDLOADER=    ${.CURDIR}/../../dloader/libdloader.a
 .endif
 .endif
 
@@ -96,16 +95,17 @@ beforeinstall:
        ${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 \
                ${.CURDIR}/${BASE}.help ${DESTDIR}/boot
 .endif
-.if !exists(${DESTDIR}/boot/loader.rc)
+.if !exists(${DESTDIR}/boot/dloader.rc)
        ${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 \
-               ${.CURDIR}/../../forth/loader.rc ${DESTDIR}/boot
+               ${.CURDIR}/../../dloader/dloader.rc ${DESTDIR}/boot
 .endif
-       ${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 \
-               ${.CURDIR}/../../forth/loader.4th ${DESTDIR}/boot
-       ${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 \
-               ${.CURDIR}/../../forth/support.4th ${DESTDIR}/boot
-       ${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 \
-               ${.CURDIR}/../../forth/loader.conf ${DESTDIR}/boot/defaults
+
+#      ${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 \
+#              ${.CURDIR}/../../forth/loader.4th ${DESTDIR}/boot
+#      ${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 \
+#              ${.CURDIR}/../../forth/support.4th ${DESTDIR}/boot
+#      ${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 \
+#              ${.CURDIR}/../../forth/loader.conf ${DESTDIR}/boot/defaults
 
 
 # Other fragments still to be brought in from ../Makfile.booters?
@@ -117,8 +117,8 @@ machine:
 
 .include <bsd.prog.mk>
 
-${BASE}.sym: ${OBJS} ${LIBFICL} ${LIBEFI} ${LIBSTAND} ${CRT} vers.o
+${BASE}.sym: ${OBJS} ${LIBDLOADER} ${LIBEFI} ${LIBSTAND} ${CRT} vers.o
        ${LD} ${LDFLAGS} -o ${BASE}.sym -M ${CRT} ${OBJS} vers.o \
-           ${LIBFICL} ${LIBEFI} ${LIBSTAND} > ${.OBJDIR}/${BASE}.list
+           ${LIBDLOADER} ${LIBEFI} ${LIBSTAND} > ${.OBJDIR}/${BASE}.list
 
 beforedepend ${OBJS}: machine
index bf54e3b..832833f 100644 (file)
@@ -433,7 +433,7 @@ static void pfopen(FICL_VM *pVM)
     name[count] = 0;
 
     /* open the file */
-    fd = rel_open(name, mode);
+    fd = rel_open(name, NULL, mode);
     free(name);
     stackPushINT(pVM->pStack, fd);
     return;
index 02e38ab..f6f0efb 100644 (file)
@@ -15,13 +15,12 @@ CFLAGS+=    -ffreestanding
 
 .if !defined(NOFORTH)
 # Enable BootForth
-BOOT_FORTH=    yes
-CFLAGS+=       -DBOOT_FORTH
-CFLAGS+=       -I${.CURDIR}/../../ficl -I${.CURDIR}/../../ficl/${MACHINE_ARCH}
-.if exists(${.OBJDIR}/../../ficl/libficl.a)
-LIBFICL=       ${.OBJDIR}/../../ficl/libficl.a
+BOOT_DLOADER=  yes
+CFLAGS+=       -I${.CURDIR}/../../dloader -I${.CURDIR}/../../dloader/${MACHINE_ARCH}
+.if exists(${.OBJDIR}/../../dloader/libdloader.a)
+LIBDLOADER=    ${.OBJDIR}/../../dloader/libdloader.a
 .else
-LIBFICL=       ${.CURDIR}/../../ficl/libficl.a
+LIBDLOADER=    ${.CURDIR}/../../dloader/libdloader.a
 .endif
 .endif
 
@@ -75,10 +74,10 @@ beforeinstall:
 machine:
        ${LN} -sf ${.CURDIR}/../../../arch/${MACHINE_ARCH}/include machine
 
-${PROG}: ${OBJS} ${LIBFICL} ${LIBSKI} ${LIBSTAND} vers.o
+${PROG}: ${OBJS} ${LIBDLOADER} ${LIBSKI} ${LIBSTAND} vers.o
        ${LD} ${LDFLAGS} -o ${PROG} -M \
            ${OBJS} vers.o \
-           ${LIBFICL} ${LIBSTAND} ${LIBSKI} ${LIBSTAND} \
+           ${LIBDLOADER} ${LIBSTAND} ${LIBSKI} ${LIBSTAND} \
            > ${.OBJDIR}/${PROG}.list
 
 .include <bsd.prog.mk>
index 4d0ec63..ee85841 100644 (file)
@@ -30,12 +30,12 @@ HAVE_ISABUS=        yes
 
 .if !defined(NOFORTH)
 # Enable BootForth
-BOOT_FORTH=    yes
-CFLAGS+=       -DBOOT_FORTH -I${.CURDIR}/../../ficl -I${.CURDIR}/../../ficl/i386
-.if exists(${.OBJDIR}/../../ficl/libficl.a)
-LIBFICL=       ${.OBJDIR}/../../ficl/libficl.a
+BOOT_DLOADER=  yes
+CFLAGS+=       -I${.CURDIR}/../../dloader -I${.CURDIR}/../../dloader/i386
+.if exists(${.OBJDIR}/../../dloader/libdloader.a)
+LIBDLOADER=    ${.OBJDIR}/../../dloader/libdloader.a
 .else
-LIBFICL=       ${.CURDIR}/../../ficl/libficl.a
+LIBDLOADER=    ${.CURDIR}/../../dloader/libdloader.a
 .endif
 .endif
 
@@ -107,14 +107,14 @@ ${PROG}.bin: ${PROG}.sym
 ${PROG}.help: help.common help.i386
        cat ${.ALLSRC} | awk -f ${.CURDIR}/../../common/merge_help.awk > ${.TARGET}
 
-.PATH: ${.CURDIR}/../../forth 
-FILES= ${PROG}.help loader.4th support.4th loader.conf loader-bootp.conf
-FILES+= screen.4th frames.4th beastie.4th
+.PATH: ${.CURDIR}/../../dloader
+FILES= ${PROG}.help loader.conf loader-bootp.conf dloader.menu
 FILESDIR_loader.conf=  /boot/defaults
 FILESDIR_loader-bootp.conf=    /boot/defaults
+FILESDIR_dloader.menu= /boot/defaults
 
-.if !exists(${DESTDIR}/boot/loader.rc)
-FILES+=        ${.CURDIR}/loader.rc
+.if !exists(${DESTDIR}/boot/dloader.rc)
+FILES+=        ${.CURDIR}/dloader.rc
 .endif
 
 .include "../Makefile.inc"
@@ -122,9 +122,9 @@ FILES+=     ${.CURDIR}/loader.rc
 # Cannot use ${OBJS} above this line
 .include <bsd.prog.mk>
 
-${PROG}.sym: ${OBJS} ${LIBI386} ${LIBSTAND} ${LIBFICL} vers.o
+${PROG}.sym: ${OBJS} ${LIBI386} ${LIBSTAND} ${LIBDLOADER} vers.o
        ${CC} ${LDFLAGS} -o ${.TARGET} ${BTXCRT} ${OBJS} vers.o \
-               ${LIBFICL} ${LIBI386} ${LIBSTAND}
+               ${LIBDLOADER} ${LIBI386} ${LIBSTAND}
 
 # If it's not there, don't consider it a target
 .if exists(${.CURDIR}/../../../i386/include)
diff --git a/sys/boot/pc32/loader/dloader.rc b/sys/boot/pc32/loader/dloader.rc
new file mode 100644 (file)
index 0000000..74044d3
--- /dev/null
@@ -0,0 +1,14 @@
+# loader.rc for dloader
+#
+# common/do_dloader.c has put us in "/boot" if it exists,
+# else we are in "/".  It depends on whether the system
+# is configured with a single boot+root or a separate boot
+# with a HAMMER root.
+
+include defaults/loader.conf
+include defaults/dloader.menu
+optinclude dloader.menu
+optinclude loader.conf
+optinclude loader.conf.local
+
+menu
index c3db2fe..38b24c7 100644 (file)
@@ -31,12 +31,12 @@ HAVE_ISABUS=        yes
 
 .if !defined(NOFORTH)
 # Enable BootForth
-BOOT_FORTH=    yes
-CFLAGS+=       -DBOOT_FORTH -I${.CURDIR}/../../ficl -I${.CURDIR}/../../ficl/i386
-.if exists(${.OBJDIR}/../../ficl/libficl.a)
-LIBFICL=       ${.OBJDIR}/../../ficl/libficl.a
+BOOT_DLOADER=  yes
+CFLAGS+=       -I${.CURDIR}/../../dloader -I${.CURDIR}/../../dloader/i386
+.if exists(${.OBJDIR}/../../dloader/libdloader.a)
+LIBDLOADER=    ${.OBJDIR}/../../dloader/libdloader.a
 .else
-LIBFICL=       ${.CURDIR}/../../ficl/libficl.a
+LIBDLOADER=    ${.CURDIR}/../../dloader/libdloader.a
 .endif
 .endif
 
@@ -108,14 +108,13 @@ ${PROG}.bin: ${PROG}.sym
 ${PROG}.help: help.common help.i386
        cat ${.ALLSRC} | awk -f ${.CURDIR}/../../common/merge_help.awk > ${.TARGET}
 
-.PATH: ${.CURDIR}/../../forth 
-FILES= ${PROG}.help loader.4th support.4th loader.conf loader-bootp.conf
-FILES+= screen.4th frames.4th beastie.4th
+.PATH: ${.CURDIR}/../../dloader
+FILES= ${PROG}.help loader.conf loader-bootp.conf
 FILESDIR_loader.conf=  /boot/defaults
 FILESDIR_loader-bootp.conf=    /boot/defaults
 
-.if !exists(${DESTDIR}/boot/loader.rc)
-FILES+=        ${.CURDIR}/../loader/loader.rc
+.if !exists(${DESTDIR}/boot/dloader.rc)
+FILES+=        ${.CURDIR}/../loader/dloader.rc
 .endif
 
 .include "../Makefile.inc"
@@ -123,9 +122,9 @@ FILES+=     ${.CURDIR}/../loader/loader.rc
 # Cannot use ${OBJS} above this line
 .include <bsd.prog.mk>
 
-${PROG}.sym: ${OBJS} ${LIBI386} ${LIBSTAND} ${LIBFICL} vers.o
+${PROG}.sym: ${OBJS} ${LIBI386} ${LIBSTAND} ${LIBDLOADER} vers.o
        ${CC} ${LDFLAGS} -o ${.TARGET} ${BTXCRT} ${OBJS} vers.o \
-               ${LIBFICL} ${LIBI386} ${LIBSTAND}
+               ${LIBDLOADER} ${LIBI386} ${LIBSTAND}
 
 # If it's not there, don't consider it a target
 .if exists(${.CURDIR}/../../../i386/include)
index 29f268c..036e2c1 100644 (file)
@@ -33,14 +33,15 @@ CFLAGS+=    -DLOADER_NET_SUPPORT
 
 ###.if !defined(NOFORTH)
 #### Enable BootForth
-###BOOT_FORTH= yes
-###CFLAGS+=    -DBOOT_FORTH -I${.CURDIR}/../../ficl -I${.CURDIR}/../../ficl/powerpc
-###.if exists(${.OBJDIR}/../../ficl/libficl.a)
-###LIBFICL=    ${.OBJDIR}/../../ficl/libficl.a
+###BOOT_DLOADER=       yes
+###CFLAGS+=    -I${.CURDIR}/../../dloader -I${.CURDIR}/../../dloader/powerpc
+###.if exists(${.OBJDIR}/../../dloader/libdloader.a)
+###LIBDLOADER= ${.OBJDIR}/../../dloader/libdloader.a
 ###.else
-###LIBFICL=    ${.CURDIR}/../../ficl/libficl.a
+###LIBDLOADER= ${.CURDIR}/../../dloader/libdloader.a
 ###.endif
 ###.endif
+BOOT_DEFAULT=  yes
 
 # Always add MI sources 
 .PATH:         ${.CURDIR}/../../common
@@ -89,20 +90,21 @@ beforeinstall:
        ${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 \
                ${.CURDIR}/${BASE}.help ${DESTDIR}/boot
 .endif
-.if !exists(${DESTDIR}/boot/loader.rc)
+.if !exists(${DESTDIR}/boot/dloader.rc)
        ${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 \
-               ${.CURDIR}/../../forth/loader.rc ${DESTDIR}/boot
+               ${.CURDIR}/../../dloader/dloader.rc ${DESTDIR}/boot
 .endif
-       ${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 \
-               ${.CURDIR}/../../forth/loader.4th ${DESTDIR}/boot
-       ${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 \
-               ${.CURDIR}/../../forth/support.4th ${DESTDIR}/boot
-       ${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 \
-               ${.CURDIR}/../../forth/loader.conf ${DESTDIR}/boot/defaults
 
-${PROG}: ${OBJS} ${LIBOFW} ${LIBSTAND} ${LIBFICL} start.o vers.o
+#      ${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 \
+#              ${.CURDIR}/../../forth/loader.4th ${DESTDIR}/boot
+#      ${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 \
+#              ${.CURDIR}/../../forth/support.4th ${DESTDIR}/boot
+#      ${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 \
+#              ${.CURDIR}/../../forth/loader.conf ${DESTDIR}/boot/defaults
+
+${PROG}: ${OBJS} ${LIBOFW} ${LIBSTAND} ${LIBDLOADER} start.o vers.o
        ${LD} ${LDFLAGS} -o ${.TARGET} start.o ${OBJS} \
-               vers.o ${LIBFICL} ${LIBOFW} ${LIBSTAND}
+               vers.o ${LIBDLOADER} ${LIBOFW} ${LIBSTAND}
 
 machine:
        ${LN} -sf ${.CURDIR}/../../../powerpc/include machine
index a91ecbb..aec7c0e 100644 (file)
@@ -47,12 +47,12 @@ CFLAGS+=    -DLOADER_TFTP_SUPPORT
 
 .if !defined(NOFORTH)
 # Enable BootForth
-BOOT_FORTH=    yes
-CFLAGS+=       -DBOOT_FORTH -I${.CURDIR}/../../ficl -I${.CURDIR}/../../ficl/sparc64
-.if exists(${.OBJDIR}/../../ficl/libficl.a)
-LIBFICL=       ${.OBJDIR}/../../ficl/libficl.a
+BOOT_DLOADER=  yes
+CFLAGS+=       -I${.CURDIR}/../../dloader -I${.CURDIR}/../../dloader/sparc64
+.if exists(${.OBJDIR}/../../dloader/libdloader.a)
+LIBDLOADER=    ${.OBJDIR}/../../dloader/libdloader.a
 .else
-LIBFICL=       ${.CURDIR}/../../ficl/libficl.a
+LIBDLOADER=    ${.CURDIR}/../../dloader/libdloader.a
 .endif
 .endif
 
@@ -82,7 +82,7 @@ LIBSTAND=     -lstand
 .endif
 CFLAGS+=       -I${.CURDIR}/../../../../lib/libstand/
 
-LDADD=         ${LIBFICL} ${LIBOFW} ${LIBSTAND}
+LDADD=         ${LIBDLOADER} ${LIBOFW} ${LIBSTAND}
 
 vers.c:        ${.CURDIR}/../../common/newvers.sh ${.CURDIR}/version
        sh ${.CURDIR}/../../common/newvers.sh ${.CURDIR}/version ${NEWVERSWHAT}
@@ -91,12 +91,12 @@ ${BASE}.help: help.common help.sparc64
        cat ${.ALLSRC} | \
            awk -f ${.CURDIR}/../../common/merge_help.awk > ${.TARGET}
 
-.PATH: ${.CURDIR}/../../forth
-FILES= ${BASE}.help loader.4th support.4th loader.conf
+.PATH: ${.CURDIR}/../../dloader
+FILES= ${BASE}.help dloader.conf
 FILESDIR_loader.conf=  /boot/defaults
 
-.if !exists(${DESTDIR}/boot/loader.rc)
-FILES+= loader.rc
+.if !exists(${DESTDIR}/boot/rloader.rc)
+FILES+= rloader.rc
 .endif
 
 # There are no things relevant to all boot parts of FreeBSD/sparc64 yet.
index 3fc7713..c78a560 100644 (file)
@@ -3,16 +3,17 @@
 # DESTLABEL            add suffix to kernel and modules directory [not set]
 # DESTKERNDIR          where kernel and modules are to be installed [/boot]
 # DESTKERNNAME         name of installed kernel [${KERNEL}]
-# DESTMODULESNAME      name of modules directory [modules]
+# OLDMODULESDIR                (deprecated)
 #
 .if defined(DESTLABEL)
-DESTKERNNAME?=         ${KERNEL}.${DESTLABEL}
-DESTMODULESNAME?=      modules.${DESTLABEL}
+DESTKERNDIR?=          /boot/${KERNEL}.${DESTLABEL}
+DESTKERNNAME?=         kernel
+OLDMODULESDIR?=                /boot/modules.${DESTLABEL}
 .else
-DESTKERNNAME?=         ${KERNEL}
-DESTMODULESNAME?=      modules
+DESTKERNDIR?=          /boot/${KERNEL}
+DESTKERNNAME?=         kernel
+OLDMODULESDIR?=                /boot/modules
 .endif
-DESTKERNDIR?=          /boot
 
 # Set DESTDIR to /var/vkernel by default for vkernel platform so as
 # not to shoot the real kernel installation.
index 6f9b70c..0ff5813 100644 (file)
@@ -112,21 +112,32 @@ kernel-tags:
 # Note: when moving the existing kernel to .old, it is by default stripped
 # so we do not have two full debug environments sitting in / eating up space.
 #
+# Also note the .old might be a file and not a directory, so we have to
+# remove it first.
+#
 kernel-install: kernel-installable
-       @if [ ! -f ${SELECTEDKERNEL} ] ; then \
-               echo "You must build a kernel first." ; \
-               exit 1 ; \
+       @if [ ! -f ${SELECTEDKERNEL} ]; then                    \
+               echo "You must build a kernel first.";          \
+               exit 1;                                         \
+       fi
+       @if [ -f ${DESTDIR}${DESTKERNDIR}.old ]; then           \
+               rm -f ${DESTDIR}${DESTKERNDIR}.old;             \
        fi
+       mkdir -p ${DESTDIR}${DESTKERNDIR}.old
 .  if exists(${DESTDIR}${DESTKERNDIR}/${DESTKERNNAME})
 .ifndef NOFSCHG
        -chflags noschg ${DESTDIR}${DESTKERNDIR}/${DESTKERNNAME}
 .endif
 .    ifdef NO_KERNEL_OLD_STRIP
-       cp -p ${DESTDIR}${DESTKERNDIR}/${DESTKERNNAME} ${DESTDIR}${DESTKERNDIR}/${DESTKERNNAME}.old
+       cp -p ${DESTDIR}${DESTKERNDIR}/${DESTKERNNAME} ${DESTDIR}${DESTKERNDIR}.old/${DESTKERNNAME}
 .    else
-       ${OBJCOPY} --strip-debug ${DESTDIR}${DESTKERNDIR}/${DESTKERNNAME} ${DESTDIR}${DESTKERNDIR}/${DESTKERNNAME}.old
+       ${OBJCOPY} --strip-debug ${DESTDIR}${DESTKERNDIR}/${DESTKERNNAME} ${DESTDIR}${DESTKERNDIR}.old/${DESTKERNNAME}
 .    endif
 .  endif
+       @if [ -f ${DESTDIR}${DESTKERNDIR} ]; then               \
+               chflags noschg ${DESTDIR}${DESTKERNDIR};        \
+               rm -f ${DESTDIR}${DESTKERNDIR};                 \
+       fi
        mkdir -p ${DESTDIR}${DESTKERNDIR}
 .ifdef NOFSCHG
        ${INSTALL} -m 555 -o root -g wheel \
@@ -153,6 +164,12 @@ kernel-installable:
                echo "kernel and modules have moved to /boot"; \
                exit 1; \
        fi
+       @if [ ! -f ${DESTDIR}/boot/dloader.rc ]; then \
+               echo "You need to install a new ${DESTDIR}/boot before you"; \
+               echo "can install a new kernel, kernels are now installed"; \
+               echo "into a subdirectory along with their modules"; \
+               exit 1; \
+       fi
        @exit 0
 
 .if !defined(MODULES_WITH_WORLD) && !defined(NO_MODULES)
@@ -195,31 +212,43 @@ modules-tags:
 # Note: when moving the existing modules to .old, they are by default stripped
 # so we do not have two full debug environments sitting in / eating up space.
 #
+# We may have to remove deprecated kernel.old files before we can create
+# the kernel.old directory.
+#
 modules-install:
 .if !defined(NO_MODULES_OLD)
 .  ifdef NO_KERNEL_OLD_STRIP
-       set -- ${DESTDIR}${DESTKERNDIR}/${DESTMODULESNAME}/*; \
-       if [ -f "$$1" ]; then \
-               mkdir -p ${DESTDIR}${DESTKERNDIR}/${DESTMODULESNAME}.old; \
-               for file; do \
-               cp -p $$file ${DESTDIR}${DESTKERNDIR}/${DESTMODULESNAME}.old; \
-               done; \
+       set -- ${DESTDIR}${DESTKERNDIR}/*;                      \
+       if [ -f "$$1" ]; then                                   \
+               if [ -f ${DESTDIR}${DESTKERNDIR}.old ]; then    \
+                   rm -f ${DESTDIR}${DESTKERNDIR}.old;         \
+               fi;                                             \
+               mkdir -p ${DESTDIR}${DESTKERNDIR}.old;          \
+               for file; do                                    \
+               cp -p $$file ${DESTDIR}${DESTKERNDIR}.old;      \
+               done;                                           \
        fi
 .  else
-       set -- ${DESTDIR}${DESTKERNDIR}/${DESTMODULESNAME}/*; \
-       if [ -f "$$1" ]; then \
-               mkdir -p ${DESTDIR}${DESTKERNDIR}/${DESTMODULESNAME}.old; \
-               for file; do \
-               ${OBJCOPY} --strip-debug $$file ${DESTDIR}${DESTKERNDIR}/${DESTMODULESNAME}.old/$${file##*/}; \
-               done; \
+       set -- ${DESTDIR}${DESTKERNDIR}/*;                      \
+       if [ -f "$$1" ]; then                                   \
+               if [ -f ${DESTDIR}${DESTKERNDIR}.old ]; then    \
+                   rm -f ${DESTDIR}${DESTKERNDIR}.old;         \
+               fi;                                             \
+               mkdir -p ${DESTDIR}${DESTKERNDIR}.old;          \
+               for file; do                                    \
+               ${OBJCOPY} --strip-debug $$file ${DESTDIR}${DESTKERNDIR}.old/$${file##*/}; \
+               done;                                           \
        fi
 .  endif
 .endif
-       mkdir -p ${DESTDIR}${DESTKERNDIR}/${DESTMODULESNAME} # Ensure that the modules directory exists!
+.if exists(${DESTDIR}/${OLDMODULESDIR})
+       rm -rf ${DESTDIR}/${OLDMODULESDIR} # remove deprecated
+.endif
+       mkdir -p ${DESTDIR}${DESTKERNDIR} # Ensure that the modules directory exists!
        cd $S ; env ${MKMODULESENV} ${MAKE} -f Makefile.modules install
 
 modules-reinstall:
-       mkdir -p ${DESTDIR}/${DESTKERNDIR}/${DESTMODULESNAME} # Ensure that the modules directory exists!
+       mkdir -p ${DESTDIR}/${DESTKERNDIR} # Ensure that the modules directory exists!
        cd $S ; env ${MKMODULESENV} ${MAKE} -f Makefile.modules install
 
 config.o:
index f2c92a8..357f0b1 100644 (file)
@@ -18,6 +18,10 @@ SIZE?=               size
 OBJCOPY?=      objcopy
 
 COPTFLAGS?=-O -pipe
+#COPTFLAGS?=-O -fthread-jumps -fcse-follow-jumps -fcrossjumping -frerun-cse-after-loop -fno-guess-branch-probability --param min-crossjump-insns=1 -pipe
+#COPTFLAGS?=-O -fcrossjumping -pipe
+#COPTFLAGS?=-Os -fno-strict-aliasing -pipe
+#COPTFLAGS?=-O2 -fno-strict-aliasing -pipe
 .if !defined(NO_CPU_COPTFLAGS)
 COPTFLAGS+= ${_CPUCFLAGS}
 .endif
index 81b671a..33db29a 100644 (file)
@@ -11,7 +11,7 @@
 # KMOD          The name of the kernel module to build.
 #
 # KMODDIR      Base path for kernel modules (see kld(4)).
-#              [${DESTKERNDIR}/${DESTMODULESNAME}]
+#              [${DESTKERNDIR}]
 #
 # KMODOWN      KLD owner. [${BINOWN}]
 #
@@ -60,7 +60,7 @@ OBJCOPY?=     objcopy
 KMODLOAD?=     /sbin/kldload
 KMODUNLOAD?=   /sbin/kldunload
 
-KMODDIR?=      ${DESTKERNDIR}/${DESTMODULESNAME}
+KMODDIR?=      ${DESTKERNDIR}
 KMODOWN?=      ${BINOWN}
 KMODGRP?=      ${BINGRP}
 KMODMODE?=     ${BINMODE}