xref: /illumos-gate/usr/src/boot/forth/loader.4th (revision dfaefdd8)
1199767f8SToomas Soome\ Copyright (c) 1999 Daniel C. Sobral <dcs@FreeBSD.org>
2199767f8SToomas Soome\ Copyright (c) 2011-2015 Devin Teske <dteske@FreeBSD.org>
3199767f8SToomas Soome\ All rights reserved.
4199767f8SToomas Soome\
5199767f8SToomas Soome\ Redistribution and use in source and binary forms, with or without
6199767f8SToomas Soome\ modification, are permitted provided that the following conditions
7199767f8SToomas Soome\ are met:
8199767f8SToomas Soome\ 1. Redistributions of source code must retain the above copyright
9199767f8SToomas Soome\    notice, this list of conditions and the following disclaimer.
10199767f8SToomas Soome\ 2. Redistributions in binary form must reproduce the above copyright
11199767f8SToomas Soome\    notice, this list of conditions and the following disclaimer in the
12199767f8SToomas Soome\    documentation and/or other materials provided with the distribution.
13199767f8SToomas Soome\
14199767f8SToomas Soome\ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15199767f8SToomas Soome\ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16199767f8SToomas Soome\ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17199767f8SToomas Soome\ ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18199767f8SToomas Soome\ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19199767f8SToomas Soome\ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20199767f8SToomas Soome\ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21199767f8SToomas Soome\ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22199767f8SToomas Soome\ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23199767f8SToomas Soome\ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24199767f8SToomas Soome\ SUCH DAMAGE.
25199767f8SToomas Soome\
26199767f8SToomas Soome\ $FreeBSD$
27199767f8SToomas Soome
28199767f8SToomas Soomeonly forth definitions
29199767f8SToomas Soome
30199767f8SToomas Soomeinclude /boot/forth/support.4th
31199767f8SToomas Soomeinclude /boot/forth/color.4th
32199767f8SToomas Soomeinclude /boot/forth/delay.4th
33199767f8SToomas Soomeinclude /boot/forth/check-password.4th
34a1625066SAndy Fiddamanefi? [if]
35eee59048SToomas Soome	include /boot/forth/efi.4th
36eee59048SToomas Soome[then]
37199767f8SToomas Soome
38199767f8SToomas Soomeonly forth definitions
39199767f8SToomas Soome
40199767f8SToomas Soome: bootmsg ( -- )
41199767f8SToomas Soome  loader_color? dup ( -- bool bool )
42199767f8SToomas Soome  if 7 fg 4 bg then
43199767f8SToomas Soome  ." Booting..."
44199767f8SToomas Soome  if me then
45199767f8SToomas Soome  cr
46199767f8SToomas Soome;
47199767f8SToomas Soome
48199767f8SToomas Soome: try-menu-unset
49199767f8SToomas Soome  \ menu-unset may not be present
50199767f8SToomas Soome  s" beastie_disable" getenv
51199767f8SToomas Soome  dup -1 <> if
52199767f8SToomas Soome    s" YES" compare-insensitive 0= if
53199767f8SToomas Soome      exit
54199767f8SToomas Soome    then
55199767f8SToomas Soome  else
56199767f8SToomas Soome    drop
57199767f8SToomas Soome  then
58199767f8SToomas Soome  s" menu-unset"
59199767f8SToomas Soome  sfind if
60199767f8SToomas Soome    execute
61199767f8SToomas Soome  else
62199767f8SToomas Soome    drop
63199767f8SToomas Soome  then
64199767f8SToomas Soome  s" menusets-unset"
65199767f8SToomas Soome  sfind if
66199767f8SToomas Soome    execute
67199767f8SToomas Soome  else
68199767f8SToomas Soome    drop
69199767f8SToomas Soome  then
70199767f8SToomas Soome;
71199767f8SToomas Soome
72199767f8SToomas Soomeonly forth also support-functions also builtins definitions
73199767f8SToomas Soome
74199767f8SToomas Soome\ the boot-args was parsed to individual options while loaded
75199767f8SToomas Soome\ now compose boot-args, so the boot can set kernel arguments
76199767f8SToomas Soome\ note the command line switched for boot command will cause
77199767f8SToomas Soome\ environment variable boot-args to be ignored
78199767f8SToomas Soome\ There are 2 larger strings, acpi-user-options and existing boot-args
79199767f8SToomas Soome\ other switches are 1 byte each, so allocate boot-args+acpi + extra bytes
80199767f8SToomas Soome\ for rest. Be sure to review this, if more options are to be added into
81199767f8SToomas Soome\ environment.
82199767f8SToomas Soome
83199767f8SToomas Soome: set-boot-args { | addr len baddr blen aaddr alen -- }
84199767f8SToomas Soome  s" boot-args" getenv dup -1 <> if
85199767f8SToomas Soome    to blen to baddr
86199767f8SToomas Soome  else
87199767f8SToomas Soome    drop
88199767f8SToomas Soome  then
89199767f8SToomas Soome  s" acpi-user-options" getenv dup -1 <> if
90199767f8SToomas Soome    to alen to aaddr
91199767f8SToomas Soome  else
92199767f8SToomas Soome    drop
93199767f8SToomas Soome  then
94199767f8SToomas Soome
95199767f8SToomas Soome  \ allocate temporary space. max is:
96*519c7dc9SToomas Soome  \  8 kernel switches
97199767f8SToomas Soome  \  26 for acpi, so use 40 for safety
98199767f8SToomas Soome  blen alen 40 + + allocate abort" out of memory"
99199767f8SToomas Soome  to addr
100199767f8SToomas Soome  \ boot-addr may have file name before options, copy it to addr
101199767f8SToomas Soome  baddr 0<> if
102199767f8SToomas Soome    baddr c@ [char] - <> if
103199767f8SToomas Soome      baddr blen [char] - strchr		( addr len )
104199767f8SToomas Soome      dup 0= if				\ no options, copy all
105199767f8SToomas Soome        2drop
106199767f8SToomas Soome        baddr addr blen move
107199767f8SToomas Soome        blen to len
108199767f8SToomas Soome        0 to blen
109199767f8SToomas Soome        0 to baddr
110199767f8SToomas Soome      else				( addr len )
111199767f8SToomas Soome        dup blen
112199767f8SToomas Soome        swap -
113199767f8SToomas Soome        to len				( addr len )
114199767f8SToomas Soome        to blen				( addr )
115a1625066SAndy Fiddaman        baddr addr len move		( addr )
116199767f8SToomas Soome        to baddr			\ baddr points now to first option
117199767f8SToomas Soome      then
118199767f8SToomas Soome    then
119199767f8SToomas Soome  then
120199767f8SToomas Soome  \ now add kernel switches
121199767f8SToomas Soome  len 0<> if
122199767f8SToomas Soome    bl addr len + c! len 1+ to len
123199767f8SToomas Soome  then
124199767f8SToomas Soome  [char] - addr len + c! len 1+ to len
125199767f8SToomas Soome
126199767f8SToomas Soome  s" boot_single" getenv dup -1 <> if
127199767f8SToomas Soome     s" YES" compare-insensitive 0= if
128199767f8SToomas Soome       [char] s addr len + c! len 1+ to len
129199767f8SToomas Soome     then
130199767f8SToomas Soome  else
131199767f8SToomas Soome    drop
132199767f8SToomas Soome  then
133199767f8SToomas Soome  s" boot_verbose" getenv dup -1 <> if
134199767f8SToomas Soome     s" YES" compare-insensitive 0= if
135199767f8SToomas Soome       [char] v addr len + c! len 1+ to len
136199767f8SToomas Soome     then
137199767f8SToomas Soome  else
138199767f8SToomas Soome    drop
139199767f8SToomas Soome  then
140199767f8SToomas Soome  s" boot_kmdb" getenv dup -1 <> if
141199767f8SToomas Soome     s" YES" compare-insensitive 0= if
142199767f8SToomas Soome       [char] k addr len + c! len 1+ to len
143199767f8SToomas Soome     then
144199767f8SToomas Soome  else
145199767f8SToomas Soome    drop
146199767f8SToomas Soome  then
147c3e6a6edSJohn Levon  s" boot_drop_into_kmdb" getenv dup -1 <> if
148199767f8SToomas Soome     s" YES" compare-insensitive 0= if
149199767f8SToomas Soome       [char] d addr len + c! len 1+ to len
150199767f8SToomas Soome     then
151199767f8SToomas Soome  else
152199767f8SToomas Soome    drop
153199767f8SToomas Soome  then
154199767f8SToomas Soome  s" boot_reconfigure" getenv dup -1 <> if
155199767f8SToomas Soome     s" YES" compare-insensitive 0= if
156199767f8SToomas Soome       [char] r addr len + c! len 1+ to len
157199767f8SToomas Soome     then
158199767f8SToomas Soome  else
159199767f8SToomas Soome    drop
160199767f8SToomas Soome  then
161199767f8SToomas Soome  s" boot_ask" getenv dup -1 <> if
162199767f8SToomas Soome     s" YES" compare-insensitive 0= if
163199767f8SToomas Soome       [char] a addr len + c! len 1+ to len
164199767f8SToomas Soome     then
165199767f8SToomas Soome  else
166199767f8SToomas Soome    drop
167199767f8SToomas Soome  then
168*519c7dc9SToomas Soome  s" boot_noncluster" getenv dup -1 <> if
169*519c7dc9SToomas Soome     s" YES" compare-insensitive 0= if
170*519c7dc9SToomas Soome       [char] x addr len + c! len 1+ to len
171*519c7dc9SToomas Soome     then
172*519c7dc9SToomas Soome  else
173*519c7dc9SToomas Soome    drop
174*519c7dc9SToomas Soome  then
175199767f8SToomas Soome
176199767f8SToomas Soome  \ now add remining boot args if blen != 0.
177199767f8SToomas Soome  \ baddr[0] is '-', if baddr[1] != 'B' append to addr,
178199767f8SToomas Soome  \ otherwise add space then copy
179199767f8SToomas Soome  blen 0<> if
180199767f8SToomas Soome    baddr 1+ c@ [char] B = if
181199767f8SToomas Soome      addr len + 1- c@ [char] - = if	 \ if addr[len -1] == '-'
182199767f8SToomas Soome	baddr 1+ to baddr
183199767f8SToomas Soome	blen 1- to blen
184199767f8SToomas Soome      else
185199767f8SToomas Soome	bl addr len + c! len 1+ to len
186199767f8SToomas Soome      then
187199767f8SToomas Soome    else
188199767f8SToomas Soome      baddr 1+ to baddr
189199767f8SToomas Soome      blen 1- to blen
190199767f8SToomas Soome    then
191199767f8SToomas Soome    baddr addr len + blen move
192199767f8SToomas Soome    len blen + to len
193199767f8SToomas Soome    0 to baddr
194199767f8SToomas Soome    0 to blen
195199767f8SToomas Soome  then
196199767f8SToomas Soome  \ last part - add acpi.
197199767f8SToomas Soome  alen 0<> if
198199767f8SToomas Soome    addr len + 1- c@ [char] - <> if
199199767f8SToomas Soome      bl addr len + c! len 1+ to len
200199767f8SToomas Soome      [char] - addr len + c! len 1+ to len
201199767f8SToomas Soome    then
202199767f8SToomas Soome    s" B acpi-user-options=" dup -rot		( len addr len )
203199767f8SToomas Soome    addr len + swap move			( len )
204199767f8SToomas Soome    len + to len
205199767f8SToomas Soome    aaddr addr len + alen move
206199767f8SToomas Soome    len alen + to len
207199767f8SToomas Soome  then
208199767f8SToomas Soome
209199767f8SToomas Soome  \ check for left over '-'
210199767f8SToomas Soome  addr len 1- + c@ [char] - = if
211199767f8SToomas Soome    len 1- to len
212199767f8SToomas Soome				\ but now we may also have left over ' '
213199767f8SToomas Soome    len if ( len <> 0 )
214199767f8SToomas Soome      addr len 1- + c@ bl = if
215199767f8SToomas Soome	len 1- to len
216199767f8SToomas Soome      then
217199767f8SToomas Soome    then
218199767f8SToomas Soome  then
219199767f8SToomas Soome
220199767f8SToomas Soome  \ if len != 0, set boot-args
221199767f8SToomas Soome  len 0<> if
222199767f8SToomas Soome    addr len s" boot-args" setenv
223199767f8SToomas Soome  then
224199767f8SToomas Soome  addr free drop
225199767f8SToomas Soome;
226199767f8SToomas Soome
227199767f8SToomas Soome: boot
228199767f8SToomas Soome  0= if ( interpreted ) get_arguments then
229199767f8SToomas Soome  set-boot-args
230199767f8SToomas Soome
231199767f8SToomas Soome  \ Unload only if a path was passed. Paths start with /
232199767f8SToomas Soome  dup if
233199767f8SToomas Soome    >r over r> swap
234199767f8SToomas Soome    c@ [char] / = if
235199767f8SToomas Soome      0 1 unload drop
236199767f8SToomas Soome    else
237199767f8SToomas Soome      s" kernelname" getenv? if ( a kernel has been loaded )
238199767f8SToomas Soome        try-menu-unset
239199767f8SToomas Soome        bootmsg 1 boot exit
240199767f8SToomas Soome      then
241199767f8SToomas Soome      load_kernel_and_modules
242199767f8SToomas Soome      ?dup if exit then
243199767f8SToomas Soome      try-menu-unset
244199767f8SToomas Soome      bootmsg 0 1 boot exit
245199767f8SToomas Soome    then
246199767f8SToomas Soome  else
247199767f8SToomas Soome    s" kernelname" getenv? if ( a kernel has been loaded )
248199767f8SToomas Soome      try-menu-unset
249199767f8SToomas Soome      bootmsg 1 boot exit
250199767f8SToomas Soome    then
251199767f8SToomas Soome    load_kernel_and_modules
252199767f8SToomas Soome    ?dup if exit then
253199767f8SToomas Soome    try-menu-unset
254199767f8SToomas Soome    bootmsg 0 1 boot exit
255199767f8SToomas Soome  then
256199767f8SToomas Soome  load_kernel_and_modules
257199767f8SToomas Soome  ?dup 0= if bootmsg 0 1 boot then
258199767f8SToomas Soome;
259199767f8SToomas Soome
260199767f8SToomas Soome\ ***** boot-conf
261199767f8SToomas Soome\
262199767f8SToomas Soome\	Prepares to boot as specified by loaded configuration files.
263199767f8SToomas Soome
264199767f8SToomas Soome: boot-conf
265199767f8SToomas Soome  0= if ( interpreted ) get_arguments then
266199767f8SToomas Soome  0 1 unload drop
267199767f8SToomas Soome  load_kernel_and_modules
268199767f8SToomas Soome  ?dup 0= if 0 1 autoboot then
269199767f8SToomas Soome;
270199767f8SToomas Soome
271199767f8SToomas Soomealso forth definitions previous
272199767f8SToomas Soome
273199767f8SToomas Soomebuiltin: boot
274199767f8SToomas Soomebuiltin: boot-conf
275199767f8SToomas Soome
276199767f8SToomas Soomeonly forth definitions also support-functions
277199767f8SToomas Soome
278a1625066SAndy Fiddaman\
279199767f8SToomas Soome\ in case the boot-args is set, parse it and extract following options:
280199767f8SToomas Soome\ -a to boot_ask=YES
281199767f8SToomas Soome\ -s to boot_single=YES
282199767f8SToomas Soome\ -v to boot_verbose=YES
283199767f8SToomas Soome\ -k to boot_kmdb=YES
284c3e6a6edSJohn Levon\ -d to boot_drop_into_kmdb=YES
285199767f8SToomas Soome\ -r to boot_reconfigure=YES
286*519c7dc9SToomas Soome\ -x to boot_noncluster=YES
287199767f8SToomas Soome\ -B acpi-user-options=X to acpi-user-options=X
288a1625066SAndy Fiddaman\
289199767f8SToomas Soome\ This is needed so that the menu can manage these options. Unfortunately, this
2905bdf86e2SToomas Soome\ also means that boot-args will override previously set options, but we have no
2915bdf86e2SToomas Soome\ way to control the processing order here. boot-args will be rebuilt at boot.
292a1625066SAndy Fiddaman\
293199767f8SToomas Soome\ NOTE: The best way to address the order is to *not* set any above options
294199767f8SToomas Soome\ in boot-args.
295199767f8SToomas Soome
296199767f8SToomas Soome: parse-boot-args  { | baddr blen -- }
297199767f8SToomas Soome  s" boot-args" getenv dup -1 = if drop exit then
298199767f8SToomas Soome  to blen
299199767f8SToomas Soome  to baddr
300199767f8SToomas Soome
301199767f8SToomas Soome  baddr blen
302199767f8SToomas Soome
303199767f8SToomas Soome  \ loop over all instances of switch blocks, starting with '-'
304199767f8SToomas Soome  begin
305199767f8SToomas Soome    [char] - strchr
306199767f8SToomas Soome    2dup to blen to baddr
307199767f8SToomas Soome    dup 0<>
308199767f8SToomas Soome  while				( addr len ) \ points to -
309199767f8SToomas Soome    \ block for switch B. keep it on top of the stack for case
310199767f8SToomas Soome    \ the property list will get empty.
311199767f8SToomas Soome
312199767f8SToomas Soome    over 1+ c@ [char] B = if
313199767f8SToomas Soome	2dup			\ save "-B ...." in case options is empty
314199767f8SToomas Soome	2 - swap 2 +		( addr len len-2 addr+2 ) \ skip -B
315199767f8SToomas Soome
316199767f8SToomas Soome      begin			\ skip spaces
317199767f8SToomas Soome        dup c@ bl =
318199767f8SToomas Soome      while
319199767f8SToomas Soome        1+ swap 1- swap
320199767f8SToomas Soome      repeat
321199767f8SToomas Soome
322199767f8SToomas Soome				( addr len len' addr' )
323199767f8SToomas Soome      \ its 3 cases now: end of string, -switch, or option list
324199767f8SToomas Soome
325199767f8SToomas Soome      over 0= if		\ end of string, remove trailing -B
326199767f8SToomas Soome	2drop			( addr len )
327199767f8SToomas Soome	swap 0 swap c!		\ store 0 at -B
328199767f8SToomas Soome	blen swap		( blen len )
329199767f8SToomas Soome	-			( rem )
330199767f8SToomas Soome	baddr swap		( addr rem )
331199767f8SToomas Soome	dup 0= if
332199767f8SToomas Soome	  s" boot-args" unsetenv
333199767f8SToomas Soome	  2drop
334199767f8SToomas Soome	  exit
335199767f8SToomas Soome	then
336199767f8SToomas Soome				\ trailing space(s)
337199767f8SToomas Soome	begin
338199767f8SToomas Soome	  over			( addr rem addr )
339199767f8SToomas Soome	  over + 1-		( addr rem addr+rem-1 )
340199767f8SToomas Soome	  c@ bl =
341199767f8SToomas Soome	while
342199767f8SToomas Soome	  1- swap		( rem-1 addr )
343199767f8SToomas Soome	  over			( rem-1 addr rem-1 )
344199767f8SToomas Soome	  over +		( rem-1 addr addr+rem-1 )
345199767f8SToomas Soome	  0 swap c!
346199767f8SToomas Soome	  swap
347199767f8SToomas Soome	repeat
348199767f8SToomas Soome	s" boot-args" setenv
349199767f8SToomas Soome	recurse			\ restart
350199767f8SToomas Soome	exit
351199767f8SToomas Soome      then
352199767f8SToomas Soome				( addr len len' addr' )
353199767f8SToomas Soome      dup c@ [char] - = if	\ it is switch. set to boot-args
354199767f8SToomas Soome	swap s" boot-args" setenv
355199767f8SToomas Soome	2drop
356199767f8SToomas Soome	recurse			\ restart
357199767f8SToomas Soome	exit
358199767f8SToomas Soome      then
359199767f8SToomas Soome				( addr len len' addr' )
360199767f8SToomas Soome      \ its options string "option1,option2,... -..."
361199767f8SToomas Soome      \ cut acpi-user-options=xxx and restart the parser
362199767f8SToomas Soome      \ or skip to next option block
363199767f8SToomas Soome      begin
364199767f8SToomas Soome	dup c@ dup 0<> swap bl <> and \ stop if space or 0
365199767f8SToomas Soome      while
366199767f8SToomas Soome	dup 18 s" acpi-user-options=" compare 0= if	\ matched
367199767f8SToomas Soome				( addr len len' addr' )
368199767f8SToomas Soome	  \ addr' points to acpi options, find its end [',' or ' ' or 0 ]
369199767f8SToomas Soome	  \ set it as acpi-user-options and move remaining to addr'
370199767f8SToomas Soome	  2dup			( addr len len' addr' len' addr' )
371199767f8SToomas Soome	  \ skip to next option in list
372199767f8SToomas Soome	  \ loop to first , or bl or 0
373199767f8SToomas Soome	  begin
374199767f8SToomas Soome	    dup c@ [char] , <> >r
375199767f8SToomas Soome	    dup c@ bl <> >r
376199767f8SToomas Soome	    dup c@ 0<> r> r> and and
377199767f8SToomas Soome	  while
378199767f8SToomas Soome	    1+ swap 1- swap
379199767f8SToomas Soome	  repeat
380199767f8SToomas Soome				( addr len len' addr' len" addr" )
381a1625066SAndy Fiddaman	  >r >r			( addr len len' addr' R: addr" len" )
382199767f8SToomas Soome	  over r@ -		( addr len len' addr' proplen R: addr" len" )
383199767f8SToomas Soome	  dup 5 +		( addr len len' addr' proplen proplen+5 )
384199767f8SToomas Soome	  allocate abort" out of memory"
385199767f8SToomas Soome
386199767f8SToomas Soome	  0 s" set " strcat	( addr len len' addr' proplen caddr clen )
387199767f8SToomas Soome	  >r >r 2dup r> r> 2swap strcat ( addr len len' addr' proplen caddr clen )
388199767f8SToomas Soome	  2dup + 0 swap c!	\ terminate with 0
389199767f8SToomas Soome	  2dup evaluate drop free drop
390199767f8SToomas Soome				( addr len len' addr' proplen R: addr" len" )
391199767f8SToomas Soome	  \ acpi-user-options is set, now move remaining string to its place.
392199767f8SToomas Soome	  \ addr: -B, addr': acpi... addr": reminder
393199767f8SToomas Soome	  swap			( addr len len' proplen addr' )
394199767f8SToomas Soome	  r> r>			( addr len len' proplen addr' len" addr" )
395199767f8SToomas Soome	  dup c@ [char] , = if
396199767f8SToomas Soome	    \ skip , and move addr" to addr'
397199767f8SToomas Soome	    1+ swap 1-		( addr len len' proplen addr' addr" len" )
398199767f8SToomas Soome	    rot	swap 1+ move	( addr len len' proplen )
399199767f8SToomas Soome	  else	\ its bl or 0	( addr len len' proplen addr' len" addr" )
400199767f8SToomas Soome	    \ for both bl and 0 we need to copy to addr'-1 to remove
401199767f8SToomas Soome	    \ comma, then reset boot-args, and recurse will clear -B
402199767f8SToomas Soome	    \ if there are no properties left.
403199767f8SToomas Soome	    dup c@ 0= if
404199767f8SToomas Soome	      2drop		( addr len len' proplen addr' )
405199767f8SToomas Soome	      1- 0 swap c!	( addr len len' proplen )
406199767f8SToomas Soome	    else
407199767f8SToomas Soome	      >r >r		( addr len len' proplen addr' R: addr" len" )
408199767f8SToomas Soome	      1- swap 1+ swap
409199767f8SToomas Soome	      r> r>		( addr len len' proplen addr' len" addr" )
410199767f8SToomas Soome	      rot rot move	( addr len len' proplen )
411199767f8SToomas Soome	    then
412199767f8SToomas Soome	  then
413199767f8SToomas Soome
414199767f8SToomas Soome	  2swap 2drop		( len' proplen )
415199767f8SToomas Soome	  nip			( proplen )
416199767f8SToomas Soome	  baddr blen rot -
417199767f8SToomas Soome	  s" boot-args" setenv
418199767f8SToomas Soome	  recurse
419199767f8SToomas Soome	  exit
420199767f8SToomas Soome	else
421199767f8SToomas Soome				( addr len len' addr' )
422199767f8SToomas Soome	  \ not acpi option, skip to next option in list
423199767f8SToomas Soome	  \ loop to first , or bl or 0
424199767f8SToomas Soome	  begin
425199767f8SToomas Soome	    dup c@ [char] , <> >r
426199767f8SToomas Soome	    dup c@ bl <> >r
427199767f8SToomas Soome	    dup c@ 0<> r> r> and and
428199767f8SToomas Soome	  while
429199767f8SToomas Soome	    1+ swap 1- swap
430199767f8SToomas Soome	  repeat
431199767f8SToomas Soome	  \ if its ',', skip over
432199767f8SToomas Soome	  dup c@ [char] , = if
433199767f8SToomas Soome	    1+ swap 1- swap
434199767f8SToomas Soome	  then
435199767f8SToomas Soome	then
436199767f8SToomas Soome      repeat
437199767f8SToomas Soome				( addr len len' addr' )
438199767f8SToomas Soome      \ this block is done, remove addr and len from stack
439199767f8SToomas Soome      2swap 2drop swap
440199767f8SToomas Soome    then
441199767f8SToomas Soome
442199767f8SToomas Soome    over c@ [char] - = if	( addr len )
443199767f8SToomas Soome      2dup 1- swap 1+		( addr len len' addr' )
444199767f8SToomas Soome      begin			\ loop till ' ' or 0
445199767f8SToomas Soome	dup c@ dup 0<> swap bl <> and
446199767f8SToomas Soome      while
447199767f8SToomas Soome	dup c@ [char] s = if
448199767f8SToomas Soome	  s" set boot_single=YES" evaluate TRUE
449199767f8SToomas Soome	else dup c@ [char] v = if
450199767f8SToomas Soome	  s" set boot_verbose=YES" evaluate TRUE
451199767f8SToomas Soome	else dup c@ [char] k = if
452199767f8SToomas Soome	  s" set boot_kmdb=YES" evaluate TRUE
453199767f8SToomas Soome	else dup c@ [char] d = if
454c3e6a6edSJohn Levon	  s" set boot_drop_into_kmdb=YES" evaluate TRUE
455199767f8SToomas Soome	else dup c@ [char] r = if
456199767f8SToomas Soome	  s" set boot_reconfigure=YES" evaluate TRUE
457199767f8SToomas Soome	else dup c@ [char] a = if
458199767f8SToomas Soome	  s" set boot_ask=YES" evaluate TRUE
459*519c7dc9SToomas Soome	else dup c@ [char] x = if
460*519c7dc9SToomas Soome	  s" set boot_noncluster=YES" evaluate TRUE
461*519c7dc9SToomas Soome	then then then then then then then
462199767f8SToomas Soome	dup TRUE = if
463199767f8SToomas Soome	  drop
464199767f8SToomas Soome	  dup >r		( addr len len' addr' R: addr' )
465199767f8SToomas Soome	  1+ swap 1-		( addr len addr'+1 len'-1 R: addr' )
466199767f8SToomas Soome	  r> swap move		( addr len )
467199767f8SToomas Soome
468199767f8SToomas Soome	  2drop baddr blen 1-
469199767f8SToomas Soome	  \ check if we have space after '-', if so, drop '- '
470199767f8SToomas Soome	  swap dup 1+ c@ bl = if
471199767f8SToomas Soome	      2 + swap 2 -
472199767f8SToomas Soome	  else
473199767f8SToomas Soome	      swap
474199767f8SToomas Soome	  then
475199767f8SToomas Soome	  dup dup 0= swap 1 = or if	\ empty or only '-' is left.
476199767f8SToomas Soome	    2drop
477199767f8SToomas Soome	    s" boot-args" unsetenv
478199767f8SToomas Soome	    exit
479199767f8SToomas Soome	  else
480199767f8SToomas Soome	    s" boot-args" setenv
481199767f8SToomas Soome	  then
482199767f8SToomas Soome	  recurse
483199767f8SToomas Soome	  exit
484199767f8SToomas Soome	then
485199767f8SToomas Soome	1+ swap 1- swap
486199767f8SToomas Soome      repeat
487199767f8SToomas Soome
488199767f8SToomas Soome      2swap 2drop
489199767f8SToomas Soome      dup c@ 0= if		\ end of string
490199767f8SToomas Soome	2drop
491199767f8SToomas Soome	exit
492199767f8SToomas Soome      else
493199767f8SToomas Soome	swap
494199767f8SToomas Soome      then
495199767f8SToomas Soome    then
496199767f8SToomas Soome  repeat
497199767f8SToomas Soome
498199767f8SToomas Soome  2drop
499199767f8SToomas Soome;
500199767f8SToomas Soome
501199767f8SToomas Soome\ ***** start
502199767f8SToomas Soome\
503199767f8SToomas Soome\       Initializes support.4th global variables, sets loader_conf_files,
504288c4f44SToomas Soome\       processes conf files, and, if any one such file was successfully
505199767f8SToomas Soome\       read to the end, loads kernel and modules.
506199767f8SToomas Soome
507199767f8SToomas Soome: start  ( -- ) ( throws: abort & user-defined )
508199767f8SToomas Soome  s" /boot/defaults/loader.conf" initialize
509199767f8SToomas Soome  include_bootenv
510199767f8SToomas Soome  include_conf_files
511199767f8SToomas Soome  include_transient
512231d7891SToomas Soome  \ If the user defined a post-initialize hook, call it now
513231d7891SToomas Soome  s" post-initialize" sfind if execute else drop then
514199767f8SToomas Soome  parse-boot-args
515199767f8SToomas Soome  \ Will *NOT* try to load kernel and modules if no configuration file
516288c4f44SToomas Soome  \ was successfully loaded!
517199767f8SToomas Soome  any_conf_read? if
518199767f8SToomas Soome    s" loader_delay" getenv -1 = if
519199767f8SToomas Soome      load_xen_throw
520199767f8SToomas Soome      load_kernel
521199767f8SToomas Soome      load_modules
522199767f8SToomas Soome    else
523199767f8SToomas Soome      drop
524199767f8SToomas Soome      ." Loading Kernel and Modules (Ctrl-C to Abort)" cr
525199767f8SToomas Soome      s" also support-functions" evaluate
526199767f8SToomas Soome      s" set delay_command='load_xen_throw load_kernel load_modules'" evaluate
527199767f8SToomas Soome      s" set delay_showdots" evaluate
528199767f8SToomas Soome      delay_execute
529199767f8SToomas Soome    then
530199767f8SToomas Soome  then
531199767f8SToomas Soome;
532199767f8SToomas Soome
533199767f8SToomas Soome\ ***** initialize
534199767f8SToomas Soome\
535199767f8SToomas Soome\	Overrides support.4th initialization word with one that does
536199767f8SToomas Soome\	everything start one does, short of loading the kernel and
537231d7891SToomas Soome\	modules. Returns a flag.
538199767f8SToomas Soome
539199767f8SToomas Soome: initialize ( -- flag )
540199767f8SToomas Soome  s" /boot/defaults/loader.conf" initialize
541199767f8SToomas Soome  include_bootenv
542199767f8SToomas Soome  include_conf_files
543199767f8SToomas Soome  include_transient
544231d7891SToomas Soome  \ If the user defined a post-initialize hook, call it now
545231d7891SToomas Soome  s" post-initialize" sfind if execute else drop then
546199767f8SToomas Soome  parse-boot-args
547199767f8SToomas Soome  any_conf_read?
548199767f8SToomas Soome;
549199767f8SToomas Soome
550199767f8SToomas Soome\ ***** read-conf
551199767f8SToomas Soome\
552199767f8SToomas Soome\	Read a configuration file, whose name was specified on the command
553199767f8SToomas Soome\	line, if interpreted, or given on the stack, if compiled in.
554199767f8SToomas Soome
555199767f8SToomas Soome: (read-conf)  ( addr len -- )
556199767f8SToomas Soome  conf_files string=
557199767f8SToomas Soome  include_conf_files \ Will recurse on new loader_conf_files definitions
558199767f8SToomas Soome;
559199767f8SToomas Soome
560199767f8SToomas Soome: read-conf  ( <filename> | addr len -- ) ( throws: abort & user-defined )
561199767f8SToomas Soome  state @ if
562199767f8SToomas Soome    \ Compiling
563199767f8SToomas Soome    postpone (read-conf)
564199767f8SToomas Soome  else
565199767f8SToomas Soome    \ Interpreting
566199767f8SToomas Soome    bl parse (read-conf)
567199767f8SToomas Soome  then
568199767f8SToomas Soome; immediate
569199767f8SToomas Soome
570199767f8SToomas Soome\ show, enable, disable, toggle module loading. They all take module from
571199767f8SToomas Soome\ the next word
572199767f8SToomas Soome
573199767f8SToomas Soome: set-module-flag ( module_addr val -- ) \ set and print flag
574199767f8SToomas Soome  over module.flag !
575199767f8SToomas Soome  dup module.name strtype
576199767f8SToomas Soome  module.flag @ if ."  will be loaded" else ."  will not be loaded" then cr
577199767f8SToomas Soome;
578199767f8SToomas Soome
579199767f8SToomas Soome: enable-module find-module ?dup if true set-module-flag then ;
580199767f8SToomas Soome
581199767f8SToomas Soome: disable-module find-module ?dup if false set-module-flag then ;
582199767f8SToomas Soome
583199767f8SToomas Soome: toggle-module find-module ?dup if dup module.flag @ 0= set-module-flag then ;
584199767f8SToomas Soome
585199767f8SToomas Soome\ ***** show-module
586199767f8SToomas Soome\
587199767f8SToomas Soome\	Show loading information about a module.
588199767f8SToomas Soome
589199767f8SToomas Soome: show-module ( <module> -- ) find-module ?dup if show-one-module then ;
590199767f8SToomas Soome
591f2aacf29SToomas Soome: set-module-path ( addr len <module> -- )
592f2aacf29SToomas Soome  find-module ?dup if
593f2aacf29SToomas Soome    module.loadname string=
594f2aacf29SToomas Soome  then
595f2aacf29SToomas Soome;
596f2aacf29SToomas Soome
597199767f8SToomas Soome\ Words to be used inside configuration files
598199767f8SToomas Soome
599199767f8SToomas Soome: retry false ;         \ For use in load error commands
600199767f8SToomas Soome: ignore true ;         \ For use in load error commands
601199767f8SToomas Soome
602199767f8SToomas Soome\ Return to strict forth vocabulary
603199767f8SToomas Soome
604199767f8SToomas Soome: #type
605199767f8SToomas Soome  over - >r
606199767f8SToomas Soome  type
607199767f8SToomas Soome  r> spaces
608199767f8SToomas Soome;
609199767f8SToomas Soome
610199767f8SToomas Soome: .? 2 spaces 2swap 15 #type 2 spaces type cr ;
611199767f8SToomas Soome
612199767f8SToomas Soome: ?
613199767f8SToomas Soome  ['] ? execute
614199767f8SToomas Soome  s" boot-conf" s" load kernel and modules, then autoboot" .?
615199767f8SToomas Soome  s" read-conf" s" read a configuration file" .?
616199767f8SToomas Soome  s" enable-module" s" enable loading of a module" .?
617199767f8SToomas Soome  s" disable-module" s" disable loading of a module" .?
618199767f8SToomas Soome  s" toggle-module" s" toggle loading of a module" .?
619199767f8SToomas Soome  s" show-module" s" show module load data" .?
620199767f8SToomas Soome  s" try-include" s" try to load/interpret files" .?
621199767f8SToomas Soome  s" beadm" s" list or activate Boot Environments" .?
622199767f8SToomas Soome;
623199767f8SToomas Soome
624199767f8SToomas Soome: try-include ( -- ) \ see loader.4th(8)
625199767f8SToomas Soome  ['] include ( -- xt ) \ get the execution token of `include'
626199767f8SToomas Soome  catch ( xt -- exception# | 0 ) if \ failed
627199767f8SToomas Soome    LF parse ( c -- s-addr/u ) 2drop \ advance >in to EOL (drop data)
628199767f8SToomas Soome    \ ... prevents words unused by `include' from being interpreted
629199767f8SToomas Soome  then
630199767f8SToomas Soome; immediate \ interpret immediately for access to `source' (aka tib)
631199767f8SToomas Soome
632199767f8SToomas Soomeinclude /boot/forth/beadm.4th
633199767f8SToomas Soomeonly forth definitions
634