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