summaryrefslogtreecommitdiffstats
path: root/sys/boot/forth/loader.4th
diff options
context:
space:
mode:
Diffstat (limited to 'sys/boot/forth/loader.4th')
-rw-r--r--sys/boot/forth/loader.4th126
1 files changed, 14 insertions, 112 deletions
diff --git a/sys/boot/forth/loader.4th b/sys/boot/forth/loader.4th
index ef956e8..7a4dbcd 100644
--- a/sys/boot/forth/loader.4th
+++ b/sys/boot/forth/loader.4th
@@ -58,32 +58,6 @@ only forth definitions also support-functions
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
-;
-
: set-tempoptions ( addrN lenN ... addr1 len1 N -- addr len 1 | 0 )
\ No options, set the default ones
dup 0= if
@@ -166,105 +140,33 @@ also support-functions definitions
also builtins
-: load-kernel ( addr len -- addr len error? )
- s" temp_options" getenv dup -1 = if
- drop 2dup 1
- else
- 2over 2
- then
-
- 1 load
-;
-
: load-conf ( args 1 | 0 "args" -- flag )
- 0 1 unload drop
-
0= if ( interpreted ) get-arguments then
set-tempoptions
-
- if ( there are arguments )
- load-kernel if ( load command failed )
- \ 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} ${temp_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} ${temp_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
-
- \ Return 0 to indicate success
- 0
-
- \ 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} ${temp_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
-
- \ Return 0 to indicate success
- 0
+ s" temp_options" getenv -1 <> if 2swap 2 else 1 then
+ load_kernel_and_modules
;
only forth also support-functions also builtins definitions
: boot
+ \ Unload only if a path was passed
+ >in @ parse-word rot >in !
+ if
+ c@ [char] - <> if
+ 0 1 unload drop
+ else
+ get-arguments 1 boot exit
+ then
+ else
+ 0 1 boot exit
+ then
load-conf
?dup 0= if 0 1 boot then
;
: boot-conf
+ 0 1 unload drop
load-conf
?dup 0= if 0 1 autoboot then
;
OpenPOWER on IntegriCloud