summaryrefslogtreecommitdiffstats
path: root/sys/boot/forth/loader.4th
diff options
context:
space:
mode:
authordcs <dcs@FreeBSD.org>2000-06-07 22:10:05 +0000
committerdcs <dcs@FreeBSD.org>2000-06-07 22:10:05 +0000
commit7da86fa04ce770ab0d2c00d8afee7af6ae97106e (patch)
treeac4362994a1e1cb45151d95239996aaa299b53de /sys/boot/forth/loader.4th
parent198c5499e5d891bd8618197150f6ced4a4ba6b28 (diff)
downloadFreeBSD-src-7da86fa04ce770ab0d2c00d8afee7af6ae97106e.zip
FreeBSD-src-7da86fa04ce770ab0d2c00d8afee7af6ae97106e.tar.gz
Modify boot-conf so it can take a kernel or directory name as
a parameter and dtrt. Also, make boot-conf always unload first. There wasn't really any point in not doing this, as the kernel _has_ to be loaded before any other modules. Tested by: dwhite
Diffstat (limited to 'sys/boot/forth/loader.4th')
-rw-r--r--sys/boot/forth/loader.4th126
1 files changed, 122 insertions, 4 deletions
diff --git a/sys/boot/forth/loader.4th b/sys/boot/forth/loader.4th
index 132633a..1ea36ba 100644
--- a/sys/boot/forth/loader.4th
+++ b/sys/boot/forth/loader.4th
@@ -32,12 +32,130 @@ only forth definitions also support-functions
\
\ Prepares to boot as specified by loaded configuration files.
-: boot-conf
- load_kernel
- load_modules
- 0 autoboot
+also support-functions definitions
+
+: bootpath s" /boot/" ;
+: modulepath s" module_path" ;
+: saveenv ( addr len | 0 -1 -- addr' len | 0 -1 )
+ dup -1 = if exit then
+ dup allocate abort" Out of memory"
+ swap 2dup 2>r
+ move
+ 2r>
+;
+: freeenv ( addr len | 0 -1 )
+ -1 = if drop else free abort" Freeing error" then
+;
+: restoreenv ( addr len | 0 -1 -- )
+ dup -1 = if ( it wasn't set )
+ 2drop
+ modulepath unsetenv
+ else
+ over >r
+ modulepath setenv
+ r> free abort" Freeing error"
+ then
+;
+
+only forth also support-functions also builtins definitions
+
+: boot-conf ( args 1 | 0 "args" -- flag )
+ 0 1 unload drop
+
+ 0= if ( interpreted )
+ \ Get next word on the command line
+ bl word count
+ ?dup 0= if ( there wasn't anything )
+ drop 0
+ else ( put in the number of strings )
+ 1
+ then
+ then ( interpreted )
+
+ if ( there are arguments )
+ \ Try to load the kernel
+ s" kernel_options" getenv dup -1 = if drop 2dup 1 else 2over 2 then
+
+ 1 load if ( load command failed )
+ \ Remove garbage from the stack
+
+ \ Set the environment variable module_path, and try loading
+ \ the kernel again.
+
+ \ First, save module_path value
+ modulepath getenv saveenv dup -1 = if 0 swap then 2>r
+
+ \ Sets the new value
+ 2dup modulepath setenv
+
+ \ Try to load the kernel
+ s" load ${kernel} ${kernel_options}" ['] evaluate catch
+ if ( load failed yet again )
+ \ Remove garbage from the stack
+ 2drop
+
+ \ Try prepending /boot/
+ bootpath 2over nip over + allocate
+ if ( out of memory )
+ 2drop 2drop
+ 2r> restoreenv
+ 100 exit
+ then
+
+ 0 2swap strcat 2swap strcat
+ 2dup modulepath setenv
+
+ drop free if ( freeing memory error )
+ 2drop
+ 2r> restoreenv
+ 100 exit
+ then
+
+ \ Now, once more, try to load the kernel
+ s" load ${kernel} ${kernel_options}" ['] evaluate catch
+ if ( failed once more )
+ 2drop
+ 2r> restoreenv
+ 100 exit
+ then
+
+ else ( we found the kernel on the path passed )
+
+ 2drop ( discard command line arguments )
+
+ then ( could not load kernel from directory passed )
+
+ \ Load the remaining modules, if the kernel was loaded at all
+ ['] load_modules catch if 2r> restoreenv 100 exit then
+
+ \ Call autoboot to perform the booting
+ 0 1 autoboot
+
+ \ Keep new module_path
+ 2r> freeenv
+
+ exit
+ then ( could not load kernel with name passed )
+
+ 2drop ( discard command line arguments )
+
+ else ( try just a straight-forward kernel load )
+ s" load ${kernel} ${kernel_options}" ['] evaluate catch
+ if ( kernel load failed ) 2drop 100 exit then
+
+ then ( there are command line arguments )
+
+ \ Load the remaining modules, if the kernel was loaded at all
+ ['] load_modules catch if 100 exit then
+
+ \ Call autoboot to perform the booting
+ 0 1 autoboot
;
+also forth definitions
+builtin: boot-conf
+only forth definitions also support-functions
+
\ ***** check-password
\
\ If a password was defined, execute autoboot and ask for
OpenPOWER on IntegriCloud