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 Soomes" arch-i386" environment? [if] [if] 31199767f8SToomas Soome s" loader_version" environment? [if] 32199767f8SToomas Soome 11 < [if] 33199767f8SToomas Soome .( Loader version 1.1+ required) cr 34199767f8SToomas Soome abort 35199767f8SToomas Soome [then] 36199767f8SToomas Soome [else] 37199767f8SToomas Soome .( Could not get loader version!) cr 38199767f8SToomas Soome abort 39199767f8SToomas Soome [then] 40199767f8SToomas Soome[then] [then] 41199767f8SToomas Soome 42199767f8SToomas Soomeinclude /boot/forth/support.4th 43199767f8SToomas Soomeinclude /boot/forth/color.4th 44199767f8SToomas Soomeinclude /boot/forth/delay.4th 45199767f8SToomas Soomeinclude /boot/forth/check-password.4th 46a1625066SAndy Fiddamanefi? [if] 47eee59048SToomas Soome include /boot/forth/efi.4th 48eee59048SToomas Soome[then] 49199767f8SToomas Soome 50199767f8SToomas Soomeonly forth definitions 51199767f8SToomas Soome 52199767f8SToomas Soome: bootmsg ( -- ) 53199767f8SToomas Soome loader_color? dup ( -- bool bool ) 54199767f8SToomas Soome if 7 fg 4 bg then 55199767f8SToomas Soome ." Booting..." 56199767f8SToomas Soome if me then 57199767f8SToomas Soome cr 58199767f8SToomas Soome; 59199767f8SToomas Soome 60199767f8SToomas Soome: try-menu-unset 61199767f8SToomas Soome \ menu-unset may not be present 62199767f8SToomas Soome s" beastie_disable" getenv 63199767f8SToomas Soome dup -1 <> if 64199767f8SToomas Soome s" YES" compare-insensitive 0= if 65199767f8SToomas Soome exit 66199767f8SToomas Soome then 67199767f8SToomas Soome else 68199767f8SToomas Soome drop 69199767f8SToomas Soome then 70199767f8SToomas Soome s" menu-unset" 71199767f8SToomas Soome sfind if 72199767f8SToomas Soome execute 73199767f8SToomas Soome else 74199767f8SToomas Soome drop 75199767f8SToomas Soome then 76199767f8SToomas Soome s" menusets-unset" 77199767f8SToomas Soome sfind if 78199767f8SToomas Soome execute 79199767f8SToomas Soome else 80199767f8SToomas Soome drop 81199767f8SToomas Soome then 82199767f8SToomas Soome; 83199767f8SToomas Soome 84199767f8SToomas Soomeonly forth also support-functions also builtins definitions 85199767f8SToomas Soome 86199767f8SToomas Soome\ the boot-args was parsed to individual options while loaded 87199767f8SToomas Soome\ now compose boot-args, so the boot can set kernel arguments 88199767f8SToomas Soome\ note the command line switched for boot command will cause 89199767f8SToomas Soome\ environment variable boot-args to be ignored 90199767f8SToomas Soome\ There are 2 larger strings, acpi-user-options and existing boot-args 91199767f8SToomas Soome\ other switches are 1 byte each, so allocate boot-args+acpi + extra bytes 92199767f8SToomas Soome\ for rest. Be sure to review this, if more options are to be added into 93199767f8SToomas Soome\ environment. 94199767f8SToomas Soome 95199767f8SToomas Soome: set-boot-args { | addr len baddr blen aaddr alen -- } 96199767f8SToomas Soome s" boot-args" getenv dup -1 <> if 97199767f8SToomas Soome to blen to baddr 98199767f8SToomas Soome else 99199767f8SToomas Soome drop 100199767f8SToomas Soome then 101199767f8SToomas Soome s" acpi-user-options" getenv dup -1 <> if 102199767f8SToomas Soome to alen to aaddr 103199767f8SToomas Soome else 104199767f8SToomas Soome drop 105199767f8SToomas Soome then 106199767f8SToomas Soome 107199767f8SToomas Soome \ allocate temporary space. max is: 108199767f8SToomas Soome \ 7 kernel switches 109199767f8SToomas Soome \ 26 for acpi, so use 40 for safety 110199767f8SToomas Soome blen alen 40 + + allocate abort" out of memory" 111199767f8SToomas Soome to addr 112199767f8SToomas Soome \ boot-addr may have file name before options, copy it to addr 113199767f8SToomas Soome baddr 0<> if 114199767f8SToomas Soome baddr c@ [char] - <> if 115199767f8SToomas Soome baddr blen [char] - strchr ( addr len ) 116199767f8SToomas Soome dup 0= if \ no options, copy all 117199767f8SToomas Soome 2drop 118199767f8SToomas Soome baddr addr blen move 119199767f8SToomas Soome blen to len 120199767f8SToomas Soome 0 to blen 121199767f8SToomas Soome 0 to baddr 122199767f8SToomas Soome else ( addr len ) 123199767f8SToomas Soome dup blen 124199767f8SToomas Soome swap - 125199767f8SToomas Soome to len ( addr len ) 126199767f8SToomas Soome to blen ( addr ) 127a1625066SAndy Fiddaman baddr addr len move ( addr ) 128199767f8SToomas Soome to baddr \ baddr points now to first option 129199767f8SToomas Soome then 130199767f8SToomas Soome then 131199767f8SToomas Soome then 132199767f8SToomas Soome \ now add kernel switches 133199767f8SToomas Soome len 0<> if 134199767f8SToomas Soome bl addr len + c! len 1+ to len 135199767f8SToomas Soome then 136199767f8SToomas Soome [char] - addr len + c! len 1+ to len 137199767f8SToomas Soome 138199767f8SToomas Soome s" boot_single" getenv dup -1 <> if 139199767f8SToomas Soome s" YES" compare-insensitive 0= if 140199767f8SToomas Soome [char] s addr len + c! len 1+ to len 141199767f8SToomas Soome then 142199767f8SToomas Soome else 143199767f8SToomas Soome drop 144199767f8SToomas Soome then 145199767f8SToomas Soome s" boot_verbose" getenv dup -1 <> if 146199767f8SToomas Soome s" YES" compare-insensitive 0= if 147199767f8SToomas Soome [char] v addr len + c! len 1+ to len 148199767f8SToomas Soome then 149199767f8SToomas Soome else 150199767f8SToomas Soome drop 151199767f8SToomas Soome then 152199767f8SToomas Soome s" boot_kmdb" getenv dup -1 <> if 153199767f8SToomas Soome s" YES" compare-insensitive 0= if 154199767f8SToomas Soome [char] k addr len + c! len 1+ to len 155199767f8SToomas Soome then 156199767f8SToomas Soome else 157199767f8SToomas Soome drop 158199767f8SToomas Soome then 159c3e6a6edSJohn Levon s" boot_drop_into_kmdb" getenv dup -1 <> if 160199767f8SToomas Soome s" YES" compare-insensitive 0= if 161199767f8SToomas Soome [char] d addr len + c! len 1+ to len 162199767f8SToomas Soome then 163199767f8SToomas Soome else 164199767f8SToomas Soome drop 165199767f8SToomas Soome then 166199767f8SToomas Soome s" boot_reconfigure" getenv dup -1 <> if 167199767f8SToomas Soome s" YES" compare-insensitive 0= if 168199767f8SToomas Soome [char] r addr len + c! len 1+ to len 169199767f8SToomas Soome then 170199767f8SToomas Soome else 171199767f8SToomas Soome drop 172199767f8SToomas Soome then 173199767f8SToomas Soome s" boot_ask" getenv dup -1 <> if 174199767f8SToomas Soome s" YES" compare-insensitive 0= if 175199767f8SToomas Soome [char] a addr len + c! len 1+ to len 176199767f8SToomas Soome then 177199767f8SToomas Soome else 178199767f8SToomas Soome drop 179199767f8SToomas Soome then 180199767f8SToomas Soome 181199767f8SToomas Soome \ now add remining boot args if blen != 0. 182199767f8SToomas Soome \ baddr[0] is '-', if baddr[1] != 'B' append to addr, 183199767f8SToomas Soome \ otherwise add space then copy 184199767f8SToomas Soome blen 0<> if 185199767f8SToomas Soome baddr 1+ c@ [char] B = if 186199767f8SToomas Soome addr len + 1- c@ [char] - = if \ if addr[len -1] == '-' 187199767f8SToomas Soome baddr 1+ to baddr 188199767f8SToomas Soome blen 1- to blen 189199767f8SToomas Soome else 190199767f8SToomas Soome bl addr len + c! len 1+ to len 191199767f8SToomas Soome then 192199767f8SToomas Soome else 193199767f8SToomas Soome baddr 1+ to baddr 194199767f8SToomas Soome blen 1- to blen 195199767f8SToomas Soome then 196199767f8SToomas Soome baddr addr len + blen move 197199767f8SToomas Soome len blen + to len 198199767f8SToomas Soome 0 to baddr 199199767f8SToomas Soome 0 to blen 200199767f8SToomas Soome then 201199767f8SToomas Soome \ last part - add acpi. 202199767f8SToomas Soome alen 0<> if 203199767f8SToomas Soome addr len + 1- c@ [char] - <> if 204199767f8SToomas Soome bl addr len + c! len 1+ to len 205199767f8SToomas Soome [char] - addr len + c! len 1+ to len 206199767f8SToomas Soome then 207199767f8SToomas Soome s" B acpi-user-options=" dup -rot ( len addr len ) 208199767f8SToomas Soome addr len + swap move ( len ) 209199767f8SToomas Soome len + to len 210199767f8SToomas Soome aaddr addr len + alen move 211199767f8SToomas Soome len alen + to len 212199767f8SToomas Soome then 213199767f8SToomas Soome 214199767f8SToomas Soome \ check for left over '-' 215199767f8SToomas Soome addr len 1- + c@ [char] - = if 216199767f8SToomas Soome len 1- to len 217199767f8SToomas Soome \ but now we may also have left over ' ' 218199767f8SToomas Soome len if ( len <> 0 ) 219199767f8SToomas Soome addr len 1- + c@ bl = if 220199767f8SToomas Soome len 1- to len 221199767f8SToomas Soome then 222199767f8SToomas Soome then 223199767f8SToomas Soome then 224199767f8SToomas Soome 225199767f8SToomas Soome \ if len != 0, set boot-args 226199767f8SToomas Soome len 0<> if 227199767f8SToomas Soome addr len s" boot-args" setenv 228199767f8SToomas Soome then 229199767f8SToomas Soome addr free drop 230199767f8SToomas Soome; 231199767f8SToomas Soome 232199767f8SToomas Soome: boot 233199767f8SToomas Soome 0= if ( interpreted ) get_arguments then 234199767f8SToomas Soome set-boot-args 235199767f8SToomas Soome 236199767f8SToomas Soome \ Unload only if a path was passed. Paths start with / 237199767f8SToomas Soome dup if 238199767f8SToomas Soome >r over r> swap 239199767f8SToomas Soome c@ [char] / = if 240199767f8SToomas Soome 0 1 unload drop 241199767f8SToomas Soome else 242199767f8SToomas Soome s" kernelname" getenv? if ( a kernel has been loaded ) 243199767f8SToomas Soome try-menu-unset 244199767f8SToomas Soome bootmsg 1 boot exit 245199767f8SToomas Soome then 246199767f8SToomas Soome load_kernel_and_modules 247199767f8SToomas Soome ?dup if exit then 248199767f8SToomas Soome try-menu-unset 249199767f8SToomas Soome bootmsg 0 1 boot exit 250199767f8SToomas Soome then 251199767f8SToomas Soome else 252199767f8SToomas Soome s" kernelname" getenv? if ( a kernel has been loaded ) 253199767f8SToomas Soome try-menu-unset 254199767f8SToomas Soome bootmsg 1 boot exit 255199767f8SToomas Soome then 256199767f8SToomas Soome load_kernel_and_modules 257199767f8SToomas Soome ?dup if exit then 258199767f8SToomas Soome try-menu-unset 259199767f8SToomas Soome bootmsg 0 1 boot exit 260199767f8SToomas Soome then 261199767f8SToomas Soome load_kernel_and_modules 262199767f8SToomas Soome ?dup 0= if bootmsg 0 1 boot then 263199767f8SToomas Soome; 264199767f8SToomas Soome 265199767f8SToomas Soome\ ***** boot-conf 266199767f8SToomas Soome\ 267199767f8SToomas Soome\ Prepares to boot as specified by loaded configuration files. 268199767f8SToomas Soome 269199767f8SToomas Soome: boot-conf 270199767f8SToomas Soome 0= if ( interpreted ) get_arguments then 271199767f8SToomas Soome 0 1 unload drop 272199767f8SToomas Soome load_kernel_and_modules 273199767f8SToomas Soome ?dup 0= if 0 1 autoboot then 274199767f8SToomas Soome; 275199767f8SToomas Soome 276199767f8SToomas Soomealso forth definitions previous 277199767f8SToomas Soome 278199767f8SToomas Soomebuiltin: boot 279199767f8SToomas Soomebuiltin: boot-conf 280199767f8SToomas Soome 281199767f8SToomas Soomeonly forth definitions also support-functions 282199767f8SToomas Soome 283a1625066SAndy Fiddaman\ 284199767f8SToomas Soome\ in case the boot-args is set, parse it and extract following options: 285199767f8SToomas Soome\ -a to boot_ask=YES 286199767f8SToomas Soome\ -s to boot_single=YES 287199767f8SToomas Soome\ -v to boot_verbose=YES 288199767f8SToomas Soome\ -k to boot_kmdb=YES 289c3e6a6edSJohn Levon\ -d to boot_drop_into_kmdb=YES 290199767f8SToomas Soome\ -r to boot_reconfigure=YES 291199767f8SToomas Soome\ -B acpi-user-options=X to acpi-user-options=X 292a1625066SAndy Fiddaman\ 293199767f8SToomas Soome\ This is needed so that the menu can manage these options. Unfortunately, this 2945bdf86e2SToomas Soome\ also means that boot-args will override previously set options, but we have no 2955bdf86e2SToomas Soome\ way to control the processing order here. boot-args will be rebuilt at boot. 296a1625066SAndy Fiddaman\ 297199767f8SToomas Soome\ NOTE: The best way to address the order is to *not* set any above options 298199767f8SToomas Soome\ in boot-args. 299199767f8SToomas Soome 300199767f8SToomas Soome: parse-boot-args { | baddr blen -- } 301199767f8SToomas Soome s" boot-args" getenv dup -1 = if drop exit then 302199767f8SToomas Soome to blen 303199767f8SToomas Soome to baddr 304199767f8SToomas Soome 305199767f8SToomas Soome baddr blen 306199767f8SToomas Soome 307199767f8SToomas Soome \ loop over all instances of switch blocks, starting with '-' 308199767f8SToomas Soome begin 309199767f8SToomas Soome [char] - strchr 310199767f8SToomas Soome 2dup to blen to baddr 311199767f8SToomas Soome dup 0<> 312199767f8SToomas Soome while ( addr len ) \ points to - 313199767f8SToomas Soome \ block for switch B. keep it on top of the stack for case 314199767f8SToomas Soome \ the property list will get empty. 315199767f8SToomas Soome 316199767f8SToomas Soome over 1+ c@ [char] B = if 317199767f8SToomas Soome 2dup \ save "-B ...." in case options is empty 318199767f8SToomas Soome 2 - swap 2 + ( addr len len-2 addr+2 ) \ skip -B 319199767f8SToomas Soome 320199767f8SToomas Soome begin \ skip spaces 321199767f8SToomas Soome dup c@ bl = 322199767f8SToomas Soome while 323199767f8SToomas Soome 1+ swap 1- swap 324199767f8SToomas Soome repeat 325199767f8SToomas Soome 326199767f8SToomas Soome ( addr len len' addr' ) 327199767f8SToomas Soome \ its 3 cases now: end of string, -switch, or option list 328199767f8SToomas Soome 329199767f8SToomas Soome over 0= if \ end of string, remove trailing -B 330199767f8SToomas Soome 2drop ( addr len ) 331199767f8SToomas Soome swap 0 swap c! \ store 0 at -B 332199767f8SToomas Soome blen swap ( blen len ) 333199767f8SToomas Soome - ( rem ) 334199767f8SToomas Soome baddr swap ( addr rem ) 335199767f8SToomas Soome dup 0= if 336199767f8SToomas Soome s" boot-args" unsetenv 337199767f8SToomas Soome 2drop 338199767f8SToomas Soome exit 339199767f8SToomas Soome then 340199767f8SToomas Soome \ trailing space(s) 341199767f8SToomas Soome begin 342199767f8SToomas Soome over ( addr rem addr ) 343199767f8SToomas Soome over + 1- ( addr rem addr+rem-1 ) 344199767f8SToomas Soome c@ bl = 345199767f8SToomas Soome while 346199767f8SToomas Soome 1- swap ( rem-1 addr ) 347199767f8SToomas Soome over ( rem-1 addr rem-1 ) 348199767f8SToomas Soome over + ( rem-1 addr addr+rem-1 ) 349199767f8SToomas Soome 0 swap c! 350199767f8SToomas Soome swap 351199767f8SToomas Soome repeat 352199767f8SToomas Soome s" boot-args" setenv 353199767f8SToomas Soome recurse \ restart 354199767f8SToomas Soome exit 355199767f8SToomas Soome then 356199767f8SToomas Soome ( addr len len' addr' ) 357199767f8SToomas Soome dup c@ [char] - = if \ it is switch. set to boot-args 358199767f8SToomas Soome swap s" boot-args" setenv 359199767f8SToomas Soome 2drop 360199767f8SToomas Soome recurse \ restart 361199767f8SToomas Soome exit 362199767f8SToomas Soome then 363199767f8SToomas Soome ( addr len len' addr' ) 364199767f8SToomas Soome \ its options string "option1,option2,... -..." 365199767f8SToomas Soome \ cut acpi-user-options=xxx and restart the parser 366199767f8SToomas Soome \ or skip to next option block 367199767f8SToomas Soome begin 368199767f8SToomas Soome dup c@ dup 0<> swap bl <> and \ stop if space or 0 369199767f8SToomas Soome while 370199767f8SToomas Soome dup 18 s" acpi-user-options=" compare 0= if \ matched 371199767f8SToomas Soome ( addr len len' addr' ) 372199767f8SToomas Soome \ addr' points to acpi options, find its end [',' or ' ' or 0 ] 373199767f8SToomas Soome \ set it as acpi-user-options and move remaining to addr' 374199767f8SToomas Soome 2dup ( addr len len' addr' len' addr' ) 375199767f8SToomas Soome \ skip to next option in list 376199767f8SToomas Soome \ loop to first , or bl or 0 377199767f8SToomas Soome begin 378199767f8SToomas Soome dup c@ [char] , <> >r 379199767f8SToomas Soome dup c@ bl <> >r 380199767f8SToomas Soome dup c@ 0<> r> r> and and 381199767f8SToomas Soome while 382199767f8SToomas Soome 1+ swap 1- swap 383199767f8SToomas Soome repeat 384199767f8SToomas Soome ( addr len len' addr' len" addr" ) 385a1625066SAndy Fiddaman >r >r ( addr len len' addr' R: addr" len" ) 386199767f8SToomas Soome over r@ - ( addr len len' addr' proplen R: addr" len" ) 387199767f8SToomas Soome dup 5 + ( addr len len' addr' proplen proplen+5 ) 388199767f8SToomas Soome allocate abort" out of memory" 389199767f8SToomas Soome 390199767f8SToomas Soome 0 s" set " strcat ( addr len len' addr' proplen caddr clen ) 391199767f8SToomas Soome >r >r 2dup r> r> 2swap strcat ( addr len len' addr' proplen caddr clen ) 392199767f8SToomas Soome 2dup + 0 swap c! \ terminate with 0 393199767f8SToomas Soome 2dup evaluate drop free drop 394199767f8SToomas Soome ( addr len len' addr' proplen R: addr" len" ) 395199767f8SToomas Soome \ acpi-user-options is set, now move remaining string to its place. 396199767f8SToomas Soome \ addr: -B, addr': acpi... addr": reminder 397199767f8SToomas Soome swap ( addr len len' proplen addr' ) 398199767f8SToomas Soome r> r> ( addr len len' proplen addr' len" addr" ) 399199767f8SToomas Soome dup c@ [char] , = if 400199767f8SToomas Soome \ skip , and move addr" to addr' 401199767f8SToomas Soome 1+ swap 1- ( addr len len' proplen addr' addr" len" ) 402199767f8SToomas Soome rot swap 1+ move ( addr len len' proplen ) 403199767f8SToomas Soome else \ its bl or 0 ( addr len len' proplen addr' len" addr" ) 404199767f8SToomas Soome \ for both bl and 0 we need to copy to addr'-1 to remove 405199767f8SToomas Soome \ comma, then reset boot-args, and recurse will clear -B 406199767f8SToomas Soome \ if there are no properties left. 407199767f8SToomas Soome dup c@ 0= if 408199767f8SToomas Soome 2drop ( addr len len' proplen addr' ) 409199767f8SToomas Soome 1- 0 swap c! ( addr len len' proplen ) 410199767f8SToomas Soome else 411199767f8SToomas Soome >r >r ( addr len len' proplen addr' R: addr" len" ) 412199767f8SToomas Soome 1- swap 1+ swap 413199767f8SToomas Soome r> r> ( addr len len' proplen addr' len" addr" ) 414199767f8SToomas Soome rot rot move ( addr len len' proplen ) 415199767f8SToomas Soome then 416199767f8SToomas Soome then 417199767f8SToomas Soome 418199767f8SToomas Soome 2swap 2drop ( len' proplen ) 419199767f8SToomas Soome nip ( proplen ) 420199767f8SToomas Soome baddr blen rot - 421199767f8SToomas Soome s" boot-args" setenv 422199767f8SToomas Soome recurse 423199767f8SToomas Soome exit 424199767f8SToomas Soome else 425199767f8SToomas Soome ( addr len len' addr' ) 426199767f8SToomas Soome \ not acpi option, skip to next option in list 427199767f8SToomas Soome \ loop to first , or bl or 0 428199767f8SToomas Soome begin 429199767f8SToomas Soome dup c@ [char] , <> >r 430199767f8SToomas Soome dup c@ bl <> >r 431199767f8SToomas Soome dup c@ 0<> r> r> and and 432199767f8SToomas Soome while 433199767f8SToomas Soome 1+ swap 1- swap 434199767f8SToomas Soome repeat 435199767f8SToomas Soome \ if its ',', skip over 436199767f8SToomas Soome dup c@ [char] , = if 437199767f8SToomas Soome 1+ swap 1- swap 438199767f8SToomas Soome then 439199767f8SToomas Soome then 440199767f8SToomas Soome repeat 441199767f8SToomas Soome ( addr len len' addr' ) 442199767f8SToomas Soome \ this block is done, remove addr and len from stack 443199767f8SToomas Soome 2swap 2drop swap 444199767f8SToomas Soome then 445199767f8SToomas Soome 446199767f8SToomas Soome over c@ [char] - = if ( addr len ) 447199767f8SToomas Soome 2dup 1- swap 1+ ( addr len len' addr' ) 448199767f8SToomas Soome begin \ loop till ' ' or 0 449199767f8SToomas Soome dup c@ dup 0<> swap bl <> and 450199767f8SToomas Soome while 451199767f8SToomas Soome dup c@ [char] s = if 452199767f8SToomas Soome s" set boot_single=YES" evaluate TRUE 453199767f8SToomas Soome else dup c@ [char] v = if 454199767f8SToomas Soome s" set boot_verbose=YES" evaluate TRUE 455199767f8SToomas Soome else dup c@ [char] k = if 456199767f8SToomas Soome s" set boot_kmdb=YES" evaluate TRUE 457199767f8SToomas Soome else dup c@ [char] d = if 458c3e6a6edSJohn Levon s" set boot_drop_into_kmdb=YES" evaluate TRUE 459199767f8SToomas Soome else dup c@ [char] r = if 460199767f8SToomas Soome s" set boot_reconfigure=YES" evaluate TRUE 461199767f8SToomas Soome else dup c@ [char] a = if 462199767f8SToomas Soome s" set boot_ask=YES" evaluate TRUE 463199767f8SToomas Soome then then then then then then 464199767f8SToomas Soome dup TRUE = if 465199767f8SToomas Soome drop 466199767f8SToomas Soome dup >r ( addr len len' addr' R: addr' ) 467199767f8SToomas Soome 1+ swap 1- ( addr len addr'+1 len'-1 R: addr' ) 468199767f8SToomas Soome r> swap move ( addr len ) 469199767f8SToomas Soome 470199767f8SToomas Soome 2drop baddr blen 1- 471199767f8SToomas Soome \ check if we have space after '-', if so, drop '- ' 472199767f8SToomas Soome swap dup 1+ c@ bl = if 473199767f8SToomas Soome 2 + swap 2 - 474199767f8SToomas Soome else 475199767f8SToomas Soome swap 476199767f8SToomas Soome then 477199767f8SToomas Soome dup dup 0= swap 1 = or if \ empty or only '-' is left. 478199767f8SToomas Soome 2drop 479199767f8SToomas Soome s" boot-args" unsetenv 480199767f8SToomas Soome exit 481199767f8SToomas Soome else 482199767f8SToomas Soome s" boot-args" setenv 483199767f8SToomas Soome then 484199767f8SToomas Soome recurse 485199767f8SToomas Soome exit 486199767f8SToomas Soome then 487199767f8SToomas Soome 1+ swap 1- swap 488199767f8SToomas Soome repeat 489199767f8SToomas Soome 490199767f8SToomas Soome 2swap 2drop 491199767f8SToomas Soome dup c@ 0= if \ end of string 492199767f8SToomas Soome 2drop 493199767f8SToomas Soome exit 494199767f8SToomas Soome else 495199767f8SToomas Soome swap 496199767f8SToomas Soome then 497199767f8SToomas Soome then 498199767f8SToomas Soome repeat 499199767f8SToomas Soome 500199767f8SToomas Soome 2drop 501199767f8SToomas Soome; 502199767f8SToomas Soome 503199767f8SToomas Soome\ ***** start 504199767f8SToomas Soome\ 505199767f8SToomas Soome\ Initializes support.4th global variables, sets loader_conf_files, 506288c4f44SToomas Soome\ processes conf files, and, if any one such file was successfully 507199767f8SToomas Soome\ read to the end, loads kernel and modules. 508199767f8SToomas Soome 509199767f8SToomas Soome: start ( -- ) ( throws: abort & user-defined ) 510199767f8SToomas Soome s" /boot/defaults/loader.conf" initialize 511199767f8SToomas Soome include_bootenv 512199767f8SToomas Soome include_conf_files 513199767f8SToomas Soome include_transient 514231d7891SToomas Soome \ If the user defined a post-initialize hook, call it now 515231d7891SToomas Soome s" post-initialize" sfind if execute else drop then 516199767f8SToomas Soome parse-boot-args 517199767f8SToomas Soome \ Will *NOT* try to load kernel and modules if no configuration file 518288c4f44SToomas Soome \ was successfully loaded! 519199767f8SToomas Soome any_conf_read? if 520199767f8SToomas Soome s" loader_delay" getenv -1 = if 521199767f8SToomas Soome load_xen_throw 522199767f8SToomas Soome load_kernel 523199767f8SToomas Soome load_modules 524199767f8SToomas Soome else 525199767f8SToomas Soome drop 526199767f8SToomas Soome ." Loading Kernel and Modules (Ctrl-C to Abort)" cr 527199767f8SToomas Soome s" also support-functions" evaluate 528199767f8SToomas Soome s" set delay_command='load_xen_throw load_kernel load_modules'" evaluate 529199767f8SToomas Soome s" set delay_showdots" evaluate 530199767f8SToomas Soome delay_execute 531199767f8SToomas Soome then 532199767f8SToomas Soome then 533199767f8SToomas Soome; 534199767f8SToomas Soome 535199767f8SToomas Soome\ ***** initialize 536199767f8SToomas Soome\ 537199767f8SToomas Soome\ Overrides support.4th initialization word with one that does 538199767f8SToomas Soome\ everything start one does, short of loading the kernel and 539231d7891SToomas Soome\ modules. Returns a flag. 540199767f8SToomas Soome 541199767f8SToomas Soome: initialize ( -- flag ) 542199767f8SToomas Soome s" /boot/defaults/loader.conf" initialize 543199767f8SToomas Soome include_bootenv 544199767f8SToomas Soome include_conf_files 545199767f8SToomas Soome include_transient 546231d7891SToomas Soome \ If the user defined a post-initialize hook, call it now 547231d7891SToomas Soome s" post-initialize" sfind if execute else drop then 548199767f8SToomas Soome parse-boot-args 549199767f8SToomas Soome any_conf_read? 550199767f8SToomas Soome; 551199767f8SToomas Soome 552199767f8SToomas Soome\ ***** read-conf 553199767f8SToomas Soome\ 554199767f8SToomas Soome\ Read a configuration file, whose name was specified on the command 555199767f8SToomas Soome\ line, if interpreted, or given on the stack, if compiled in. 556199767f8SToomas Soome 557199767f8SToomas Soome: (read-conf) ( addr len -- ) 558199767f8SToomas Soome conf_files string= 559199767f8SToomas Soome include_conf_files \ Will recurse on new loader_conf_files definitions 560199767f8SToomas Soome; 561199767f8SToomas Soome 562199767f8SToomas Soome: read-conf ( <filename> | addr len -- ) ( throws: abort & user-defined ) 563199767f8SToomas Soome state @ if 564199767f8SToomas Soome \ Compiling 565199767f8SToomas Soome postpone (read-conf) 566199767f8SToomas Soome else 567199767f8SToomas Soome \ Interpreting 568199767f8SToomas Soome bl parse (read-conf) 569199767f8SToomas Soome then 570199767f8SToomas Soome; immediate 571199767f8SToomas Soome 572199767f8SToomas Soome\ show, enable, disable, toggle module loading. They all take module from 573199767f8SToomas Soome\ the next word 574199767f8SToomas Soome 575199767f8SToomas Soome: set-module-flag ( module_addr val -- ) \ set and print flag 576199767f8SToomas Soome over module.flag ! 577199767f8SToomas Soome dup module.name strtype 578199767f8SToomas Soome module.flag @ if ." will be loaded" else ." will not be loaded" then cr 579199767f8SToomas Soome; 580199767f8SToomas Soome 581199767f8SToomas Soome: enable-module find-module ?dup if true set-module-flag then ; 582199767f8SToomas Soome 583199767f8SToomas Soome: disable-module find-module ?dup if false set-module-flag then ; 584199767f8SToomas Soome 585199767f8SToomas Soome: toggle-module find-module ?dup if dup module.flag @ 0= set-module-flag then ; 586199767f8SToomas Soome 587199767f8SToomas Soome\ ***** show-module 588199767f8SToomas Soome\ 589199767f8SToomas Soome\ Show loading information about a module. 590199767f8SToomas Soome 591199767f8SToomas Soome: show-module ( <module> -- ) find-module ?dup if show-one-module then ; 592199767f8SToomas Soome 593f2aacf29SToomas Soome: set-module-path ( addr len <module> -- ) 594f2aacf29SToomas Soome find-module ?dup if 595f2aacf29SToomas Soome module.loadname string= 596f2aacf29SToomas Soome then 597f2aacf29SToomas Soome; 598f2aacf29SToomas Soome 599199767f8SToomas Soome\ Words to be used inside configuration files 600199767f8SToomas Soome 601199767f8SToomas Soome: retry false ; \ For use in load error commands 602199767f8SToomas Soome: ignore true ; \ For use in load error commands 603199767f8SToomas Soome 604199767f8SToomas Soome\ Return to strict forth vocabulary 605199767f8SToomas Soome 606199767f8SToomas Soome: #type 607199767f8SToomas Soome over - >r 608199767f8SToomas Soome type 609199767f8SToomas Soome r> spaces 610199767f8SToomas Soome; 611199767f8SToomas Soome 612199767f8SToomas Soome: .? 2 spaces 2swap 15 #type 2 spaces type cr ; 613199767f8SToomas Soome 614199767f8SToomas Soome: ? 615199767f8SToomas Soome ['] ? execute 616199767f8SToomas Soome s" boot-conf" s" load kernel and modules, then autoboot" .? 617199767f8SToomas Soome s" read-conf" s" read a configuration file" .? 618199767f8SToomas Soome s" enable-module" s" enable loading of a module" .? 619199767f8SToomas Soome s" disable-module" s" disable loading of a module" .? 620199767f8SToomas Soome s" toggle-module" s" toggle loading of a module" .? 621199767f8SToomas Soome s" show-module" s" show module load data" .? 622199767f8SToomas Soome s" try-include" s" try to load/interpret files" .? 623199767f8SToomas Soome s" beadm" s" list or activate Boot Environments" .? 624199767f8SToomas Soome; 625199767f8SToomas Soome 626199767f8SToomas Soome: try-include ( -- ) \ see loader.4th(8) 627199767f8SToomas Soome ['] include ( -- xt ) \ get the execution token of `include' 628199767f8SToomas Soome catch ( xt -- exception# | 0 ) if \ failed 629199767f8SToomas Soome LF parse ( c -- s-addr/u ) 2drop \ advance >in to EOL (drop data) 630199767f8SToomas Soome \ ... prevents words unused by `include' from being interpreted 631199767f8SToomas Soome then 632199767f8SToomas Soome; immediate \ interpret immediately for access to `source' (aka tib) 633199767f8SToomas Soome 634199767f8SToomas Soomeinclude /boot/forth/beadm.4th 635199767f8SToomas Soomeonly forth definitions 636