xref: /titanic_52/usr/src/boot/sys/boot/forth/loader.4th (revision d5a0772bd7066293674d17391f116c692addc58d)
14a5d661aSToomas Soome\ Copyright (c) 1999 Daniel C. Sobral <dcs@FreeBSD.org>
24a5d661aSToomas Soome\ Copyright (c) 2011-2015 Devin Teske <dteske@FreeBSD.org>
34a5d661aSToomas Soome\ All rights reserved.
44a5d661aSToomas Soome\
54a5d661aSToomas Soome\ Redistribution and use in source and binary forms, with or without
64a5d661aSToomas Soome\ modification, are permitted provided that the following conditions
74a5d661aSToomas Soome\ are met:
84a5d661aSToomas Soome\ 1. Redistributions of source code must retain the above copyright
94a5d661aSToomas Soome\    notice, this list of conditions and the following disclaimer.
104a5d661aSToomas Soome\ 2. Redistributions in binary form must reproduce the above copyright
114a5d661aSToomas Soome\    notice, this list of conditions and the following disclaimer in the
124a5d661aSToomas Soome\    documentation and/or other materials provided with the distribution.
134a5d661aSToomas Soome\
144a5d661aSToomas Soome\ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
154a5d661aSToomas Soome\ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
164a5d661aSToomas Soome\ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
174a5d661aSToomas Soome\ ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
184a5d661aSToomas Soome\ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
194a5d661aSToomas Soome\ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
204a5d661aSToomas Soome\ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
214a5d661aSToomas Soome\ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
224a5d661aSToomas Soome\ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
234a5d661aSToomas Soome\ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
244a5d661aSToomas Soome\ SUCH DAMAGE.
254a5d661aSToomas Soome\
264a5d661aSToomas Soome\ $FreeBSD$
274a5d661aSToomas Soome
284a5d661aSToomas Soomeonly forth definitions
294a5d661aSToomas Soome
304a5d661aSToomas Soomes" arch-i386" environment? [if] [if]
314a5d661aSToomas Soome	s" loader_version" environment?  [if]
324a5d661aSToomas Soome		11 < [if]
334a5d661aSToomas Soome			.( Loader version 1.1+ required) cr
344a5d661aSToomas Soome			abort
354a5d661aSToomas Soome		[then]
364a5d661aSToomas Soome	[else]
374a5d661aSToomas Soome		.( Could not get loader version!) cr
384a5d661aSToomas Soome		abort
394a5d661aSToomas Soome	[then]
404a5d661aSToomas Soome[then] [then]
414a5d661aSToomas Soome
424a5d661aSToomas Soomeinclude /boot/forth/support.4th
434a5d661aSToomas Soomeinclude /boot/forth/color.4th
444a5d661aSToomas Soomeinclude /boot/forth/delay.4th
454a5d661aSToomas Soomeinclude /boot/forth/check-password.4th
46*d5a0772bSToomas Soomes" efi-version" getenv? [if]
47*d5a0772bSToomas Soome	include /boot/forth/efi.4th
48*d5a0772bSToomas Soome[then]
494a5d661aSToomas Soome
504a5d661aSToomas Soomeonly forth definitions
514a5d661aSToomas Soome
524a5d661aSToomas Soome: bootmsg ( -- )
534a5d661aSToomas Soome  loader_color? dup ( -- bool bool )
544a5d661aSToomas Soome  if 7 fg 4 bg then
554a5d661aSToomas Soome  ." Booting..."
564a5d661aSToomas Soome  if me then
574a5d661aSToomas Soome  cr
584a5d661aSToomas Soome;
594a5d661aSToomas Soome
604a5d661aSToomas Soome: try-menu-unset
614a5d661aSToomas Soome  \ menu-unset may not be present
624a5d661aSToomas Soome  s" beastie_disable" getenv
634a5d661aSToomas Soome  dup -1 <> if
644a5d661aSToomas Soome    s" YES" compare-insensitive 0= if
654a5d661aSToomas Soome      exit
664a5d661aSToomas Soome    then
674a5d661aSToomas Soome  else
684a5d661aSToomas Soome    drop
694a5d661aSToomas Soome  then
704a5d661aSToomas Soome  s" menu-unset"
714a5d661aSToomas Soome  sfind if
724a5d661aSToomas Soome    execute
734a5d661aSToomas Soome  else
744a5d661aSToomas Soome    drop
754a5d661aSToomas Soome  then
764a5d661aSToomas Soome  s" menusets-unset"
774a5d661aSToomas Soome  sfind if
784a5d661aSToomas Soome    execute
794a5d661aSToomas Soome  else
804a5d661aSToomas Soome    drop
814a5d661aSToomas Soome  then
824a5d661aSToomas Soome;
834a5d661aSToomas Soome
844a5d661aSToomas Soomeonly forth also support-functions also builtins definitions
854a5d661aSToomas Soome
864a5d661aSToomas Soome\ the boot-args was parsed to individual options while loaded
874a5d661aSToomas Soome\ now compose boot-args, so the boot can set kernel arguments
884a5d661aSToomas Soome\ note the command line switched for boot command will cause
894a5d661aSToomas Soome\ environment variable boot-args to be ignored
904a5d661aSToomas Soome\ There are 2 larger strings, acpi-user-options and existing boot-args
914a5d661aSToomas Soome\ other switches are 1 byte each, so allocate boot-args+acpi + extra bytes
924a5d661aSToomas Soome\ for rest. Be sure to review this, if more options are to be added into
934a5d661aSToomas Soome\ environment.
944a5d661aSToomas Soome
954a5d661aSToomas Soome: set-boot-args { | addr len baddr blen aaddr alen -- }
964a5d661aSToomas Soome  s" boot-args" getenv dup -1 <> if
974a5d661aSToomas Soome    to blen to baddr
984a5d661aSToomas Soome  else
994a5d661aSToomas Soome    drop
1004a5d661aSToomas Soome  then
1014a5d661aSToomas Soome  s" acpi-user-options" getenv dup -1 <> if
1024a5d661aSToomas Soome    to alen to aaddr
1034a5d661aSToomas Soome  else
1044a5d661aSToomas Soome    drop
1054a5d661aSToomas Soome  then
1064a5d661aSToomas Soome
1074a5d661aSToomas Soome  \ allocate temporary space. max is:
1084a5d661aSToomas Soome  \  7 kernel switches
1094a5d661aSToomas Soome  \  26 for acpi, so use 40 for safety
1104a5d661aSToomas Soome  blen alen 40 + + allocate abort" out of memory"
1114a5d661aSToomas Soome  to addr
1124a5d661aSToomas Soome  \ boot-addr may have file name before options, copy it to addr
1134a5d661aSToomas Soome  baddr 0<> if
1144a5d661aSToomas Soome    baddr c@ [char] - <> if
1154a5d661aSToomas Soome      baddr blen [char] - strchr		( addr len )
1164a5d661aSToomas Soome      dup 0= if				\ no options, copy all
1174a5d661aSToomas Soome        2drop
1184a5d661aSToomas Soome        baddr addr blen move
1194a5d661aSToomas Soome        blen to len
1204a5d661aSToomas Soome        0 to blen
1214a5d661aSToomas Soome        0 to baddr
1224a5d661aSToomas Soome      else				( addr len )
1234a5d661aSToomas Soome        dup blen
1244a5d661aSToomas Soome        swap -
1254a5d661aSToomas Soome        to len				( addr len )
1264a5d661aSToomas Soome        to blen				( addr )
1274a5d661aSToomas Soome        baddr addr len move 		( addr )
1284a5d661aSToomas Soome        to baddr			\ baddr points now to first option
1294a5d661aSToomas Soome      then
1304a5d661aSToomas Soome    then
1314a5d661aSToomas Soome  then
1324a5d661aSToomas Soome  \ now add kernel switches
1334a5d661aSToomas Soome  len 0<> if
1344a5d661aSToomas Soome    bl addr len + c! len 1+ to len
1354a5d661aSToomas Soome  then
1364a5d661aSToomas Soome  [char] - addr len + c! len 1+ to len
1374a5d661aSToomas Soome
1384a5d661aSToomas Soome  s" boot_single" getenv dup -1 <> if
1394a5d661aSToomas Soome     s" YES" compare-insensitive 0= if
1404a5d661aSToomas Soome       [char] s addr len + c! len 1+ to len
1414a5d661aSToomas Soome     then
1424a5d661aSToomas Soome  else
1434a5d661aSToomas Soome    drop
1444a5d661aSToomas Soome  then
1454a5d661aSToomas Soome  s" boot_verbose" getenv dup -1 <> if
1464a5d661aSToomas Soome     s" YES" compare-insensitive 0= if
1474a5d661aSToomas Soome       [char] v addr len + c! len 1+ to len
1484a5d661aSToomas Soome     then
1494a5d661aSToomas Soome  else
1504a5d661aSToomas Soome    drop
1514a5d661aSToomas Soome  then
1524a5d661aSToomas Soome  s" boot_kmdb" getenv dup -1 <> if
1534a5d661aSToomas Soome     s" YES" compare-insensitive 0= if
1544a5d661aSToomas Soome       [char] k addr len + c! len 1+ to len
1554a5d661aSToomas Soome     then
1564a5d661aSToomas Soome  else
1574a5d661aSToomas Soome    drop
1584a5d661aSToomas Soome  then
1594a5d661aSToomas Soome  s" boot_debug" getenv dup -1 <> if
1604a5d661aSToomas Soome     s" YES" compare-insensitive 0= if
1614a5d661aSToomas Soome       [char] d addr len + c! len 1+ to len
1624a5d661aSToomas Soome     then
1634a5d661aSToomas Soome  else
1644a5d661aSToomas Soome    drop
1654a5d661aSToomas Soome  then
1664a5d661aSToomas Soome  s" boot_reconfigure" getenv dup -1 <> if
1674a5d661aSToomas Soome     s" YES" compare-insensitive 0= if
1684a5d661aSToomas Soome       [char] r addr len + c! len 1+ to len
1694a5d661aSToomas Soome     then
1704a5d661aSToomas Soome  else
1714a5d661aSToomas Soome    drop
1724a5d661aSToomas Soome  then
1734a5d661aSToomas Soome  s" boot_ask" getenv dup -1 <> if
1744a5d661aSToomas Soome     s" YES" compare-insensitive 0= if
1754a5d661aSToomas Soome       [char] a addr len + c! len 1+ to len
1764a5d661aSToomas Soome     then
1774a5d661aSToomas Soome  else
1784a5d661aSToomas Soome    drop
1794a5d661aSToomas Soome  then
1804a5d661aSToomas Soome
1814a5d661aSToomas Soome  \ now add remining boot args if blen != 0.
1824a5d661aSToomas Soome  \ baddr[0] is '-', if baddr[1] != 'B' append to addr,
1834a5d661aSToomas Soome  \ otherwise add space then copy
1844a5d661aSToomas Soome  blen 0<> if
1854a5d661aSToomas Soome    baddr 1+ c@ [char] B = if
1864a5d661aSToomas Soome      addr len + 1- c@ [char] - = if	 \ if addr[len -1] == '-'
1874a5d661aSToomas Soome	baddr 1+ to baddr
1884a5d661aSToomas Soome	blen 1- to blen
1894a5d661aSToomas Soome      else
1904a5d661aSToomas Soome	bl addr len + c! len 1+ to len
1914a5d661aSToomas Soome      then
1924a5d661aSToomas Soome    else
1934a5d661aSToomas Soome      baddr 1+ to baddr
1944a5d661aSToomas Soome      blen 1- to blen
1954a5d661aSToomas Soome    then
1964a5d661aSToomas Soome    baddr addr len + blen move
1974a5d661aSToomas Soome    len blen + to len
1984a5d661aSToomas Soome    0 to baddr
1994a5d661aSToomas Soome    0 to blen
2004a5d661aSToomas Soome  then
2014a5d661aSToomas Soome  \ last part - add acpi.
2024a5d661aSToomas Soome  alen 0<> if
2034a5d661aSToomas Soome    addr len + 1- c@ [char] - <> if
2044a5d661aSToomas Soome      bl addr len + c! len 1+ to len
2054a5d661aSToomas Soome      [char] - addr len + c! len 1+ to len
2064a5d661aSToomas Soome    then
2074a5d661aSToomas Soome    s" B acpi-user-options=" dup -rot		( len addr len )
2084a5d661aSToomas Soome    addr len + swap move			( len )
2094a5d661aSToomas Soome    len + to len
2104a5d661aSToomas Soome    aaddr addr len + alen move
2114a5d661aSToomas Soome    len alen + to len
2124a5d661aSToomas Soome  then
2134a5d661aSToomas Soome
2144a5d661aSToomas Soome  \ check for left over '-'
2154a5d661aSToomas Soome  addr len 1- + c@ [char] - = if
2164a5d661aSToomas Soome    len 1- to len
2174a5d661aSToomas Soome				\ but now we may also have left over ' '
2184a5d661aSToomas Soome    len if ( len <> 0 )
2194a5d661aSToomas Soome      addr len 1- + c@ bl = if
2204a5d661aSToomas Soome	len 1- to len
2214a5d661aSToomas Soome      then
2224a5d661aSToomas Soome    then
2234a5d661aSToomas Soome  then
2244a5d661aSToomas Soome
2254a5d661aSToomas Soome  \ if len != 0, set boot-args
2264a5d661aSToomas Soome  len 0<> if
2274a5d661aSToomas Soome    addr len s" boot-args" setenv
2284a5d661aSToomas Soome  then
2294a5d661aSToomas Soome  addr free drop
2304a5d661aSToomas Soome;
2314a5d661aSToomas Soome
2324a5d661aSToomas Soome: boot
2334a5d661aSToomas Soome  0= if ( interpreted ) get_arguments then
2344a5d661aSToomas Soome  set-boot-args
2354a5d661aSToomas Soome
2364a5d661aSToomas Soome  \ Unload only if a path was passed. Paths start with /
2374a5d661aSToomas Soome  dup if
2384a5d661aSToomas Soome    >r over r> swap
2394a5d661aSToomas Soome    c@ [char] / = if
2404a5d661aSToomas Soome      0 1 unload drop
2414a5d661aSToomas Soome    else
2424a5d661aSToomas Soome      s" kernelname" getenv? if ( a kernel has been loaded )
2434a5d661aSToomas Soome        try-menu-unset
2444a5d661aSToomas Soome        bootmsg 1 boot exit
2454a5d661aSToomas Soome      then
2464a5d661aSToomas Soome      load_kernel_and_modules
2474a5d661aSToomas Soome      ?dup if exit then
2484a5d661aSToomas Soome      try-menu-unset
2494a5d661aSToomas Soome      bootmsg 0 1 boot exit
2504a5d661aSToomas Soome    then
2514a5d661aSToomas Soome  else
2524a5d661aSToomas Soome    s" kernelname" getenv? if ( a kernel has been loaded )
2534a5d661aSToomas Soome      try-menu-unset
2544a5d661aSToomas Soome      bootmsg 1 boot exit
2554a5d661aSToomas Soome    then
2564a5d661aSToomas Soome    load_kernel_and_modules
2574a5d661aSToomas Soome    ?dup if exit then
2584a5d661aSToomas Soome    try-menu-unset
2594a5d661aSToomas Soome    bootmsg 0 1 boot exit
2604a5d661aSToomas Soome  then
2614a5d661aSToomas Soome  load_kernel_and_modules
2624a5d661aSToomas Soome  ?dup 0= if bootmsg 0 1 boot then
2634a5d661aSToomas Soome;
2644a5d661aSToomas Soome
2654a5d661aSToomas Soome\ ***** boot-conf
2664a5d661aSToomas Soome\
2674a5d661aSToomas Soome\	Prepares to boot as specified by loaded configuration files.
2684a5d661aSToomas Soome
2694a5d661aSToomas Soome: boot-conf
2704a5d661aSToomas Soome  0= if ( interpreted ) get_arguments then
2714a5d661aSToomas Soome  0 1 unload drop
2724a5d661aSToomas Soome  load_kernel_and_modules
2734a5d661aSToomas Soome  ?dup 0= if 0 1 autoboot then
2744a5d661aSToomas Soome;
2754a5d661aSToomas Soome
2764a5d661aSToomas Soomealso forth definitions previous
2774a5d661aSToomas Soome
2784a5d661aSToomas Soomebuiltin: boot
2794a5d661aSToomas Soomebuiltin: boot-conf
2804a5d661aSToomas Soome
2814a5d661aSToomas Soomeonly forth definitions also support-functions
2824a5d661aSToomas Soome
2834a5d661aSToomas Soome\
2844a5d661aSToomas Soome\ in case the boot-args is set, parse it and extract following options:
2854a5d661aSToomas Soome\ -a to boot_ask=YES
2864a5d661aSToomas Soome\ -s to boot_single=YES
2874a5d661aSToomas Soome\ -v to boot_verbose=YES
2884a5d661aSToomas Soome\ -k to boot_kmdb=YES
2894a5d661aSToomas Soome\ -d to boot_debug=YES
2904a5d661aSToomas Soome\ -r to boot_reconfigure=YES
2914a5d661aSToomas Soome\ -B acpi-user-options=X to acpi-user-options=X
2924a5d661aSToomas Soome\
2934a5d661aSToomas Soome\ This is needed so that the menu can manage these options. Unfortunately, this
294edfbf5b2SToomas Soome\ also means that boot-args will override previously set options, but we have no
295edfbf5b2SToomas Soome\ way to control the processing order here. boot-args will be rebuilt at boot.
2964a5d661aSToomas Soome\
2974a5d661aSToomas Soome\ NOTE: The best way to address the order is to *not* set any above options
2984a5d661aSToomas Soome\ in boot-args.
2994a5d661aSToomas Soome
3004a5d661aSToomas Soome: parse-boot-args  { | baddr blen -- }
3014a5d661aSToomas Soome  s" boot-args" getenv dup -1 = if drop exit then
3024a5d661aSToomas Soome  to blen
3034a5d661aSToomas Soome  to baddr
3044a5d661aSToomas Soome
3054a5d661aSToomas Soome  baddr blen
3064a5d661aSToomas Soome
3074a5d661aSToomas Soome  \ loop over all instances of switch blocks, starting with '-'
3084a5d661aSToomas Soome  begin
3094a5d661aSToomas Soome    [char] - strchr
3104a5d661aSToomas Soome    2dup to blen to baddr
3114a5d661aSToomas Soome    dup 0<>
3124a5d661aSToomas Soome  while				( addr len ) \ points to -
3134a5d661aSToomas Soome    \ block for switch B. keep it on top of the stack for case
3144a5d661aSToomas Soome    \ the property list will get empty.
3154a5d661aSToomas Soome
3164a5d661aSToomas Soome    over 1+ c@ [char] B = if
3174a5d661aSToomas Soome	2dup			\ save "-B ...." in case options is empty
3184a5d661aSToomas Soome	2 - swap 2 +		( addr len len-2 addr+2 ) \ skip -B
3194a5d661aSToomas Soome
3204a5d661aSToomas Soome      begin			\ skip spaces
3214a5d661aSToomas Soome        dup c@ bl =
3224a5d661aSToomas Soome      while
3234a5d661aSToomas Soome        1+ swap 1- swap
3244a5d661aSToomas Soome      repeat
3254a5d661aSToomas Soome
3264a5d661aSToomas Soome				( addr len len' addr' )
3274a5d661aSToomas Soome      \ its 3 cases now: end of string, -switch, or option list
3284a5d661aSToomas Soome
3294a5d661aSToomas Soome      over 0= if		\ end of string, remove trailing -B
3304a5d661aSToomas Soome	2drop			( addr len )
3314a5d661aSToomas Soome	swap 0 swap c!		\ store 0 at -B
3324a5d661aSToomas Soome	blen swap		( blen len )
3334a5d661aSToomas Soome	-			( rem )
3344a5d661aSToomas Soome	baddr swap		( addr rem )
3354a5d661aSToomas Soome	dup 0= if
3364a5d661aSToomas Soome	  s" boot-args" unsetenv
3374a5d661aSToomas Soome	  2drop
3384a5d661aSToomas Soome	  exit
3394a5d661aSToomas Soome	then
3404a5d661aSToomas Soome				\ trailing space(s)
3414a5d661aSToomas Soome	begin
3424a5d661aSToomas Soome	  over			( addr rem addr )
3434a5d661aSToomas Soome	  over + 1-		( addr rem addr+rem-1 )
3444a5d661aSToomas Soome	  c@ bl =
3454a5d661aSToomas Soome	while
3464a5d661aSToomas Soome	  1- swap		( rem-1 addr )
3474a5d661aSToomas Soome	  over			( rem-1 addr rem-1 )
3484a5d661aSToomas Soome	  over +		( rem-1 addr addr+rem-1 )
3494a5d661aSToomas Soome	  0 swap c!
3504a5d661aSToomas Soome	  swap
3514a5d661aSToomas Soome	repeat
3524a5d661aSToomas Soome	s" boot-args" setenv
3534a5d661aSToomas Soome	recurse			\ restart
3544a5d661aSToomas Soome	exit
3554a5d661aSToomas Soome      then
3564a5d661aSToomas Soome				( addr len len' addr' )
3574a5d661aSToomas Soome      dup c@ [char] - = if	\ it is switch. set to boot-args
3584a5d661aSToomas Soome	swap s" boot-args" setenv
3594a5d661aSToomas Soome	2drop
3604a5d661aSToomas Soome	recurse			\ restart
3614a5d661aSToomas Soome	exit
3624a5d661aSToomas Soome      then
3634a5d661aSToomas Soome				( addr len len' addr' )
3644a5d661aSToomas Soome      \ its options string "option1,option2,... -..."
3654a5d661aSToomas Soome      \ cut acpi-user-options=xxx and restart the parser
3664a5d661aSToomas Soome      \ or skip to next option block
3674a5d661aSToomas Soome      begin
3684a5d661aSToomas Soome	dup c@ dup 0<> swap bl <> and \ stop if space or 0
3694a5d661aSToomas Soome      while
3704a5d661aSToomas Soome	dup 18 s" acpi-user-options=" compare 0= if	\ matched
3714a5d661aSToomas Soome				( addr len len' addr' )
3724a5d661aSToomas Soome	  \ addr' points to acpi options, find its end [',' or ' ' or 0 ]
3734a5d661aSToomas Soome	  \ set it as acpi-user-options and move remaining to addr'
3744a5d661aSToomas Soome	  2dup			( addr len len' addr' len' addr' )
3754a5d661aSToomas Soome	  \ skip to next option in list
3764a5d661aSToomas Soome	  \ loop to first , or bl or 0
3774a5d661aSToomas Soome	  begin
3784a5d661aSToomas Soome	    dup c@ [char] , <> >r
3794a5d661aSToomas Soome	    dup c@ bl <> >r
3804a5d661aSToomas Soome	    dup c@ 0<> r> r> and and
3814a5d661aSToomas Soome	  while
3824a5d661aSToomas Soome	    1+ swap 1- swap
3834a5d661aSToomas Soome	  repeat
3844a5d661aSToomas Soome				( addr len len' addr' len" addr" )
3854a5d661aSToomas Soome	  >r >r 		( addr len len' addr' R: addr" len" )
3864a5d661aSToomas Soome	  over r@ -		( addr len len' addr' proplen R: addr" len" )
3874a5d661aSToomas Soome	  dup 5 +		( addr len len' addr' proplen proplen+5 )
3884a5d661aSToomas Soome	  allocate abort" out of memory"
3894a5d661aSToomas Soome
3904a5d661aSToomas Soome	  0 s" set " strcat	( addr len len' addr' proplen caddr clen )
3914a5d661aSToomas Soome	  >r >r 2dup r> r> 2swap strcat ( addr len len' addr' proplen caddr clen )
3924a5d661aSToomas Soome	  2dup + 0 swap c!	\ terminate with 0
3934a5d661aSToomas Soome	  2dup evaluate drop free drop
3944a5d661aSToomas Soome				( addr len len' addr' proplen R: addr" len" )
3954a5d661aSToomas Soome	  \ acpi-user-options is set, now move remaining string to its place.
3964a5d661aSToomas Soome	  \ addr: -B, addr': acpi... addr": reminder
3974a5d661aSToomas Soome	  swap			( addr len len' proplen addr' )
3984a5d661aSToomas Soome	  r> r>			( addr len len' proplen addr' len" addr" )
3994a5d661aSToomas Soome	  dup c@ [char] , = if
4004a5d661aSToomas Soome	    \ skip , and move addr" to addr'
4014a5d661aSToomas Soome	    1+ swap 1-		( addr len len' proplen addr' addr" len" )
4024a5d661aSToomas Soome	    rot	swap 1+ move	( addr len len' proplen )
4034a5d661aSToomas Soome	  else	\ its bl or 0	( addr len len' proplen addr' len" addr" )
4044a5d661aSToomas Soome	    \ for both bl and 0 we need to copy to addr'-1 to remove
4054a5d661aSToomas Soome	    \ comma, then reset boot-args, and recurse will clear -B
4064a5d661aSToomas Soome	    \ if there are no properties left.
4074a5d661aSToomas Soome	    dup c@ 0= if
4084a5d661aSToomas Soome	      2drop		( addr len len' proplen addr' )
4094a5d661aSToomas Soome	      1- 0 swap c!	( addr len len' proplen )
4104a5d661aSToomas Soome	    else
4114a5d661aSToomas Soome	      >r >r		( addr len len' proplen addr' R: addr" len" )
4124a5d661aSToomas Soome	      1- swap 1+ swap
4134a5d661aSToomas Soome	      r> r>		( addr len len' proplen addr' len" addr" )
4144a5d661aSToomas Soome	      rot rot move	( addr len len' proplen )
4154a5d661aSToomas Soome	    then
4164a5d661aSToomas Soome	  then
4174a5d661aSToomas Soome
4184a5d661aSToomas Soome	  2swap 2drop		( len' proplen )
4194a5d661aSToomas Soome	  nip			( proplen )
4204a5d661aSToomas Soome	  baddr blen rot -
4214a5d661aSToomas Soome	  s" boot-args" setenv
4224a5d661aSToomas Soome	  recurse
4234a5d661aSToomas Soome	  exit
4244a5d661aSToomas Soome	else
4254a5d661aSToomas Soome				( addr len len' addr' )
4264a5d661aSToomas Soome	  \ not acpi option, skip to next option in list
4274a5d661aSToomas Soome	  \ loop to first , or bl or 0
4284a5d661aSToomas Soome	  begin
4294a5d661aSToomas Soome	    dup c@ [char] , <> >r
4304a5d661aSToomas Soome	    dup c@ bl <> >r
4314a5d661aSToomas Soome	    dup c@ 0<> r> r> and and
4324a5d661aSToomas Soome	  while
4334a5d661aSToomas Soome	    1+ swap 1- swap
4344a5d661aSToomas Soome	  repeat
4354a5d661aSToomas Soome	  \ if its ',', skip over
4364a5d661aSToomas Soome	  dup c@ [char] , = if
4374a5d661aSToomas Soome	    1+ swap 1- swap
4384a5d661aSToomas Soome	  then
4394a5d661aSToomas Soome	then
4404a5d661aSToomas Soome      repeat
4414a5d661aSToomas Soome				( addr len len' addr' )
4424a5d661aSToomas Soome      \ this block is done, remove addr and len from stack
4434a5d661aSToomas Soome      2swap 2drop swap
4444a5d661aSToomas Soome    then
4454a5d661aSToomas Soome
4464a5d661aSToomas Soome    over c@ [char] - = if	( addr len )
4474a5d661aSToomas Soome      2dup 1- swap 1+		( addr len len' addr' )
4484a5d661aSToomas Soome      begin			\ loop till ' ' or 0
4494a5d661aSToomas Soome	dup c@ dup 0<> swap bl <> and
4504a5d661aSToomas Soome      while
4514a5d661aSToomas Soome	dup c@ [char] s = if
4524a5d661aSToomas Soome	  s" set boot_single=YES" evaluate TRUE
4534a5d661aSToomas Soome	else dup c@ [char] v = if
4544a5d661aSToomas Soome	  s" set boot_verbose=YES" evaluate TRUE
4554a5d661aSToomas Soome	else dup c@ [char] k = if
4564a5d661aSToomas Soome	  s" set boot_kmdb=YES" evaluate TRUE
4574a5d661aSToomas Soome	else dup c@ [char] d = if
4584a5d661aSToomas Soome	  s" set boot_debug=YES" evaluate TRUE
4594a5d661aSToomas Soome	else dup c@ [char] r = if
4604a5d661aSToomas Soome	  s" set boot_reconfigure=YES" evaluate TRUE
4614a5d661aSToomas Soome	else dup c@ [char] a = if
4624a5d661aSToomas Soome	  s" set boot_ask=YES" evaluate TRUE
4634a5d661aSToomas Soome	then then then then then then
4644a5d661aSToomas Soome	dup TRUE = if
4654a5d661aSToomas Soome	  drop
4664a5d661aSToomas Soome	  dup >r		( addr len len' addr' R: addr' )
4674a5d661aSToomas Soome	  1+ swap 1-		( addr len addr'+1 len'-1 R: addr' )
4684a5d661aSToomas Soome	  r> swap move		( addr len )
4694a5d661aSToomas Soome
4704a5d661aSToomas Soome	  2drop baddr blen 1-
4714a5d661aSToomas Soome	  \ check if we have space after '-', if so, drop '- '
4724a5d661aSToomas Soome	  swap dup 1+ c@ bl = if
4734a5d661aSToomas Soome	      2 + swap 2 -
4744a5d661aSToomas Soome	  else
4754a5d661aSToomas Soome	      swap
4764a5d661aSToomas Soome	  then
4774a5d661aSToomas Soome	  dup dup 0= swap 1 = or if	\ empty or only '-' is left.
4784a5d661aSToomas Soome	    2drop
4794a5d661aSToomas Soome	    s" boot-args" unsetenv
4804a5d661aSToomas Soome	    exit
4814a5d661aSToomas Soome	  else
4824a5d661aSToomas Soome	    s" boot-args" setenv
4834a5d661aSToomas Soome	  then
4844a5d661aSToomas Soome	  recurse
4854a5d661aSToomas Soome	  exit
4864a5d661aSToomas Soome	then
4874a5d661aSToomas Soome	1+ swap 1- swap
4884a5d661aSToomas Soome      repeat
4894a5d661aSToomas Soome
4904a5d661aSToomas Soome      2swap 2drop
4914a5d661aSToomas Soome      dup c@ 0= if		\ end of string
4924a5d661aSToomas Soome	2drop
4934a5d661aSToomas Soome	exit
4944a5d661aSToomas Soome      else
4954a5d661aSToomas Soome	swap
4964a5d661aSToomas Soome      then
4974a5d661aSToomas Soome    then
4984a5d661aSToomas Soome  repeat
4994a5d661aSToomas Soome
5004a5d661aSToomas Soome  2drop
5014a5d661aSToomas Soome;
5024a5d661aSToomas Soome
5034a5d661aSToomas Soome\ ***** start
5044a5d661aSToomas Soome\
5054a5d661aSToomas Soome\       Initializes support.4th global variables, sets loader_conf_files,
50657164215SToomas Soome\       processes conf files, and, if any one such file was successfully
5074a5d661aSToomas Soome\       read to the end, loads kernel and modules.
5084a5d661aSToomas Soome
5094a5d661aSToomas Soome: start  ( -- ) ( throws: abort & user-defined )
5104a5d661aSToomas Soome  s" /boot/defaults/loader.conf" initialize
5114a5d661aSToomas Soome  include_bootenv
5124a5d661aSToomas Soome  include_conf_files
5134a5d661aSToomas Soome  include_transient
514749dbbabSToomas Soome  \ If the user defined a post-initialize hook, call it now
515749dbbabSToomas Soome  s" post-initialize" sfind if execute else drop then
5164a5d661aSToomas Soome  parse-boot-args
5174a5d661aSToomas Soome  \ Will *NOT* try to load kernel and modules if no configuration file
51857164215SToomas Soome  \ was successfully loaded!
5194a5d661aSToomas Soome  any_conf_read? if
5204a5d661aSToomas Soome    s" loader_delay" getenv -1 = if
5214a5d661aSToomas Soome      load_xen_throw
5224a5d661aSToomas Soome      load_kernel
5234a5d661aSToomas Soome      load_modules
5244a5d661aSToomas Soome    else
5254a5d661aSToomas Soome      drop
5264a5d661aSToomas Soome      ." Loading Kernel and Modules (Ctrl-C to Abort)" cr
5274a5d661aSToomas Soome      s" also support-functions" evaluate
5284a5d661aSToomas Soome      s" set delay_command='load_xen_throw load_kernel load_modules'" evaluate
5294a5d661aSToomas Soome      s" set delay_showdots" evaluate
5304a5d661aSToomas Soome      delay_execute
5314a5d661aSToomas Soome    then
5324a5d661aSToomas Soome  then
5334a5d661aSToomas Soome;
5344a5d661aSToomas Soome
5354a5d661aSToomas Soome\ ***** initialize
5364a5d661aSToomas Soome\
5374a5d661aSToomas Soome\	Overrides support.4th initialization word with one that does
5384a5d661aSToomas Soome\	everything start one does, short of loading the kernel and
539749dbbabSToomas Soome\	modules. Returns a flag.
5404a5d661aSToomas Soome
5414a5d661aSToomas Soome: initialize ( -- flag )
5424a5d661aSToomas Soome  s" /boot/defaults/loader.conf" initialize
5434a5d661aSToomas Soome  include_bootenv
5444a5d661aSToomas Soome  include_conf_files
5454a5d661aSToomas Soome  include_transient
546749dbbabSToomas Soome  \ If the user defined a post-initialize hook, call it now
547749dbbabSToomas Soome  s" post-initialize" sfind if execute else drop then
5484a5d661aSToomas Soome  parse-boot-args
5494a5d661aSToomas Soome  any_conf_read?
5504a5d661aSToomas Soome;
5514a5d661aSToomas Soome
5524a5d661aSToomas Soome\ ***** read-conf
5534a5d661aSToomas Soome\
5544a5d661aSToomas Soome\	Read a configuration file, whose name was specified on the command
5554a5d661aSToomas Soome\	line, if interpreted, or given on the stack, if compiled in.
5564a5d661aSToomas Soome
5574a5d661aSToomas Soome: (read-conf)  ( addr len -- )
5584a5d661aSToomas Soome  conf_files string=
5594a5d661aSToomas Soome  include_conf_files \ Will recurse on new loader_conf_files definitions
5604a5d661aSToomas Soome;
5614a5d661aSToomas Soome
5624a5d661aSToomas Soome: read-conf  ( <filename> | addr len -- ) ( throws: abort & user-defined )
5634a5d661aSToomas Soome  state @ if
5644a5d661aSToomas Soome    \ Compiling
5654a5d661aSToomas Soome    postpone (read-conf)
5664a5d661aSToomas Soome  else
5674a5d661aSToomas Soome    \ Interpreting
5684a5d661aSToomas Soome    bl parse (read-conf)
5694a5d661aSToomas Soome  then
5704a5d661aSToomas Soome; immediate
5714a5d661aSToomas Soome
5724a5d661aSToomas Soome\ show, enable, disable, toggle module loading. They all take module from
5734a5d661aSToomas Soome\ the next word
5744a5d661aSToomas Soome
5754a5d661aSToomas Soome: set-module-flag ( module_addr val -- ) \ set and print flag
5764a5d661aSToomas Soome  over module.flag !
5774a5d661aSToomas Soome  dup module.name strtype
5784a5d661aSToomas Soome  module.flag @ if ."  will be loaded" else ."  will not be loaded" then cr
5794a5d661aSToomas Soome;
5804a5d661aSToomas Soome
5814a5d661aSToomas Soome: enable-module find-module ?dup if true set-module-flag then ;
5824a5d661aSToomas Soome
5834a5d661aSToomas Soome: disable-module find-module ?dup if false set-module-flag then ;
5844a5d661aSToomas Soome
5854a5d661aSToomas Soome: toggle-module find-module ?dup if dup module.flag @ 0= set-module-flag then ;
5864a5d661aSToomas Soome
5874a5d661aSToomas Soome\ ***** show-module
5884a5d661aSToomas Soome\
5894a5d661aSToomas Soome\	Show loading information about a module.
5904a5d661aSToomas Soome
5914a5d661aSToomas Soome: show-module ( <module> -- ) find-module ?dup if show-one-module then ;
5924a5d661aSToomas Soome
5934a5d661aSToomas Soome\ Words to be used inside configuration files
5944a5d661aSToomas Soome
5954a5d661aSToomas Soome: retry false ;         \ For use in load error commands
5964a5d661aSToomas Soome: ignore true ;         \ For use in load error commands
5974a5d661aSToomas Soome
5984a5d661aSToomas Soome\ Return to strict forth vocabulary
5994a5d661aSToomas Soome
6004a5d661aSToomas Soome: #type
6014a5d661aSToomas Soome  over - >r
6024a5d661aSToomas Soome  type
6034a5d661aSToomas Soome  r> spaces
6044a5d661aSToomas Soome;
6054a5d661aSToomas Soome
6064a5d661aSToomas Soome: .? 2 spaces 2swap 15 #type 2 spaces type cr ;
6074a5d661aSToomas Soome
6084a5d661aSToomas Soome: ?
6094a5d661aSToomas Soome  ['] ? execute
6104a5d661aSToomas Soome  s" boot-conf" s" load kernel and modules, then autoboot" .?
6114a5d661aSToomas Soome  s" read-conf" s" read a configuration file" .?
6124a5d661aSToomas Soome  s" enable-module" s" enable loading of a module" .?
6134a5d661aSToomas Soome  s" disable-module" s" disable loading of a module" .?
6144a5d661aSToomas Soome  s" toggle-module" s" toggle loading of a module" .?
6154a5d661aSToomas Soome  s" show-module" s" show module load data" .?
6164a5d661aSToomas Soome  s" try-include" s" try to load/interpret files" .?
6174a5d661aSToomas Soome  s" beadm" s" list or activate Boot Environments" .?
6184a5d661aSToomas Soome;
6194a5d661aSToomas Soome
6204a5d661aSToomas Soome: try-include ( -- ) \ see loader.4th(8)
6214a5d661aSToomas Soome  ['] include ( -- xt ) \ get the execution token of `include'
6224a5d661aSToomas Soome  catch ( xt -- exception# | 0 ) if \ failed
6234a5d661aSToomas Soome    LF parse ( c -- s-addr/u ) 2drop \ advance >in to EOL (drop data)
6244a5d661aSToomas Soome    \ ... prevents words unused by `include' from being interpreted
6254a5d661aSToomas Soome  then
6264a5d661aSToomas Soome; immediate \ interpret immediately for access to `source' (aka tib)
6274a5d661aSToomas Soome
6284a5d661aSToomas Soomeinclude /boot/forth/beadm.4th
6294a5d661aSToomas Soomeonly forth definitions
630