loader.4th revision 65630
1\ Copyright (c) 1999 Daniel C. Sobral <dcs@freebsd.org>
2\ All rights reserved.
3\
4\ Redistribution and use in source and binary forms, with or without
5\ modification, are permitted provided that the following conditions
6\ are met:
7\ 1. Redistributions of source code must retain the above copyright
8\    notice, this list of conditions and the following disclaimer.
9\ 2. Redistributions in binary form must reproduce the above copyright
10\    notice, this list of conditions and the following disclaimer in the
11\    documentation and/or other materials provided with the distribution.
12\
13\ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14\ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15\ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16\ ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17\ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18\ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19\ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20\ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21\ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22\ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23\ SUCH DAMAGE.
24\
25\ $FreeBSD: head/sys/boot/forth/loader.4th 65630 2000-09-09 04:52:34Z dcs $
26
27s" arch-alpha" environment? [if] [if]
28	s" loader_version" environment?  [if]
29		3 < [if]
30			.( Loader version 0.3+ required) cr
31			abort
32		[then]
33	[else]
34		.( Could not get loader version!) cr
35		abort
36	[then]
37[then] [then]
38
39s" arch-i386" environment? [if] [if]
40	s" loader_version" environment?  [if]
41		8 < [if]
42			.( Loader version 0.8+ required) cr
43			abort
44		[then]
45	[else]
46		.( Could not get loader version!) cr
47		abort
48	[then]
49[then] [then]
50
51include /boot/support.4th
52
53only forth definitions also support-functions
54
55\ ***** boot-conf
56\
57\	Prepares to boot as specified by loaded configuration files.
58
59also support-functions definitions
60
61: set-tempoptions  ( addrN lenN ... addr1 len1 N -- addr len 1 | 0 )
62  \ No options, set the default ones
63  dup 0= if
64    s" kernel_options" getenv dup -1 = if
65      drop
66    else
67      s" temp_options" setenv
68    then
69    exit
70  then
71
72  \ Skip filename
73  2 pick
74  c@
75  [char] - <> if
76    swap >r swap >r
77    1 >r  \ Filename present
78    1 -   \ One less argument
79  else
80    0 >r  \ Filename not present
81  then
82
83  \ If no other arguments exist, use default options
84  ?dup 0= if
85    s" kernel_options" getenv dup -1 = if
86      drop
87    else
88      s" temp_options" setenv
89    then
90    \ Put filename back on the stack, if necessary
91    r> if r> r> 1 else 0 then
92    exit
93  then
94
95  \ Concatenate remaining arguments into a single string
96  >r strdup r>
97  1 ?do
98    \ Allocate new buffer
99    2over nip over + 1+
100    allocate if out_of_memory throw then
101    \ Copy old buffer over
102    0 2swap over >r strcat
103    \ Free old buffer
104    r> free if free_error throw then
105    \ Copy a space
106    s"  " strcat
107    \ Copy next string (do not free)
108    2swap strcat
109  loop
110
111  \ Set temp_options variable, free whatever memory that needs freeing
112  over >r
113  s" temp_options" setenv
114  r> free if free_error throw then
115
116  \ Put filename back on the stack, if necessary
117  r> if r> r> 1 else 0 then
118;
119
120: get-arguments ( -- addrN lenN ... addr1 len1 N )
121  0
122  begin
123    \ Get next word on the command line
124    parse-word
125  ?dup while
126    2>r ( push to the rstack, so we can retrieve in the correct order )
127    1+
128  repeat
129  drop ( empty string )
130  dup
131  begin
132    dup
133  while
134    2r> rot
135    >r rot r>
136    1 -
137  repeat
138  drop
139;
140
141also builtins
142
143: load-conf  ( args 1 | 0 "args" -- flag )
144  0= if ( interpreted ) get-arguments then
145  set-tempoptions
146  s" temp_options" getenv -1 <> if 2swap 2 else 1 then
147  load_kernel_and_modules
148;
149
150only forth also support-functions also builtins definitions
151
152: boot
153  \ Unload only if a path was passed
154  >in @ parse-word rot >in !
155  if
156    c@ [char] - <> if
157      0 1 unload drop
158    else
159      get-arguments 1 boot exit
160    then
161  else
162    0 1 boot exit
163  then
164  load-conf
165  ?dup 0= if 0 1 boot then
166;
167
168: boot-conf
169  0 1 unload drop
170  load-conf
171  ?dup 0= if 0 1 autoboot then
172;
173
174also forth definitions also builtins
175builtin: boot
176builtin: boot-conf
177only forth definitions also support-functions
178
179\ ***** check-password
180\
181\	If a password was defined, execute autoboot and ask for
182\	password if autoboot returns.
183
184: check-password
185  password .addr @ if
186    0 autoboot
187    false >r
188    begin
189      bell emit bell emit
190      ." Password: "
191      password .len @ read-password
192      dup password .len @ = if
193        2dup password .addr @ password .len @
194        compare 0= if r> drop true >r then
195      then
196      drop free drop
197      r@
198    until
199    r> drop
200  then
201;
202
203\ ***** start
204\
205\       Initializes support.4th global variables, sets loader_conf_files,
206\       process conf files, and, if any one such file was succesfully
207\       read to the end, load kernel and modules.
208
209: start  ( -- ) ( throws: abort & user-defined )
210  s" /boot/defaults/loader.conf" initialize
211  include_conf_files
212  \ Will *NOT* try to load kernel and modules if no configuration file
213  \ was succesfully loaded!
214  any_conf_read? if
215    load_kernel
216    load_modules
217  then
218;
219
220\ ***** initialize
221\
222\	Overrides support.4th initialization word with one that does
223\	everything start one does, short of loading the kernel and
224\	modules. Returns a flag
225
226: initialize ( -- flag )
227  s" /boot/defaults/loader.conf" initialize
228  include_conf_files
229  any_conf_read?
230;
231
232\ ***** read-conf
233\
234\	Read a configuration file, whose name was specified on the command
235\	line, if interpreted, or given on the stack, if compiled in.
236
237: (read-conf)  ( addr len -- )
238  conf_files .addr @ ?dup if free abort" Fatal error freeing memory" then
239  strdup conf_files .len ! conf_files .addr !
240  include_conf_files \ Will recurse on new loader_conf_files definitions
241;
242
243: read-conf  ( <filename> | addr len -- ) ( throws: abort & user-defined )
244  state @ if
245    \ Compiling
246    postpone (read-conf)
247  else
248    \ Interpreting
249    bl parse (read-conf)
250  then
251; immediate
252
253\ ***** enable-module
254\
255\       Turn a module loading on.
256
257: enable-module ( <module> -- )
258  bl parse module_options @ >r
259  begin
260    r@
261  while
262    2dup
263    r@ module.name dup .addr @ swap .len @
264    compare 0= if
265      2drop
266      r@ module.name dup .addr @ swap .len @ type
267      true r> module.flag !
268      ."  will be loaded." cr
269      exit
270    then
271    r> module.next @ >r
272  repeat
273  r> drop
274  type ."  wasn't found." cr
275;
276
277\ ***** disable-module
278\
279\       Turn a module loading off.
280
281: disable-module ( <module> -- )
282  bl parse module_options @ >r
283  begin
284    r@
285  while
286    2dup
287    r@ module.name dup .addr @ swap .len @
288    compare 0= if
289      2drop
290      r@ module.name dup .addr @ swap .len @ type
291      false r> module.flag !
292      ."  will not be loaded." cr
293      exit
294    then
295    r> module.next @ >r
296  repeat
297  r> drop
298  type ."  wasn't found." cr
299;
300
301\ ***** toggle-module
302\
303\       Turn a module loading on/off.
304
305: toggle-module ( <module> -- )
306  bl parse module_options @ >r
307  begin
308    r@
309  while
310    2dup
311    r@ module.name dup .addr @ swap .len @
312    compare 0= if
313      2drop
314      r@ module.name dup .addr @ swap .len @ type
315      r@ module.flag @ 0= dup r> module.flag !
316      if
317        ."  will be loaded." cr
318      else
319        ."  will not be loaded." cr
320      then
321      exit
322    then
323    r> module.next @ >r
324  repeat
325  r> drop
326  type ."  wasn't found." cr
327;
328
329\ ***** show-module
330\
331\	Show loading information about a module.
332
333: show-module ( <module> -- )
334  bl parse module_options @ >r
335  begin
336    r@
337  while
338    2dup
339    r@ module.name dup .addr @ swap .len @
340    compare 0= if
341      2drop
342      ." Name: " r@ module.name dup .addr @ swap .len @ type cr
343      ." Path: " r@ module.loadname dup .addr @ swap .len @ type cr
344      ." Type: " r@ module.type dup .addr @ swap .len @ type cr
345      ." Flags: " r@ module.args dup .addr @ swap .len @ type cr
346      ." Before load: " r@ module.beforeload dup .addr @ swap .len @ type cr
347      ." After load: " r@ module.afterload dup .addr @ swap .len @ type cr
348      ." Error: " r@ module.loaderror dup .addr @ swap .len @ type cr
349      ." Status: " r> module.flag @ if ." Load" else ." Don't load" then cr
350      exit
351    then
352    r> module.next @ >r
353  repeat
354  r> drop
355  type ."  wasn't found." cr
356;
357
358\ Words to be used inside configuration files
359
360: retry false ;         \ For use in load error commands
361: ignore true ;         \ For use in load error commands
362
363\ Return to strict forth vocabulary
364
365only forth also
366
367