1 \ Copyright (c) 1999 Daniel C. Sobral <dcs@FreeBSD.org>
2 \ Copyright (c) 2011-2015 Devin Teske <dteske@FreeBSD.org>
5 \ Redistribution and use in source and binary forms, with or without
6 \ modification, are permitted provided that the following conditions
8 \ 1. Redistributions of source code must retain the above copyright
9 \ notice, this list of conditions and the following disclaimer.
10 \ 2. Redistributions in binary form must reproduce the above copyright
11 \ notice, this list of conditions and the following disclaimer in the
12 \ documentation and/or other materials provided with the distribution.
14 \ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 \ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 \ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 \ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 \ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 \ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 \ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 \ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 \ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 \ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 only forth definitions
30 \ provide u> if needed
31 s" u>" sfind [if] drop [else]
34 2dup u< if 2drop 0 exit then
35 swap u< if -1 exit then
40 \ provide xemit if needed
41 s" xemit" sfind [if] drop [else]
44 dup 0x80 u< if emit exit then
47 2/ >r dup 0x3F and 0x80 or swap 6 rshift r>
49 begin dup 0x80 u< 0= while emit repeat drop
53 s" arch-i386" environment? [if] [if]
54 s" loader_version" environment? [if]
56 .( Loader version 1.1+ required) cr
60 .( Could not get loader version!) cr
65 256 dictthreshold ! \ 256 cells minimum free space
66 2048 dictincrease ! \ 2048 additional cells each time
68 include /boot/support.4th
69 include /boot/color.4th
70 include /boot/delay.4th
71 include /boot/check-password.4th
73 only forth definitions
76 loader_color? dup ( -- bool bool )
84 \ menu-unset may not be present
85 s" beastie_disable" getenv
87 s" YES" compare-insensitive 0= if
107 only forth also support-functions also builtins definitions
110 0= if ( interpreted ) get_arguments then
112 \ Unload only if a path was passed
118 s" kernelname" getenv? if ( a kernel has been loaded )
122 load_kernel_and_modules
125 bootmsg 0 1 boot exit
128 s" kernelname" getenv? if ( a kernel has been loaded )
132 load_kernel_and_modules
135 bootmsg 0 1 boot exit
137 load_kernel_and_modules
138 ?dup 0= if bootmsg 0 1 boot then
143 \ Prepares to boot as specified by loaded configuration files.
146 0= if ( interpreted ) get_arguments then
148 load_kernel_and_modules
149 ?dup 0= if 0 1 autoboot then
152 also forth definitions previous
157 only forth definitions also support-functions
161 \ Initializes support.4th global variables, sets loader_conf_files,
162 \ processes conf files, and, if any one such file was successfully
163 \ read to the end, loads kernel and modules.
165 : start ( -- ) ( throws: abort & user-defined )
166 s" /boot/defaults/loader.conf" initialize
168 include_nextboot_file
169 \ If the user defined a post-initialize hook, call it now
170 s" post-initialize" sfind if execute else drop then
171 \ Will *NOT* try to load kernel and modules if no configuration file
172 \ was successfully loaded!
174 s" loader_delay" getenv -1 = if
180 ." Loading Kernel and Modules (Ctrl-C to Abort)" cr
181 s" also support-functions" evaluate
182 s" set delay_command='load_xen_throw load_kernel load_modules'" evaluate
183 s" set delay_showdots" evaluate
191 \ Overrides support.4th initialization word with one that does
192 \ everything start one does, short of loading the kernel and
193 \ modules. Returns a flag.
195 : initialize ( -- flag )
196 s" /boot/defaults/loader.conf" initialize
198 include_nextboot_file
199 \ If the user defined a post-initialize hook, call it now
200 s" post-initialize" sfind if execute else drop then
206 \ Read a configuration file, whose name was specified on the command
207 \ line, if interpreted, or given on the stack, if compiled in.
209 : (read-conf) ( addr len -- )
211 include_conf_files \ Will recurse on new loader_conf_files definitions
214 : read-conf ( <filename> | addr len -- ) ( throws: abort & user-defined )
224 \ show, enable, disable, toggle module loading. They all take module from
227 : set-module-flag ( module_addr val -- ) \ set and print flag
229 dup module.name strtype
230 module.flag @ if ." will be loaded" else ." will not be loaded" then cr
233 : enable-module find-module ?dup if true set-module-flag then ;
235 : disable-module find-module ?dup if false set-module-flag then ;
237 : toggle-module find-module ?dup if dup module.flag @ 0= set-module-flag then ;
241 \ Show loading information about a module.
243 : show-module ( <module> -- ) find-module ?dup if show-one-module then ;
245 \ Words to be used inside configuration files
247 : retry false ; \ For use in load error commands
248 : ignore true ; \ For use in load error commands
250 \ Return to strict forth vocabulary
258 : .? 2 spaces 2swap 15 #type 2 spaces type cr ;
260 \ Execute the ? command to print all the commands defined in
261 \ C, then list the ones we support here. Please note that this
262 \ doesn't use pager_* routines that the C implementation of ?
263 \ does, so these will always appear, even if you stop early
264 \ there. And they may cause the commands to scroll off the
265 \ screen if the number of commands modulus LINES is close
269 s" boot-conf" s" load kernel and modules, then autoboot" .?
270 s" read-conf" s" read a configuration file" .?
271 s" enable-module" s" enable loading of a module" .?
272 s" disable-module" s" disable loading of a module" .?
273 s" toggle-module" s" toggle loading of a module" .?
274 s" show-module" s" show module load data" .?
275 s" try-include" s" try to load/interpret files" .?
278 : try-include ( -- ) \ see loader.4th(8)
279 ['] include ( -- xt ) \ get the execution token of `include'
280 catch ( xt -- exception# | 0 ) if \ failed
281 LF parse ( c -- s-addr/u ) 2drop \ advance >in to EOL (drop data)
282 \ ... prevents words unused by `include' from being interpreted
284 ; immediate \ interpret immediately for access to `source' (aka tib)
286 only forth definitions