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