summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/boot/common/loader.8747
-rw-r--r--sys/boot/i386/loader/Makefile5
-rw-r--r--sys/boot/i386/loader/loader.8747
3 files changed, 1497 insertions, 2 deletions
diff --git a/sys/boot/common/loader.8 b/sys/boot/common/loader.8
new file mode 100644
index 0000000..32133d8
--- /dev/null
+++ b/sys/boot/common/loader.8
@@ -0,0 +1,747 @@
+.\" Copyright (c) 1999 Daniel C. Sobral
+.\" 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.
+.\"
+.\" $Id$
+.\"
+.\" Note: The date here should be updated whenever a non-trivial
+.\" change is made to the manual page.
+.Dd March 14, 1999
+.Dt LOADER 8
+.Os
+.Sh NAME
+.Nm loader
+.Nd system bootstrap stage three
+.Sh DESCRIPTION
+The program called
+.Nm
+is the third stage of FreeBSD's three stage bootstrap.
+It is a
+.Pa BTX
+client linked statically to libstand(3) and
+usually located in the directory
+.Pa /boot .
+.Pp
+It provides a scripting language that can be used to
+automate tasks, do pre-configuration or assist in recovery
+procedures. This scripting language is roughly divided in
+two main components. The smaller one is a set of commands
+designed for direct use by the casual user, called "builtin
+commands" for historical reasons. The main drive behind
+these commands is user-friendlyness. The bigger component
+is an
+.Tn ANS
+Forth compatible Forth interpreter based on
+ficl, by
+.An John Sadler .
+.Pp
+During initialization,
+.Nm
+will probe for a console and set the
+.Va console
+variable, or set it to serial console
+.Pq Dq comconsole
+if the previous boot stage used that. Then, devices are probed,
+.Va currdev
+and
+.Va loaddev
+are set, and
+.Va LINES
+is set to 24 . Next,
+.Tn FICL
+is initialized, the builtin words are added to it's vocabulary, and
+.Pa /boot/boot.4th
+will be processed if it exists. No disk switching is possible while
+that file is being read. The inner interpreter
+.Nm
+will use with
+.Tn FICL
+is then set to
+.Ic interpret ,
+which is
+.Tn FICL Ns 's
+default. After that,
+.Pa /boot/loader.rc
+is processed if available, and, failing that,
+.Pa /boot/boot.conf
+will be read for historical reasons. These files are processed
+through the
+.Ic include
+command, which read all of them into memory before processing them,
+making disk changes possible.
+.Pp
+At this point, if an
+.Ic autoboot
+has not been tried, and if
+.Va autoboot_delay
+is not set to
+.Dq NO
+(not case sensitive), then an
+.Ic autoboot
+will be tried. If the system gets past this point,
+.Va prompt
+will be set and
+.Nm
+will engage interactive mode.
+.Sh BUILTIN COMMANDS
+.Nm Loader Ns No 's
+builtin commands take it's parameters from the command line. Presently,
+the only way to call them from a script is by using
+.Pa evaluate
+on a string. If an error condition occurs, an exception will be
+generated, which can be intercepted using
+.Tn ANS
+Forth exception handling
+words. If not intercepted, an error message will be displayed and
+the interpreter's state will be reset, emptying the stack and restoring
+interpreting mode.
+.Pp
+The builtin commands available are:
+.Pp
+.Bl -tag -width Ds -compact -offset indent
+.It Ic autoboot Op Ar seconds
+Proceeds to bootstrap the system after a number of seconds, if not
+interrupted by the user. Displays a countdown prompt warning the
+user the system is about to be booted, unless interrupted by a key
+press. The kernel will be loaded first if necessary. Defaults to
+10 seconds.
+.Pp
+.It Ic bcachestat
+Displays statistics about disk cache usage. For depuration only.
+.Pp
+.It Ic boot
+.It Ic boot Ar kernelname Op Cm ...
+.It Ic boot Fl flag Cm ...
+Immediately proceeds to bootstrap the system, loading the kernel
+if necessary. Any flags or arguments are passed to the kernel, but they
+must precede the kernel name, if a kernel name is provided.
+.Pp
+.It Ic echo Xo
+.Op Fl n
+.Op Aq message
+.Xc
+Displays a text on the screen. A new line will be printed unless
+.Fl n
+is specified.
+.Pp
+.It Ic heap
+Displays memory usage statistics. For debugging purposes only.
+.Pp
+.It Ic help Op topic Op subtopic
+Shows help messages read from
+.Pa /boot/loader.help .
+The special topic
+.Em index
+will list the topics available.
+.Pp
+.It Ic include Ar file Op Ar
+Process script files. Each file is, at a turn, completely read into
+memory, and then have each of it's lines passed to the command line
+interpreter. If any error is returned by the interpreter, the include
+commands aborts immediately, without reading any other files, and
+returns an error itself (see
+.Sx ERRORS ) .
+.Pp
+.It Ic load Xo
+.Op Fl t Ar type
+.Ar file Cm ...
+.Xc
+Loads a kernel, kernel loadable module (kld), or a file of opaque
+contents tagged as being of the type
+.Ar type .
+Kernel and modules can be either in a.out or elf format. Any arguments
+passed after the name of the file to be loaded will be passed as
+arguments to that file. Notice, though, that, at the present, this does
+not work for the kernel.
+.Pp
+.It Ic ls Xo
+.Op Fl l
+.Op Ar path
+.Xc
+Displays a listing of files in the directory
+.Ar path ,
+or the root directory if
+.Ar path
+is not specified. If
+.Fl l
+is specified, file sizes will be shown too.
+.Pp
+.It Ic lsdev Op Fl v
+Lists all of the devices from which it may be possible to load modules. If
+.Fl v
+is specified, more details are printed.
+.Pp
+.It Ic lsmod Op Fl v
+Displays loaded modules. If
+.Fl v
+is specified, more details are shown.
+.Pp
+.It Ic more Ar file Op Ar
+Display the files specified, with a pause at each
+.Va LINES
+displayed.
+.Pp
+.It Ic pnpscan Op Fl v
+Scans for Plug-and-Play devices. This is not functional at the present.
+.Pp
+.It Ic read Xo
+.Op Fl t Ar seconds
+.Op Fl p Ar prompt
+.Op Va variable
+.Xc
+Reads a line of input from the terminal, storing it in
+.Va variable
+if specified. A timeout can be specified with
+.Fl t ,
+though it will be canceled at the first key pressed. A prompt may
+also be displayed through the
+.Fl p
+flag.
+.Pp
+.It Ic reboot
+Immediately reboots the system.
+.Pp
+.It Ic set Ar variable
+.It Ic set Ar variable Ns = Ns Ar value
+Set loader's environment variables.
+.Pp
+.It Ic show Op Va variable
+Displays the specified variable's value, or all variables and their
+values if
+.Va variable
+is not specified.
+.Pp
+.It Ic unload
+Remove all modules from memory.
+.Pp
+.It Ic unset Va variable
+Removes
+.Va variable
+from the environment.
+.Pp
+.It Ic \&?
+Same as
+.Dq help index .
+.Pp
+.El
+.Ss BUILTIN ENVIRONMENT VARIABLES
+The
+.Nm
+has actually two different kinds of
+.Sq environment
+variables. There are ANS Forth's
+.Em environmental queries ,
+and a separate space of environment variables used by builtins, which
+are not directly available to Forth words. It is the later ones that
+this session covers.
+.Pp
+Environment variables can be set and unset through the use of the
+.Ic set
+and
+.Ic unset
+builtins, and have their value interactively examined through the
+use of the
+.Ic show
+builtin. Their values can also be accessed as described in
+.Sx BUILTIN PARSER .
+.Pp
+Notice that this environment variables are not inherited by any shell
+after the system has been booted.
+.Pp
+A few variables are set automatically by
+.Nm .
+Others can affect either
+.Nm
+or kernel's behavior at boot. While some of these may require a value,
+others define behavior just by being set. These are described below.
+.Bl -tag -width bootfile -offset indent
+.It Va autoboot_delay
+Number of seconds
+.Ic autoboot
+will wait before booting. If this variable is not defined,
+.Ic autoboot
+will default to 10 seconds.
+.Pp
+If set to
+.Dq NO ,
+no
+.Ic autoboot
+will be automatically attempted after processing
+.Pa /boot/loader.rc ,
+though explict
+.Ic autoboot Ns 's
+will be processed normally, defaulting to 10 seconds delay.
+.It Va boot_askname
+Instructs the kernel to prompt the user for the name of the root device
+when the kernel is booted.
+.It Va boot_ddb
+Instructs the kernel to start in the DDB debugger, rather than
+proceeding to initialise when booted.
+.It Va boot_gdb
+Selects gdb-remote mode for the kernel debugger by default.
+.It Va boot_single
+Prevents the kernel from initiating a multi-user startup, single-user
+mode will be entered when the kernel has finished device probes.
+.It Va boot_userconfig
+Requests that the kernel's interactive device configuration program
+be run when the kernel is booted.
+.It Va boot_verbose
+Setting this variable causes extra debugging information to be printed
+by the kernel during the boot phase.
+.It Va bootfile
+List of semicolon-separated search path for bootable kernels. The default
+is
+.Li Dq kernel;kernel.old .
+.It Va console
+Defines the current console.
+.It Va currdev
+Selects the default device. Syntax for devices is odd.
+.It Va interpret
+Has the value
+.Li Dq ok
+if the Forth's current state is interpreting.
+.It Va LINES
+Define the number of lines on the screen, to be used by the pager.
+.It Va module_path
+Sets the list of directories which will be searched in for modules
+named in a load command or implicitly required by a dependancy. The
+default value for this variable is
+.Li Dq /;/boot;/modules .
+.It Va num_ide_disks
+Sets the number of IDE disks as a work around for some problems in
+finding the root disk at boot. This has been deprecated in favour of
+.Va root_disk_unit .
+.It Va prompt
+Value of
+.Nm Ns No 's
+prompt. Defaults to
+.Li Dq "${currdev}>" .
+.It Va root_disk_unit
+If the code which detects the disk unit number for the root disk is
+confused, eg. by a mix of SCSI and IDE disks, or IDE disks with
+gaps in the sequence (eg. no primary slave), the unit number can
+be forced by setting this variable.
+.It Va rootdev
+By default the value of
+.Va currdev
+is used to set the root filesystem
+when the kernel is booted. This can be overridden by setting
+.Va rootdev
+explicitly.
+.El
+.Pp
+Other variables are used to override kernel tunnable parameters.
+The following tunables are available:
+.Bl -tag -width Va -offset indent
+.It Va kern.ipc.nmbclusters
+Set the number of mbuf clusters to be allocated. The value
+cannot be set below the default determined when the kernel
+was compiled. Modifies
+.Va NMBCLUSTERS .
+.It Va kern.vm.kmem.size
+Sets the size of kernel memory (bytes). This overrides
+completely the value determined when the kernel was
+compiled. Modifies
+.Va VM_KMEM_SIZE .
+.It Va machdep.pccard.pcic_irq
+Overrides the IRQ normally assigned to a PCCARD controller.
+Typically the first available interrupt will be allocated,
+which may conflict with other hardware. If this value is
+set to 0, an interrupt will not be assigned and the
+controller will operate in polled mode only.
+.It Va net.inet.tcp.tcbhashsize
+Overrides the compile-time set value of
+.Va TCBHASHSIZE
+or the preset default of 512. Must be a power of 2.
+.El
+.Ss BUILTIN PARSER
+When a builtin command is executed, the rest of the line is taken
+by it as arguments, and it's processed by a special parser which
+is not used for regular Forth commands.
+.Pp
+This special parser applies the following rules to the parsed text:
+.Pp
+.Bl -enum
+.It
+All backslash characters are preprocessed.
+.Bl -bullet
+.It
+\eb , \ef , \er , \en and \et are processed as by C's
+.fn printf() .
+.It
+\es is converted to a space.
+.It
+\ev is converted to
+.Tn ASCII
+11.
+.It
+\ez is just skipped.
+.It
+\eN and \eNN are replaced by the hex N or NN.
+.It
+\eNNN is replaced by the octal NNN
+.Tn ASCII
+character.
+.It
+\e" , \e' and \e$ will escape these characters, preventing them from
+receiving special semantics on the step 2 described below.
+.It
+\e\e will be replaced with a single \e .
+.It
+In any other occurance, backslash will just be removed.
+.El
+.It
+Every string between non-escaped quotes or double-quotes will be treated
+as a single word for the purposes of the remaining steps.
+.It
+Replace any
+.Li $VARIABLE
+or
+.Li ${VARIABLE}
+with the value of the environemnt variable
+.Va VARIABLE .
+.It
+Passes multiple space-delimited arguments to the builtin command called.
+Spaces can also be escaped through the use of \e\e .
+.El
+.Pp
+An exception to this parsing rule exists, and is described in
+.Sx BUILTINS AND FORTH .
+.Ss BUILTINS AND FORTH
+All builtin words are state-smart, immediate words. If interpreted, they
+behave exactly as described previously. If they are compiled, though,
+they extract their arguments from the stack instead of the command line.
+.Pp
+If compiled, the builtin words expect to find, at execution time, the
+following parameters on the stack:
+.D1 Ar addrN lenN ... addr2 len2 addr1 len1 N
+where
+.Ar addrX lenX
+are strings which will compose the command line that will be parsed
+into the builtin's arguments. Internally, these strings are
+concatenated in from 1 to N, with a space put between each one.
+.Pp
+If no arguments are passed, a 0
+.Em must
+be passed, even if the builtin accepts no arguments.
+.Pp
+While this behavior has benefits, it has it's trade-offs. If the
+execution token of a builtin is acquired (through
+.Ic No '
+or
+.Ic No ['] ) ,
+and then passed to
+.Ic catch
+or
+.Ic execute ,
+the builtin behavior will depend on the system state
+.Bf Em
+at the time
+.Ic catch
+or
+.Ic execute
+is processed
+.Ef
+\&! This is particular annoying for programs that want or need to
+treat exceptions. In this case, it is recommended the use of a proxy.
+For example:
+.Dl : (boot) boot ;
+.Sh FICL
+.Tn FICL
+is a Forth interpreter written in C, in the form of a forth
+virtual machine library that can be called by C functions and vice
+versa.
+.Pp
+In
+.Nm ,
+each line read interactively is then fed to
+.Tn FICL ,
+which may call
+.Nm
+back to execute the builtin words. The builtin
+.Ic include
+will also feed
+.Tn FICL ,
+one line at a time.
+.Pp
+The words available to
+.Tn FICL
+can be classified in four groups. The
+.Tn ANS
+Forth standard words, extra
+.Tn FICL
+words, extra
+.Os
+words, and the builtin commands. The later were already described. The
+.Tn ANS
+Forth standard words are listed in the
+.Sx STANDARDS
+section. The words falling in the two other groups are described in the
+following subsections.
+.Ss FICL EXTRA WORDS
+.Bl -tag -width wid-set-super -offset indent
+.It Ic .env
+.It Ic .ver
+.It Ic -roll
+.It Ic 2constant
+.It Ic >name
+.It Ic body>
+.It Ic compare
+This the STRING word set's
+.Ic compare .
+.It Ic compile-only
+.It Ic endif
+.It Ic forget-wid
+.It Ic parse-word
+.It Ic sliteral
+This is the STRING word set's
+.Ic sliteral .
+.It Ic wid-set-super
+.It Ic w@
+.It Ic w!
+.It Ic x.
+.It Ic empty
+.It Ic cell-
+.It Ic -rot
+.El
+.Ss FREEBSD EXTRA WORDS
+.Bl -tag -width XXXXXXX -offset indent
+.It Ic tib> Pq -- Ar addr len
+Returns the remainder of the input buffer as a string on the stack.
+.It Ic \&% Pq --
+Evaluates the remainder of the input buffer under a
+.Ic catch
+exception guard.
+.It Ic \&$ Pq --
+Evaluates the remainder of the input buffer, after having printed it first.
+.It Ic fopen Pq Ar addr len -- fd
+Open a file. Returns a file descriptor, or -1 in case of failure.
+.It Ic fclose Pq Ar fd --
+Closes a file.
+.It Xo
+.Ic fread
+.Pq Ar fd addr len -- len'
+.Xc
+Tries to read
+.Em len
+bytes from file
+.Em fd
+into buffer
+.Em addr .
+Returns the actual number of bytes read, or -1 in case of error or end of
+file.
+.It Ic fload Pq Ar fd --
+Process file
+.Em fd .
+.It Ic fkey Pq Ar fd -- char
+Reads a single character from a file.
+.It Ic key Pq -- Ar char
+Reads a single character from the console.
+.It Ic key? Pq -- Ar flag
+Returns
+.Ic true
+if there is a character available to be read from the console.
+.It Ic ms Pq Ar u --
+Waits
+.Em u
+microseconds.
+.It Ic seconds Pq -- Ar u
+Returns the number of seconds since midnight.
+.It Ic trace! Pq Ar flag --
+Activates or deactivates tracing. Does not work with
+.Ic catch .
+.It Ic outb Pq Ar port char --
+Writes a byte to a port.
+.It Ic inb Pq Ar port -- char
+Reads a byte from a port.
+.El
+.Ss FREEBSD DEFINED ENVIRONMENTAL QUERIES
+.Bl -tag -width Ds -offset indent
+.It arch-i386
+.Ic TRUE
+if the architecture is IA32.
+.It arch-alpha
+.Ic TRUE
+if the architecture is AXP.
+.It FreeBSD_version
+.Fx
+version at compile time.
+.It loader_version
+.Nm
+version.
+.El
+.Ss SYSTEM DOCUMENTATION
+.Sh FILES
+.Bl -tag -width /dev/loader.helpX -compact
+.It Pa /boot/loader
+.Nm
+itself.
+.It Pa /boot/boot.4th
+Additional
+.Tn FICL
+initialization.
+.It Pa /boot/boot.conf
+.Nm
+bootstrapping script. Deprecated.
+.It Pa /boot/loader.rc
+.Nm
+bootstrapping script.
+.It Pa /boot/loader.help
+Loaded by
+.Ic help .
+Contains the help messages.
+.El
+.Sh EXAMPLES
+Boot in single user mode:
+.Pp
+.Dl boot -s
+.Pp
+Loads kernel's user configuration file. Notice that a kernel must be
+loaded before any other
+.Ic load
+command is attempted.
+.Pp
+.Bd -literal -offset indent -compact
+load kernel
+load -t userconfig_script /boot/kernel.conf
+.Ed
+.Pp
+Loads the kernel, a splash screen, and then autoboots in five seconds.
+.Pp
+.Bd -literal -offset indent -compact
+load kernel
+load splash_bmp
+load -t splash_image_data /boot/chuckrulez.bmp
+autoboot 5
+.Ed
+.Pp
+Sets the disk unit of the root device to 2, and then boots. This would
+be needed in the case of a two IDE disks system, with the second IDE
+hardwired to wd2 instead of wd1.
+.Pp
+.Bd -literal -offset indent -compact
+set root_disk_unit=2
+boot /kernel
+.Ed
+.Pp
+See also:
+.Bl -tag -width /usr/share/examples/bootforth/X
+.It Pa /boot/loader.4th
+Extra builtin-like words.
+.It Pa /boot/support.4th
+.Pa loader.conf
+processing words.
+.It Pa /usr/share/examples/bootforth/
+Assorted examples.
+.El
+.Sh ERRORS
+The following values are thrown by
+.Nm :
+.Bl -tag -width XXXXX -offset indent
+.It 100
+Any type of error in the processing of a builtin.
+.It -1
+.Ic Abort
+executed.
+.It -2
+.Ic Abort"
+executed.
+.It -56
+.Ic Quit
+executed.
+.It -256
+Out of interpreting text.
+.It -257
+Need more text to succeed -- will finish on next run.
+.It -258
+.Ic Bye
+executed.
+.It -259
+Unspecified error.
+.El
+.Sh SEE ALSO
+.Xr libstand 3 ,
+.Xr loader.conf 5 ,
+.Xr boot 8 ,
+.Xr btxld 8
+.Sh STANDARDS
+For the purposes of ANS Forth compliance, loader is an
+.Bf Em
+ANS Forth System with Environmental Restrictions, Providing
+.Ef
+.Bf Li
+.No .( ,
+.No :noname ,
+.No ?do ,
+parse, pick, roll, refill, to, value, \e, false, true,
+.No <> ,
+.No 0<> ,
+compile\&, , erase, nip, tuck
+.Ef
+.Em and
+.Li marker
+.Bf Em
+from the Core Extensions word set, Providing the Exception Extensions
+word set, Providing the Locals Extensions word set, Providing the
+Memory-Allocation Extensions word set, Providing
+.Ef
+.Bf Li
+\&.s ,
+bye, forget, see, words,
+\&[if] ,
+\&[else]
+.Ef
+.Em and
+.Li No [then]
+.Bf Em
+from the Programming-Tools extension word set, Providing the
+Search-Order extensions word set.
+.Ef
+.Sh HISTORY
+.Nm
+first appeared in
+.Fx 3.1 .
+.Sh AUTHORS
+.Bl -item
+.It
+.Nm
+was written by
+.An Michael Smith Aq msmisth@freebsd.org .
+.It
+.Tn FICL
+was written by
+.An John Sadler Aq john_sadler@alum.mit.edu .
+.El
+.Sh BUGS
+.Tn FICL
+is case sensitive. Though this is not a standard violation, all Forth
+words are lower cased, which would result in a standard violation. Do
+not rely on this bug.
+.Pp
+The
+.Ic expect
+and
+.Ic accept
+words will read from the input buffer instead of the console. The later
+will be fixed, but the former will not.
+
diff --git a/sys/boot/i386/loader/Makefile b/sys/boot/i386/loader/Makefile
index dcc0e71..7e35ea4 100644
--- a/sys/boot/i386/loader/Makefile
+++ b/sys/boot/i386/loader/Makefile
@@ -1,8 +1,9 @@
-# $Id: Makefile,v 1.29 1999/02/24 01:37:23 msmith Exp $
+# $Id: Makefile,v 1.30 1999/03/10 03:34:14 dcs Exp $
BASE= loader
PROG= ${BASE}
-NOMAN=
+MAN8= loader.8
+#NOMAN=
STRIP=
NEWVERSWHAT= "bootstrap loader"
BINDIR?= /boot
diff --git a/sys/boot/i386/loader/loader.8 b/sys/boot/i386/loader/loader.8
new file mode 100644
index 0000000..32133d8
--- /dev/null
+++ b/sys/boot/i386/loader/loader.8
@@ -0,0 +1,747 @@
+.\" Copyright (c) 1999 Daniel C. Sobral
+.\" 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.
+.\"
+.\" $Id$
+.\"
+.\" Note: The date here should be updated whenever a non-trivial
+.\" change is made to the manual page.
+.Dd March 14, 1999
+.Dt LOADER 8
+.Os
+.Sh NAME
+.Nm loader
+.Nd system bootstrap stage three
+.Sh DESCRIPTION
+The program called
+.Nm
+is the third stage of FreeBSD's three stage bootstrap.
+It is a
+.Pa BTX
+client linked statically to libstand(3) and
+usually located in the directory
+.Pa /boot .
+.Pp
+It provides a scripting language that can be used to
+automate tasks, do pre-configuration or assist in recovery
+procedures. This scripting language is roughly divided in
+two main components. The smaller one is a set of commands
+designed for direct use by the casual user, called "builtin
+commands" for historical reasons. The main drive behind
+these commands is user-friendlyness. The bigger component
+is an
+.Tn ANS
+Forth compatible Forth interpreter based on
+ficl, by
+.An John Sadler .
+.Pp
+During initialization,
+.Nm
+will probe for a console and set the
+.Va console
+variable, or set it to serial console
+.Pq Dq comconsole
+if the previous boot stage used that. Then, devices are probed,
+.Va currdev
+and
+.Va loaddev
+are set, and
+.Va LINES
+is set to 24 . Next,
+.Tn FICL
+is initialized, the builtin words are added to it's vocabulary, and
+.Pa /boot/boot.4th
+will be processed if it exists. No disk switching is possible while
+that file is being read. The inner interpreter
+.Nm
+will use with
+.Tn FICL
+is then set to
+.Ic interpret ,
+which is
+.Tn FICL Ns 's
+default. After that,
+.Pa /boot/loader.rc
+is processed if available, and, failing that,
+.Pa /boot/boot.conf
+will be read for historical reasons. These files are processed
+through the
+.Ic include
+command, which read all of them into memory before processing them,
+making disk changes possible.
+.Pp
+At this point, if an
+.Ic autoboot
+has not been tried, and if
+.Va autoboot_delay
+is not set to
+.Dq NO
+(not case sensitive), then an
+.Ic autoboot
+will be tried. If the system gets past this point,
+.Va prompt
+will be set and
+.Nm
+will engage interactive mode.
+.Sh BUILTIN COMMANDS
+.Nm Loader Ns No 's
+builtin commands take it's parameters from the command line. Presently,
+the only way to call them from a script is by using
+.Pa evaluate
+on a string. If an error condition occurs, an exception will be
+generated, which can be intercepted using
+.Tn ANS
+Forth exception handling
+words. If not intercepted, an error message will be displayed and
+the interpreter's state will be reset, emptying the stack and restoring
+interpreting mode.
+.Pp
+The builtin commands available are:
+.Pp
+.Bl -tag -width Ds -compact -offset indent
+.It Ic autoboot Op Ar seconds
+Proceeds to bootstrap the system after a number of seconds, if not
+interrupted by the user. Displays a countdown prompt warning the
+user the system is about to be booted, unless interrupted by a key
+press. The kernel will be loaded first if necessary. Defaults to
+10 seconds.
+.Pp
+.It Ic bcachestat
+Displays statistics about disk cache usage. For depuration only.
+.Pp
+.It Ic boot
+.It Ic boot Ar kernelname Op Cm ...
+.It Ic boot Fl flag Cm ...
+Immediately proceeds to bootstrap the system, loading the kernel
+if necessary. Any flags or arguments are passed to the kernel, but they
+must precede the kernel name, if a kernel name is provided.
+.Pp
+.It Ic echo Xo
+.Op Fl n
+.Op Aq message
+.Xc
+Displays a text on the screen. A new line will be printed unless
+.Fl n
+is specified.
+.Pp
+.It Ic heap
+Displays memory usage statistics. For debugging purposes only.
+.Pp
+.It Ic help Op topic Op subtopic
+Shows help messages read from
+.Pa /boot/loader.help .
+The special topic
+.Em index
+will list the topics available.
+.Pp
+.It Ic include Ar file Op Ar
+Process script files. Each file is, at a turn, completely read into
+memory, and then have each of it's lines passed to the command line
+interpreter. If any error is returned by the interpreter, the include
+commands aborts immediately, without reading any other files, and
+returns an error itself (see
+.Sx ERRORS ) .
+.Pp
+.It Ic load Xo
+.Op Fl t Ar type
+.Ar file Cm ...
+.Xc
+Loads a kernel, kernel loadable module (kld), or a file of opaque
+contents tagged as being of the type
+.Ar type .
+Kernel and modules can be either in a.out or elf format. Any arguments
+passed after the name of the file to be loaded will be passed as
+arguments to that file. Notice, though, that, at the present, this does
+not work for the kernel.
+.Pp
+.It Ic ls Xo
+.Op Fl l
+.Op Ar path
+.Xc
+Displays a listing of files in the directory
+.Ar path ,
+or the root directory if
+.Ar path
+is not specified. If
+.Fl l
+is specified, file sizes will be shown too.
+.Pp
+.It Ic lsdev Op Fl v
+Lists all of the devices from which it may be possible to load modules. If
+.Fl v
+is specified, more details are printed.
+.Pp
+.It Ic lsmod Op Fl v
+Displays loaded modules. If
+.Fl v
+is specified, more details are shown.
+.Pp
+.It Ic more Ar file Op Ar
+Display the files specified, with a pause at each
+.Va LINES
+displayed.
+.Pp
+.It Ic pnpscan Op Fl v
+Scans for Plug-and-Play devices. This is not functional at the present.
+.Pp
+.It Ic read Xo
+.Op Fl t Ar seconds
+.Op Fl p Ar prompt
+.Op Va variable
+.Xc
+Reads a line of input from the terminal, storing it in
+.Va variable
+if specified. A timeout can be specified with
+.Fl t ,
+though it will be canceled at the first key pressed. A prompt may
+also be displayed through the
+.Fl p
+flag.
+.Pp
+.It Ic reboot
+Immediately reboots the system.
+.Pp
+.It Ic set Ar variable
+.It Ic set Ar variable Ns = Ns Ar value
+Set loader's environment variables.
+.Pp
+.It Ic show Op Va variable
+Displays the specified variable's value, or all variables and their
+values if
+.Va variable
+is not specified.
+.Pp
+.It Ic unload
+Remove all modules from memory.
+.Pp
+.It Ic unset Va variable
+Removes
+.Va variable
+from the environment.
+.Pp
+.It Ic \&?
+Same as
+.Dq help index .
+.Pp
+.El
+.Ss BUILTIN ENVIRONMENT VARIABLES
+The
+.Nm
+has actually two different kinds of
+.Sq environment
+variables. There are ANS Forth's
+.Em environmental queries ,
+and a separate space of environment variables used by builtins, which
+are not directly available to Forth words. It is the later ones that
+this session covers.
+.Pp
+Environment variables can be set and unset through the use of the
+.Ic set
+and
+.Ic unset
+builtins, and have their value interactively examined through the
+use of the
+.Ic show
+builtin. Their values can also be accessed as described in
+.Sx BUILTIN PARSER .
+.Pp
+Notice that this environment variables are not inherited by any shell
+after the system has been booted.
+.Pp
+A few variables are set automatically by
+.Nm .
+Others can affect either
+.Nm
+or kernel's behavior at boot. While some of these may require a value,
+others define behavior just by being set. These are described below.
+.Bl -tag -width bootfile -offset indent
+.It Va autoboot_delay
+Number of seconds
+.Ic autoboot
+will wait before booting. If this variable is not defined,
+.Ic autoboot
+will default to 10 seconds.
+.Pp
+If set to
+.Dq NO ,
+no
+.Ic autoboot
+will be automatically attempted after processing
+.Pa /boot/loader.rc ,
+though explict
+.Ic autoboot Ns 's
+will be processed normally, defaulting to 10 seconds delay.
+.It Va boot_askname
+Instructs the kernel to prompt the user for the name of the root device
+when the kernel is booted.
+.It Va boot_ddb
+Instructs the kernel to start in the DDB debugger, rather than
+proceeding to initialise when booted.
+.It Va boot_gdb
+Selects gdb-remote mode for the kernel debugger by default.
+.It Va boot_single
+Prevents the kernel from initiating a multi-user startup, single-user
+mode will be entered when the kernel has finished device probes.
+.It Va boot_userconfig
+Requests that the kernel's interactive device configuration program
+be run when the kernel is booted.
+.It Va boot_verbose
+Setting this variable causes extra debugging information to be printed
+by the kernel during the boot phase.
+.It Va bootfile
+List of semicolon-separated search path for bootable kernels. The default
+is
+.Li Dq kernel;kernel.old .
+.It Va console
+Defines the current console.
+.It Va currdev
+Selects the default device. Syntax for devices is odd.
+.It Va interpret
+Has the value
+.Li Dq ok
+if the Forth's current state is interpreting.
+.It Va LINES
+Define the number of lines on the screen, to be used by the pager.
+.It Va module_path
+Sets the list of directories which will be searched in for modules
+named in a load command or implicitly required by a dependancy. The
+default value for this variable is
+.Li Dq /;/boot;/modules .
+.It Va num_ide_disks
+Sets the number of IDE disks as a work around for some problems in
+finding the root disk at boot. This has been deprecated in favour of
+.Va root_disk_unit .
+.It Va prompt
+Value of
+.Nm Ns No 's
+prompt. Defaults to
+.Li Dq "${currdev}>" .
+.It Va root_disk_unit
+If the code which detects the disk unit number for the root disk is
+confused, eg. by a mix of SCSI and IDE disks, or IDE disks with
+gaps in the sequence (eg. no primary slave), the unit number can
+be forced by setting this variable.
+.It Va rootdev
+By default the value of
+.Va currdev
+is used to set the root filesystem
+when the kernel is booted. This can be overridden by setting
+.Va rootdev
+explicitly.
+.El
+.Pp
+Other variables are used to override kernel tunnable parameters.
+The following tunables are available:
+.Bl -tag -width Va -offset indent
+.It Va kern.ipc.nmbclusters
+Set the number of mbuf clusters to be allocated. The value
+cannot be set below the default determined when the kernel
+was compiled. Modifies
+.Va NMBCLUSTERS .
+.It Va kern.vm.kmem.size
+Sets the size of kernel memory (bytes). This overrides
+completely the value determined when the kernel was
+compiled. Modifies
+.Va VM_KMEM_SIZE .
+.It Va machdep.pccard.pcic_irq
+Overrides the IRQ normally assigned to a PCCARD controller.
+Typically the first available interrupt will be allocated,
+which may conflict with other hardware. If this value is
+set to 0, an interrupt will not be assigned and the
+controller will operate in polled mode only.
+.It Va net.inet.tcp.tcbhashsize
+Overrides the compile-time set value of
+.Va TCBHASHSIZE
+or the preset default of 512. Must be a power of 2.
+.El
+.Ss BUILTIN PARSER
+When a builtin command is executed, the rest of the line is taken
+by it as arguments, and it's processed by a special parser which
+is not used for regular Forth commands.
+.Pp
+This special parser applies the following rules to the parsed text:
+.Pp
+.Bl -enum
+.It
+All backslash characters are preprocessed.
+.Bl -bullet
+.It
+\eb , \ef , \er , \en and \et are processed as by C's
+.fn printf() .
+.It
+\es is converted to a space.
+.It
+\ev is converted to
+.Tn ASCII
+11.
+.It
+\ez is just skipped.
+.It
+\eN and \eNN are replaced by the hex N or NN.
+.It
+\eNNN is replaced by the octal NNN
+.Tn ASCII
+character.
+.It
+\e" , \e' and \e$ will escape these characters, preventing them from
+receiving special semantics on the step 2 described below.
+.It
+\e\e will be replaced with a single \e .
+.It
+In any other occurance, backslash will just be removed.
+.El
+.It
+Every string between non-escaped quotes or double-quotes will be treated
+as a single word for the purposes of the remaining steps.
+.It
+Replace any
+.Li $VARIABLE
+or
+.Li ${VARIABLE}
+with the value of the environemnt variable
+.Va VARIABLE .
+.It
+Passes multiple space-delimited arguments to the builtin command called.
+Spaces can also be escaped through the use of \e\e .
+.El
+.Pp
+An exception to this parsing rule exists, and is described in
+.Sx BUILTINS AND FORTH .
+.Ss BUILTINS AND FORTH
+All builtin words are state-smart, immediate words. If interpreted, they
+behave exactly as described previously. If they are compiled, though,
+they extract their arguments from the stack instead of the command line.
+.Pp
+If compiled, the builtin words expect to find, at execution time, the
+following parameters on the stack:
+.D1 Ar addrN lenN ... addr2 len2 addr1 len1 N
+where
+.Ar addrX lenX
+are strings which will compose the command line that will be parsed
+into the builtin's arguments. Internally, these strings are
+concatenated in from 1 to N, with a space put between each one.
+.Pp
+If no arguments are passed, a 0
+.Em must
+be passed, even if the builtin accepts no arguments.
+.Pp
+While this behavior has benefits, it has it's trade-offs. If the
+execution token of a builtin is acquired (through
+.Ic No '
+or
+.Ic No ['] ) ,
+and then passed to
+.Ic catch
+or
+.Ic execute ,
+the builtin behavior will depend on the system state
+.Bf Em
+at the time
+.Ic catch
+or
+.Ic execute
+is processed
+.Ef
+\&! This is particular annoying for programs that want or need to
+treat exceptions. In this case, it is recommended the use of a proxy.
+For example:
+.Dl : (boot) boot ;
+.Sh FICL
+.Tn FICL
+is a Forth interpreter written in C, in the form of a forth
+virtual machine library that can be called by C functions and vice
+versa.
+.Pp
+In
+.Nm ,
+each line read interactively is then fed to
+.Tn FICL ,
+which may call
+.Nm
+back to execute the builtin words. The builtin
+.Ic include
+will also feed
+.Tn FICL ,
+one line at a time.
+.Pp
+The words available to
+.Tn FICL
+can be classified in four groups. The
+.Tn ANS
+Forth standard words, extra
+.Tn FICL
+words, extra
+.Os
+words, and the builtin commands. The later were already described. The
+.Tn ANS
+Forth standard words are listed in the
+.Sx STANDARDS
+section. The words falling in the two other groups are described in the
+following subsections.
+.Ss FICL EXTRA WORDS
+.Bl -tag -width wid-set-super -offset indent
+.It Ic .env
+.It Ic .ver
+.It Ic -roll
+.It Ic 2constant
+.It Ic >name
+.It Ic body>
+.It Ic compare
+This the STRING word set's
+.Ic compare .
+.It Ic compile-only
+.It Ic endif
+.It Ic forget-wid
+.It Ic parse-word
+.It Ic sliteral
+This is the STRING word set's
+.Ic sliteral .
+.It Ic wid-set-super
+.It Ic w@
+.It Ic w!
+.It Ic x.
+.It Ic empty
+.It Ic cell-
+.It Ic -rot
+.El
+.Ss FREEBSD EXTRA WORDS
+.Bl -tag -width XXXXXXX -offset indent
+.It Ic tib> Pq -- Ar addr len
+Returns the remainder of the input buffer as a string on the stack.
+.It Ic \&% Pq --
+Evaluates the remainder of the input buffer under a
+.Ic catch
+exception guard.
+.It Ic \&$ Pq --
+Evaluates the remainder of the input buffer, after having printed it first.
+.It Ic fopen Pq Ar addr len -- fd
+Open a file. Returns a file descriptor, or -1 in case of failure.
+.It Ic fclose Pq Ar fd --
+Closes a file.
+.It Xo
+.Ic fread
+.Pq Ar fd addr len -- len'
+.Xc
+Tries to read
+.Em len
+bytes from file
+.Em fd
+into buffer
+.Em addr .
+Returns the actual number of bytes read, or -1 in case of error or end of
+file.
+.It Ic fload Pq Ar fd --
+Process file
+.Em fd .
+.It Ic fkey Pq Ar fd -- char
+Reads a single character from a file.
+.It Ic key Pq -- Ar char
+Reads a single character from the console.
+.It Ic key? Pq -- Ar flag
+Returns
+.Ic true
+if there is a character available to be read from the console.
+.It Ic ms Pq Ar u --
+Waits
+.Em u
+microseconds.
+.It Ic seconds Pq -- Ar u
+Returns the number of seconds since midnight.
+.It Ic trace! Pq Ar flag --
+Activates or deactivates tracing. Does not work with
+.Ic catch .
+.It Ic outb Pq Ar port char --
+Writes a byte to a port.
+.It Ic inb Pq Ar port -- char
+Reads a byte from a port.
+.El
+.Ss FREEBSD DEFINED ENVIRONMENTAL QUERIES
+.Bl -tag -width Ds -offset indent
+.It arch-i386
+.Ic TRUE
+if the architecture is IA32.
+.It arch-alpha
+.Ic TRUE
+if the architecture is AXP.
+.It FreeBSD_version
+.Fx
+version at compile time.
+.It loader_version
+.Nm
+version.
+.El
+.Ss SYSTEM DOCUMENTATION
+.Sh FILES
+.Bl -tag -width /dev/loader.helpX -compact
+.It Pa /boot/loader
+.Nm
+itself.
+.It Pa /boot/boot.4th
+Additional
+.Tn FICL
+initialization.
+.It Pa /boot/boot.conf
+.Nm
+bootstrapping script. Deprecated.
+.It Pa /boot/loader.rc
+.Nm
+bootstrapping script.
+.It Pa /boot/loader.help
+Loaded by
+.Ic help .
+Contains the help messages.
+.El
+.Sh EXAMPLES
+Boot in single user mode:
+.Pp
+.Dl boot -s
+.Pp
+Loads kernel's user configuration file. Notice that a kernel must be
+loaded before any other
+.Ic load
+command is attempted.
+.Pp
+.Bd -literal -offset indent -compact
+load kernel
+load -t userconfig_script /boot/kernel.conf
+.Ed
+.Pp
+Loads the kernel, a splash screen, and then autoboots in five seconds.
+.Pp
+.Bd -literal -offset indent -compact
+load kernel
+load splash_bmp
+load -t splash_image_data /boot/chuckrulez.bmp
+autoboot 5
+.Ed
+.Pp
+Sets the disk unit of the root device to 2, and then boots. This would
+be needed in the case of a two IDE disks system, with the second IDE
+hardwired to wd2 instead of wd1.
+.Pp
+.Bd -literal -offset indent -compact
+set root_disk_unit=2
+boot /kernel
+.Ed
+.Pp
+See also:
+.Bl -tag -width /usr/share/examples/bootforth/X
+.It Pa /boot/loader.4th
+Extra builtin-like words.
+.It Pa /boot/support.4th
+.Pa loader.conf
+processing words.
+.It Pa /usr/share/examples/bootforth/
+Assorted examples.
+.El
+.Sh ERRORS
+The following values are thrown by
+.Nm :
+.Bl -tag -width XXXXX -offset indent
+.It 100
+Any type of error in the processing of a builtin.
+.It -1
+.Ic Abort
+executed.
+.It -2
+.Ic Abort"
+executed.
+.It -56
+.Ic Quit
+executed.
+.It -256
+Out of interpreting text.
+.It -257
+Need more text to succeed -- will finish on next run.
+.It -258
+.Ic Bye
+executed.
+.It -259
+Unspecified error.
+.El
+.Sh SEE ALSO
+.Xr libstand 3 ,
+.Xr loader.conf 5 ,
+.Xr boot 8 ,
+.Xr btxld 8
+.Sh STANDARDS
+For the purposes of ANS Forth compliance, loader is an
+.Bf Em
+ANS Forth System with Environmental Restrictions, Providing
+.Ef
+.Bf Li
+.No .( ,
+.No :noname ,
+.No ?do ,
+parse, pick, roll, refill, to, value, \e, false, true,
+.No <> ,
+.No 0<> ,
+compile\&, , erase, nip, tuck
+.Ef
+.Em and
+.Li marker
+.Bf Em
+from the Core Extensions word set, Providing the Exception Extensions
+word set, Providing the Locals Extensions word set, Providing the
+Memory-Allocation Extensions word set, Providing
+.Ef
+.Bf Li
+\&.s ,
+bye, forget, see, words,
+\&[if] ,
+\&[else]
+.Ef
+.Em and
+.Li No [then]
+.Bf Em
+from the Programming-Tools extension word set, Providing the
+Search-Order extensions word set.
+.Ef
+.Sh HISTORY
+.Nm
+first appeared in
+.Fx 3.1 .
+.Sh AUTHORS
+.Bl -item
+.It
+.Nm
+was written by
+.An Michael Smith Aq msmisth@freebsd.org .
+.It
+.Tn FICL
+was written by
+.An John Sadler Aq john_sadler@alum.mit.edu .
+.El
+.Sh BUGS
+.Tn FICL
+is case sensitive. Though this is not a standard violation, all Forth
+words are lower cased, which would result in a standard violation. Do
+not rely on this bug.
+.Pp
+The
+.Ic expect
+and
+.Ic accept
+words will read from the input buffer instead of the console. The later
+will be fixed, but the former will not.
+
OpenPOWER on IntegriCloud