14a5d661aSToomas Soome\ Copyright (c) 2006-2015 Devin Teske <dteske@FreeBSD.org> 24a5d661aSToomas Soome\ All rights reserved. 34a5d661aSToomas Soome\ 44a5d661aSToomas Soome\ Redistribution and use in source and binary forms, with or without 54a5d661aSToomas Soome\ modification, are permitted provided that the following conditions 64a5d661aSToomas Soome\ are met: 74a5d661aSToomas Soome\ 1. Redistributions of source code must retain the above copyright 84a5d661aSToomas Soome\ notice, this list of conditions and the following disclaimer. 94a5d661aSToomas Soome\ 2. Redistributions in binary form must reproduce the above copyright 104a5d661aSToomas Soome\ notice, this list of conditions and the following disclaimer in the 114a5d661aSToomas Soome\ documentation and/or other materials provided with the distribution. 124a5d661aSToomas Soome\ 134a5d661aSToomas Soome\ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 144a5d661aSToomas Soome\ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 154a5d661aSToomas Soome\ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 164a5d661aSToomas Soome\ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 174a5d661aSToomas Soome\ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 184a5d661aSToomas Soome\ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 194a5d661aSToomas Soome\ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 204a5d661aSToomas Soome\ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 214a5d661aSToomas Soome\ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 224a5d661aSToomas Soome\ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 234a5d661aSToomas Soome\ SUCH DAMAGE. 244a5d661aSToomas Soome\ 254a5d661aSToomas Soome\ Copyright 2015 Toomas Soome <tsoome@me.com> 264a5d661aSToomas Soome 274a5d661aSToomas Soomemarker task-menu-commands.4th 284a5d661aSToomas Soome 294a5d661aSToomas Soomeinclude /boot/forth/menusets.4th 304a5d661aSToomas Soome 314a5d661aSToomas Soomeonly forth definitions 324a5d661aSToomas Soome 334a5d661aSToomas Soomevariable osconsole_state 344a5d661aSToomas Soomevariable acpi_state 354a5d661aSToomas Soomevariable kernel_state 364a5d661aSToomas Soomevariable root_state 374a5d661aSToomas Soomevariable kmdb_state 384a5d661aSToomas Soomevariable debug_state 394a5d661aSToomas Soome0 kmdb_state ! 404a5d661aSToomas Soome0 debug_state ! 414a5d661aSToomas Soome0 osconsole_state ! 424a5d661aSToomas Soome0 acpi_state ! 434a5d661aSToomas Soome0 kernel_state ! 444a5d661aSToomas Soome0 root_state ! 454a5d661aSToomas Soome 464a5d661aSToomas Soomealso menu-namespace also menu-command-helpers 474a5d661aSToomas Soome 484a5d661aSToomas Soome\ 494a5d661aSToomas Soome\ Boot 504a5d661aSToomas Soome\ 514a5d661aSToomas Soome 524a5d661aSToomas Soome: init_boot ( N -- N ) 534a5d661aSToomas Soome dup 544a5d661aSToomas Soome s" smartos" getenv? if 554a5d661aSToomas Soome s" set menu_keycode[N]=98" \ base command to execute 564a5d661aSToomas Soome else 574a5d661aSToomas Soome s" boot_single" getenv -1 <> if 584a5d661aSToomas Soome drop ( n n c-addr -- n n ) \ unused 594a5d661aSToomas Soome toggle_menuitem ( n n -- n n ) 604a5d661aSToomas Soome s" set menu_keycode[N]=115" \ base command to execute 614a5d661aSToomas Soome else 624a5d661aSToomas Soome s" set menu_keycode[N]=98" \ base command to execute 634a5d661aSToomas Soome then 644a5d661aSToomas Soome then 654a5d661aSToomas Soome 17 +c! \ replace 'N' with ASCII numeral 664a5d661aSToomas Soome evaluate 674a5d661aSToomas Soome; 684a5d661aSToomas Soome 694a5d661aSToomas Soome\ 704a5d661aSToomas Soome\ Alternate Boot 714a5d661aSToomas Soome\ 724a5d661aSToomas Soome 734a5d661aSToomas Soome: init_altboot ( N -- N ) 744a5d661aSToomas Soome dup 754a5d661aSToomas Soome s" smartos" getenv? if 764a5d661aSToomas Soome s" set menu_keycode[N]=114" \ base command to execute 774a5d661aSToomas Soome else 784a5d661aSToomas Soome s" boot_single" getenv -1 <> if 794a5d661aSToomas Soome drop ( n c-addr -- n ) \ unused 804a5d661aSToomas Soome toggle_menuitem ( n -- n ) 814a5d661aSToomas Soome s" set menu_keycode[N]=109" \ base command to execute 824a5d661aSToomas Soome else 834a5d661aSToomas Soome s" set menu_keycode[N]=115" \ base command to execute 844a5d661aSToomas Soome then 854a5d661aSToomas Soome then 864a5d661aSToomas Soome 17 +c! \ replace 'N' with ASCII numeral 874a5d661aSToomas Soome evaluate 884a5d661aSToomas Soome; 894a5d661aSToomas Soome 904a5d661aSToomas Soome: altboot ( N -- NOTREACHED ) 914a5d661aSToomas Soome s" smartos" getenv? if 924a5d661aSToomas Soome s" alt-boot-args" getenv dup -1 <> if 934a5d661aSToomas Soome s" boot-args" setenv ( c-addr/u -- ) 944a5d661aSToomas Soome then 954a5d661aSToomas Soome ." NoInstall/Recovery mode boot. login/pw: root/root" cr 964a5d661aSToomas Soome else 974a5d661aSToomas Soome s" boot_single" 2dup getenv -1 <> if 984a5d661aSToomas Soome drop ( c-addr/u c-addr -- c-addr/u ) \ unused 994a5d661aSToomas Soome unsetenv ( c-addr/u -- ) 1004a5d661aSToomas Soome else 1014a5d661aSToomas Soome 2drop ( c-addr/u -- ) \ unused 1024a5d661aSToomas Soome s" set boot_single=YES" evaluate 1034a5d661aSToomas Soome then 1044a5d661aSToomas Soome then 1054a5d661aSToomas Soome 0 boot ( state -- ) 1064a5d661aSToomas Soome; 1074a5d661aSToomas Soome 1084a5d661aSToomas Soome\ 1094a5d661aSToomas Soome\ Single User Mode 1104a5d661aSToomas Soome\ 1114a5d661aSToomas Soome 1124a5d661aSToomas Soome: singleuser_enabled? ( -- flag ) 1134a5d661aSToomas Soome s" boot_single" getenv -1 <> dup if 1144a5d661aSToomas Soome swap drop ( c-addr flag -- flag ) 1154a5d661aSToomas Soome then 1164a5d661aSToomas Soome; 1174a5d661aSToomas Soome 1184a5d661aSToomas Soome: singleuser_enable ( -- ) 1194a5d661aSToomas Soome s" set boot_single=YES" evaluate 1204a5d661aSToomas Soome; 1214a5d661aSToomas Soome 1224a5d661aSToomas Soome: singleuser_disable ( -- ) 1234a5d661aSToomas Soome s" boot_single" unsetenv 1244a5d661aSToomas Soome; 1254a5d661aSToomas Soome 1264a5d661aSToomas Soome: init_singleuser ( N -- N ) 1274a5d661aSToomas Soome singleuser_enabled? if 1284a5d661aSToomas Soome toggle_menuitem ( n -- n ) 1294a5d661aSToomas Soome then 1304a5d661aSToomas Soome; 1314a5d661aSToomas Soome 1324a5d661aSToomas Soome: toggle_singleuser ( N -- N TRUE ) 1334a5d661aSToomas Soome toggle_menuitem 1344a5d661aSToomas Soome menu-redraw 1354a5d661aSToomas Soome 1364a5d661aSToomas Soome \ Now we're going to make the change effective 1374a5d661aSToomas Soome 1384a5d661aSToomas Soome dup toggle_stateN @ 0= if 1394a5d661aSToomas Soome singleuser_disable 1404a5d661aSToomas Soome else 1414a5d661aSToomas Soome singleuser_enable 1424a5d661aSToomas Soome then 1434a5d661aSToomas Soome 1444a5d661aSToomas Soome TRUE \ loop menu again 1454a5d661aSToomas Soome; 1464a5d661aSToomas Soome 1474a5d661aSToomas Soome\ 1484a5d661aSToomas Soome\ Verbose Boot 1494a5d661aSToomas Soome\ 1504a5d661aSToomas Soome 1514a5d661aSToomas Soome: verbose_enabled? ( -- flag ) 1524a5d661aSToomas Soome s" boot_verbose" getenv -1 <> dup if 1534a5d661aSToomas Soome swap drop ( c-addr flag -- flag ) 1544a5d661aSToomas Soome then 1554a5d661aSToomas Soome; 1564a5d661aSToomas Soome 1574a5d661aSToomas Soome: verbose_enable ( -- ) 1584a5d661aSToomas Soome s" set boot_verbose=YES" evaluate 1594a5d661aSToomas Soome; 1604a5d661aSToomas Soome 1614a5d661aSToomas Soome: verbose_disable ( -- ) 1624a5d661aSToomas Soome s" boot_verbose" unsetenv 1634a5d661aSToomas Soome; 1644a5d661aSToomas Soome 1654a5d661aSToomas Soome: init_verbose ( N -- N ) 1664a5d661aSToomas Soome verbose_enabled? if 1674a5d661aSToomas Soome toggle_menuitem ( n -- n ) 1684a5d661aSToomas Soome then 1694a5d661aSToomas Soome; 1704a5d661aSToomas Soome 1714a5d661aSToomas Soome: toggle_verbose ( N -- N TRUE ) 1724a5d661aSToomas Soome toggle_menuitem 1734a5d661aSToomas Soome menu-redraw 1744a5d661aSToomas Soome 1754a5d661aSToomas Soome \ Now we're going to make the change effective 1764a5d661aSToomas Soome 1774a5d661aSToomas Soome dup toggle_stateN @ 0= if 1784a5d661aSToomas Soome verbose_disable 1794a5d661aSToomas Soome else 1804a5d661aSToomas Soome verbose_enable 1814a5d661aSToomas Soome then 1824a5d661aSToomas Soome 1834a5d661aSToomas Soome TRUE \ loop menu again 1844a5d661aSToomas Soome; 1854a5d661aSToomas Soome 1864a5d661aSToomas Soome\ 1874a5d661aSToomas Soome\ kmdb 1884a5d661aSToomas Soome\ 1894a5d661aSToomas Soome 1904a5d661aSToomas Soome: kmdb_enabled? ( -- flag ) 1914a5d661aSToomas Soome s" boot_kmdb" getenv -1 <> dup if 1924a5d661aSToomas Soome swap drop ( c-addr flag -- flag ) 1934a5d661aSToomas Soome then 1944a5d661aSToomas Soome; 1954a5d661aSToomas Soome 1964a5d661aSToomas Soome: kmdb_enable ( -- ) 1974a5d661aSToomas Soome s" set boot_kmdb=YES" evaluate 1984a5d661aSToomas Soome; 1994a5d661aSToomas Soome 2004a5d661aSToomas Soome: kmdb_disable ( -- ) 2014a5d661aSToomas Soome s" boot_kmdb" unsetenv 2024a5d661aSToomas Soome s" boot_debug" unsetenv 2034a5d661aSToomas Soome; 2044a5d661aSToomas Soome 2054a5d661aSToomas Soome: init_kmdb ( N -- N ) 2064a5d661aSToomas Soome dup kmdb_state ! \ store entry number for kmdb+debug 2074a5d661aSToomas Soome kmdb_enabled? if 2084a5d661aSToomas Soome toggle_menuitem ( n -- n ) 2094a5d661aSToomas Soome then 2104a5d661aSToomas Soome; 2114a5d661aSToomas Soome 2124a5d661aSToomas Soome: toggle_kmdb ( N -- N TRUE ) 2134a5d661aSToomas Soome toggle_menuitem 2144a5d661aSToomas Soome dup toggle_stateN @ 0= if ( kmdb is not set ) 2154a5d661aSToomas Soome debug_state @ if ( debug is set? ) 2164a5d661aSToomas Soome debug_state @ toggle_stateN @ if ( debug is enabled? ) 2174a5d661aSToomas Soome debug_state @ toggle_menuitem drop 2184a5d661aSToomas Soome then 2194a5d661aSToomas Soome then 2204a5d661aSToomas Soome then 2214a5d661aSToomas Soome menu-redraw 2224a5d661aSToomas Soome 2234a5d661aSToomas Soome \ Now we're going to make the change effective 2244a5d661aSToomas Soome 2254a5d661aSToomas Soome dup toggle_stateN @ 0= if 2264a5d661aSToomas Soome kmdb_disable 2274a5d661aSToomas Soome else 2284a5d661aSToomas Soome kmdb_enable 2294a5d661aSToomas Soome then 2304a5d661aSToomas Soome 2314a5d661aSToomas Soome TRUE \ loop menu again 2324a5d661aSToomas Soome; 2334a5d661aSToomas Soome 2344a5d661aSToomas Soome\ 2354a5d661aSToomas Soome\ kmdb + debug 2364a5d661aSToomas Soome\ 2374a5d661aSToomas Soome 2384a5d661aSToomas Soome: debug_disable ( -- ) 2394a5d661aSToomas Soome s" boot_debug" unsetenv 2404a5d661aSToomas Soome; 2414a5d661aSToomas Soome 2424a5d661aSToomas Soome: debug_enabled? ( -- flag ) 2434a5d661aSToomas Soome \ -d is only allowed with -k 2444a5d661aSToomas Soome s" boot_debug" getenv -1 <> kmdb_enabled? and dup if 2454a5d661aSToomas Soome swap drop ( c-addr flag -- flag ) 2464a5d661aSToomas Soome else 2474a5d661aSToomas Soome debug_disable \ make sure env is not set 2484a5d661aSToomas Soome then 2494a5d661aSToomas Soome; 2504a5d661aSToomas Soome 2514a5d661aSToomas Soome: debug_enable ( -- ) 2524a5d661aSToomas Soome kmdb_enable 2534a5d661aSToomas Soome s" set boot_debug=YES" evaluate 2544a5d661aSToomas Soome; 2554a5d661aSToomas Soome 2564a5d661aSToomas Soome: init_debug ( N -- N ) 2574a5d661aSToomas Soome dup debug_state ! \ store entry number for kmdb 2584a5d661aSToomas Soome kmdb_enabled? debug_enabled? and if 2594a5d661aSToomas Soome toggle_menuitem ( n -- n ) 2604a5d661aSToomas Soome then 2614a5d661aSToomas Soome; 2624a5d661aSToomas Soome 2634a5d661aSToomas Soome: toggle_debug ( N -- N TRUE ) 2644a5d661aSToomas Soome toggle_menuitem 2654a5d661aSToomas Soome kmdb_enabled? 0= if 2664a5d661aSToomas Soome kmdb_state @ toggle_menuitem drop 2674a5d661aSToomas Soome then 2684a5d661aSToomas Soome menu-redraw 2694a5d661aSToomas Soome 2704a5d661aSToomas Soome \ Now we're going to make the change effective 2714a5d661aSToomas Soome 2724a5d661aSToomas Soome dup toggle_stateN @ 0= if 2734a5d661aSToomas Soome debug_disable 2744a5d661aSToomas Soome else 2754a5d661aSToomas Soome debug_enable 2764a5d661aSToomas Soome then 2774a5d661aSToomas Soome 2784a5d661aSToomas Soome TRUE \ loop menu again 2794a5d661aSToomas Soome; 2804a5d661aSToomas Soome 2814a5d661aSToomas Soome\ 2824a5d661aSToomas Soome\ Reconfiguration boot 2834a5d661aSToomas Soome\ 2844a5d661aSToomas Soome 2854a5d661aSToomas Soome: reconfigure_enabled? ( -- flag ) 2864a5d661aSToomas Soome s" boot_reconfigure" getenv -1 <> dup if 2874a5d661aSToomas Soome swap drop ( c-addr flag -- flag ) 2884a5d661aSToomas Soome then 2894a5d661aSToomas Soome; 2904a5d661aSToomas Soome 2914a5d661aSToomas Soome: reconfigure_enable ( -- ) 2924a5d661aSToomas Soome s" set boot_reconfigure=YES" evaluate 2934a5d661aSToomas Soome; 2944a5d661aSToomas Soome 2954a5d661aSToomas Soome: reconfigure_disable ( -- ) 2964a5d661aSToomas Soome s" boot_reconfigure" unsetenv 2974a5d661aSToomas Soome; 2984a5d661aSToomas Soome 2994a5d661aSToomas Soome: init_reconfigure ( N -- N ) 3004a5d661aSToomas Soome reconfigure_enabled? if 3014a5d661aSToomas Soome toggle_menuitem ( n -- n ) 3024a5d661aSToomas Soome then 3034a5d661aSToomas Soome; 3044a5d661aSToomas Soome 3054a5d661aSToomas Soome: toggle_reconfigure ( N -- N TRUE ) 3064a5d661aSToomas Soome toggle_menuitem 3074a5d661aSToomas Soome menu-redraw 3084a5d661aSToomas Soome 3094a5d661aSToomas Soome \ Now we're going to make the change effective 3104a5d661aSToomas Soome 3114a5d661aSToomas Soome dup toggle_stateN @ 0= if 3124a5d661aSToomas Soome reconfigure_disable 3134a5d661aSToomas Soome else 3144a5d661aSToomas Soome reconfigure_enable 3154a5d661aSToomas Soome then 3164a5d661aSToomas Soome 3174a5d661aSToomas Soome TRUE \ loop menu again 3184a5d661aSToomas Soome; 3194a5d661aSToomas Soome 3204a5d661aSToomas Soome\ 3214a5d661aSToomas Soome\ Escape to Prompt 3224a5d661aSToomas Soome\ 3234a5d661aSToomas Soome 3244a5d661aSToomas Soome: goto_prompt ( N -- N FALSE ) 3254a5d661aSToomas Soome 3264a5d661aSToomas Soome s" set autoboot_delay=NO" evaluate 3274a5d661aSToomas Soome 3284a5d661aSToomas Soome cr 3294a5d661aSToomas Soome ." To get back to the menu, type `menu' and press ENTER" cr 3304a5d661aSToomas Soome ." or type `boot' and press ENTER to start illumos." cr 3314a5d661aSToomas Soome cr 3324a5d661aSToomas Soome 3334a5d661aSToomas Soome FALSE \ exit the menu 3344a5d661aSToomas Soome; 3354a5d661aSToomas Soome 3364a5d661aSToomas Soome\ 3374a5d661aSToomas Soome\ Cyclestate (used by osconsole/acpi/kernel/root below) 3384a5d661aSToomas Soome\ 3394a5d661aSToomas Soome 3404a5d661aSToomas Soome: init_cyclestate ( N K -- N ) 3414a5d661aSToomas Soome over cycle_stateN ( n k -- n k addr ) 3424a5d661aSToomas Soome begin 3434a5d661aSToomas Soome tuck @ ( n k addr -- n addr k c ) 3444a5d661aSToomas Soome over <> ( n addr k c -- n addr k 0|-1 ) 3454a5d661aSToomas Soome while 3464a5d661aSToomas Soome rot ( n addr k -- addr k n ) 3474a5d661aSToomas Soome cycle_menuitem 3484a5d661aSToomas Soome swap rot ( addr k n -- n k addr ) 3494a5d661aSToomas Soome repeat 3504a5d661aSToomas Soome 2drop ( n k addr -- n ) 3514a5d661aSToomas Soome; 3524a5d661aSToomas Soome 3534a5d661aSToomas Soome\ 3544a5d661aSToomas Soome\ OS Console 3554a5d661aSToomas Soome\ getenv os_console, if not set getenv console, if not set, default to "text" 3564a5d661aSToomas Soome\ allowed serial consoles: ttya .. ttyd 3574a5d661aSToomas Soome\ if new console will be added (graphics?), this section needs to be updated 3584a5d661aSToomas Soome\ 3594a5d661aSToomas Soome: init_osconsole ( N -- N ) 3604a5d661aSToomas Soome s" os_console" getenv dup -1 = if 3614a5d661aSToomas Soome drop 3624a5d661aSToomas Soome s" console" getenv dup -1 = if 3634a5d661aSToomas Soome drop 0 \ default to text 3644a5d661aSToomas Soome then 3654a5d661aSToomas Soome then ( n c-addr/u | n 0 ) 3664a5d661aSToomas Soome 3674a5d661aSToomas Soome dup 0<> if ( n c-addr/u ) 3684a5d661aSToomas Soome 2dup s" ttyd" compare 0= if 3694a5d661aSToomas Soome 2drop 4 3704a5d661aSToomas Soome else 2dup s" ttyc" compare 0= if 3714a5d661aSToomas Soome 2drop 3 3724a5d661aSToomas Soome else 2dup s" ttyb" compare 0= if 3734a5d661aSToomas Soome 2drop 2 3744a5d661aSToomas Soome else 2dup s" ttya" compare 0= if 3754a5d661aSToomas Soome 2drop 1 3764a5d661aSToomas Soome else 3774a5d661aSToomas Soome 2drop 0 \ anything else defaults to text 3784a5d661aSToomas Soome then then then then 3794a5d661aSToomas Soome then 3804a5d661aSToomas Soome osconsole_state ! 3814a5d661aSToomas Soome; 3824a5d661aSToomas Soome 3834a5d661aSToomas Soome: activate_osconsole ( N -- N ) 3844a5d661aSToomas Soome dup cycle_stateN @ ( n -- n n2 ) 3854a5d661aSToomas Soome dup osconsole_state ! ( n n2 -- n n2 ) \ copy for re-initialization 3864a5d661aSToomas Soome 3874a5d661aSToomas Soome case 3884a5d661aSToomas Soome 0 of s" text" endof 3894a5d661aSToomas Soome 1 of s" ttya" endof 3904a5d661aSToomas Soome 2 of s" ttyb" endof 3914a5d661aSToomas Soome 3 of s" ttyc" endof 3924a5d661aSToomas Soome 4 of s" ttyd" endof 3934a5d661aSToomas Soome dup s" unknown state: " type . cr 3944a5d661aSToomas Soome endcase 3954a5d661aSToomas Soome s" os_console" setenv 3964a5d661aSToomas Soome; 3974a5d661aSToomas Soome 3984a5d661aSToomas Soome: cycle_osconsole ( N -- N TRUE ) 3994a5d661aSToomas Soome cycle_menuitem \ cycle cycle_stateN to next value 4004a5d661aSToomas Soome activate_osconsole \ apply current cycle_stateN 4014a5d661aSToomas Soome menu-redraw \ redraw menu 4024a5d661aSToomas Soome TRUE \ loop menu again 4034a5d661aSToomas Soome; 4044a5d661aSToomas Soome 4054a5d661aSToomas Soome\ 4064a5d661aSToomas Soome\ ACPI 4074a5d661aSToomas Soome\ 4084a5d661aSToomas Soome: init_acpi ( N -- N ) 4094a5d661aSToomas Soome s" acpi-user-options" getenv dup -1 <> if 4104a5d661aSToomas Soome evaluate \ use ?number parse step 4114a5d661aSToomas Soome 4124a5d661aSToomas Soome \ translate option to cycle state 4134a5d661aSToomas Soome case 4144a5d661aSToomas Soome 1 of 1 acpi_state ! endof 4154a5d661aSToomas Soome 2 of 2 acpi_state ! endof 4164a5d661aSToomas Soome 4 of 3 acpi_state ! endof 4174a5d661aSToomas Soome 8 of 4 acpi_state ! endof 4184a5d661aSToomas Soome 0 acpi_state ! 4194a5d661aSToomas Soome endcase 4204a5d661aSToomas Soome else 4214a5d661aSToomas Soome drop 4224a5d661aSToomas Soome then 4234a5d661aSToomas Soome; 4244a5d661aSToomas Soome 4254a5d661aSToomas Soome: activate_acpi ( N -- N ) 4264a5d661aSToomas Soome dup cycle_stateN @ ( n -- n n2 ) 4274a5d661aSToomas Soome dup acpi_state ! ( n n2 -- n n2 ) \ copy for re-initialization 4284a5d661aSToomas Soome 4294a5d661aSToomas Soome \ if N == 0, it's default, just unset env. 4304a5d661aSToomas Soome dup 0= if 4314a5d661aSToomas Soome drop 4324a5d661aSToomas Soome s" acpi-user-options" unsetenv 4334a5d661aSToomas Soome else 4344a5d661aSToomas Soome case 4354a5d661aSToomas Soome 1 of s" 1" endof 4364a5d661aSToomas Soome 2 of s" 2" endof 4374a5d661aSToomas Soome 3 of s" 4" endof 4384a5d661aSToomas Soome 4 of s" 8" endof 4394a5d661aSToomas Soome endcase 4404a5d661aSToomas Soome s" acpi-user-options" setenv 4414a5d661aSToomas Soome then 4424a5d661aSToomas Soome; 4434a5d661aSToomas Soome 4444a5d661aSToomas Soome: cycle_acpi ( N -- N TRUE ) 4454a5d661aSToomas Soome cycle_menuitem \ cycle cycle_stateN to next value 4464a5d661aSToomas Soome activate_acpi \ apply current cycle_stateN 4474a5d661aSToomas Soome menu-redraw \ redraw menu 4484a5d661aSToomas Soome TRUE \ loop menu again 4494a5d661aSToomas Soome; 4504a5d661aSToomas Soome 4514a5d661aSToomas Soome\ 4524a5d661aSToomas Soome\ Kernel 4534a5d661aSToomas Soome\ 4544a5d661aSToomas Soome 4554a5d661aSToomas Soome: init_kernel ( N -- N ) 4564a5d661aSToomas Soome kernel_state @ ( n -- n k ) 4574a5d661aSToomas Soome init_cyclestate ( n k -- n ) 4584a5d661aSToomas Soome; 4594a5d661aSToomas Soome 4604a5d661aSToomas Soome: activate_kernel ( N -- N ) 4614a5d661aSToomas Soome dup cycle_stateN @ ( n -- n n2 ) 4624a5d661aSToomas Soome dup kernel_state ! ( n n2 -- n n2 ) \ copy for re-initialization 4634a5d661aSToomas Soome 48 + ( n n2 -- n n2' ) \ kernel_state to ASCII num 4644a5d661aSToomas Soome 4654a5d661aSToomas Soome s" set kernel=${kernel_prefix}${kernel[N]}${kernel_suffix}" 4664a5d661aSToomas Soome 36 +c! ( n n2 c-addr/u -- n c-addr/u ) \ 'N' to ASCII num 4674a5d661aSToomas Soome evaluate ( n c-addr/u -- n ) \ sets $kernel to full kernel-path 4684a5d661aSToomas Soome; 4694a5d661aSToomas Soome 4704a5d661aSToomas Soome: cycle_kernel ( N -- N TRUE ) 4714a5d661aSToomas Soome cycle_menuitem \ cycle cycle_stateN to next value 4724a5d661aSToomas Soome activate_kernel \ apply current cycle_stateN 4734a5d661aSToomas Soome menu-redraw \ redraw menu 4744a5d661aSToomas Soome TRUE \ loop menu again 4754a5d661aSToomas Soome; 4764a5d661aSToomas Soome 4774a5d661aSToomas Soome\ 4784a5d661aSToomas Soome\ Root 4794a5d661aSToomas Soome\ 4804a5d661aSToomas Soome 4814a5d661aSToomas Soome: init_root ( N -- N ) 4824a5d661aSToomas Soome root_state @ ( n -- n k ) 4834a5d661aSToomas Soome init_cyclestate ( n k -- n ) 4844a5d661aSToomas Soome; 4854a5d661aSToomas Soome 4864a5d661aSToomas Soome: activate_root ( N -- N ) 4874a5d661aSToomas Soome dup cycle_stateN @ ( n -- n n2 ) 4884a5d661aSToomas Soome dup root_state ! ( n n2 -- n n2 ) \ copy for re-initialization 4894a5d661aSToomas Soome 48 + ( n n2 -- n n2' ) \ root_state to ASCII num 4904a5d661aSToomas Soome 4914a5d661aSToomas Soome s" set root=${root_prefix}${root[N]}${root_suffix}" 4924a5d661aSToomas Soome 30 +c! ( n n2 c-addr/u -- n c-addr/u ) \ 'N' to ASCII num 4934a5d661aSToomas Soome evaluate ( n c-addr/u -- n ) \ sets $root to full kernel-path 4944a5d661aSToomas Soome; 4954a5d661aSToomas Soome 4964a5d661aSToomas Soome: cycle_root ( N -- N TRUE ) 4974a5d661aSToomas Soome cycle_menuitem \ cycle cycle_stateN to next value 4984a5d661aSToomas Soome activate_root \ apply current cycle_stateN 4994a5d661aSToomas Soome menu-redraw \ redraw menu 5004a5d661aSToomas Soome TRUE \ loop menu again 5014a5d661aSToomas Soome; 5024a5d661aSToomas Soome 5034a5d661aSToomas Soome\ 5044a5d661aSToomas Soome\ Menusets 5054a5d661aSToomas Soome\ 5064a5d661aSToomas Soome 5074a5d661aSToomas Soome: goto_menu ( N M -- N TRUE ) 5084a5d661aSToomas Soome menu-unset 5094a5d661aSToomas Soome menuset-loadsetnum ( n m -- n ) 5104a5d661aSToomas Soome menu-redraw 5114a5d661aSToomas Soome TRUE \ Loop menu again 5124a5d661aSToomas Soome; 5134a5d661aSToomas Soome 5144a5d661aSToomas Soome\ 5154a5d661aSToomas Soome\ Defaults 5164a5d661aSToomas Soome\ 5174a5d661aSToomas Soome 51858c9f557SToomas Soome: unset_boot_options 5194a5d661aSToomas Soome 0 acpi_state ! 5204a5d661aSToomas Soome s" acpi-user-options" unsetenv 52158c9f557SToomas Soome s" boot-args" unsetenv 52258c9f557SToomas Soome s" boot_ask" unsetenv 5234a5d661aSToomas Soome singleuser_disable 5244a5d661aSToomas Soome verbose_disable 5254a5d661aSToomas Soome kmdb_disable \ disables debug as well 5264a5d661aSToomas Soome reconfigure_disable 52758c9f557SToomas Soome; 52858c9f557SToomas Soome 52958c9f557SToomas Soome: set_default_boot_options ( N -- N TRUE ) 53058c9f557SToomas Soome unset_boot_options 5314a5d661aSToomas Soome 2 goto_menu 5324a5d661aSToomas Soome; 5334a5d661aSToomas Soome 5344a5d661aSToomas Soome\ 5354a5d661aSToomas Soome\ Set boot environment defaults 5364a5d661aSToomas Soome\ 5374a5d661aSToomas Soome 5384a5d661aSToomas Soome 5394a5d661aSToomas Soome: init_bootenv ( -- ) 5404a5d661aSToomas Soome s" set menu_caption[1]=${bemenu_current}${zfs_be_active}" evaluate 5414a5d661aSToomas Soome s" set ansi_caption[1]=${beansi_current}${zfs_be_active}" evaluate 5424a5d661aSToomas Soome s" set menu_caption[2]=${bemenu_bootfs}${currdev}" evaluate 5434a5d661aSToomas Soome s" set ansi_caption[2]=${beansi_bootfs}${currdev}" evaluate 5444a5d661aSToomas Soome s" set menu_caption[3]=${bemenu_page}${zfs_be_currpage}${bemenu_pageof}${zfs_be_pages}" evaluate 5454a5d661aSToomas Soome s" set ansi_caption[3]=${beansi_page}${zfs_be_currpage}${bemenu_pageof}${zfs_be_pages}" evaluate 5464a5d661aSToomas Soome; 5474a5d661aSToomas Soome 5484a5d661aSToomas Soome\ 5494a5d661aSToomas Soome\ Redraw the entire screen. A long BE name can corrupt the menu 5504a5d661aSToomas Soome\ 5514a5d661aSToomas Soome 5524a5d661aSToomas Soome: be_draw_screen 5534a5d661aSToomas Soome clear \ Clear the screen (in screen.4th) 5544a5d661aSToomas Soome print_version \ print version string (bottom-right; see version.4th) 5554a5d661aSToomas Soome draw-beastie \ Draw FreeBSD logo at right (in beastie.4th) 5564a5d661aSToomas Soome draw-brand \ Draw brand.4th logo at top (in brand.4th) 5574a5d661aSToomas Soome menu-init \ Initialize menu and draw bounding box (in menu.4th) 5584a5d661aSToomas Soome; 5594a5d661aSToomas Soome 5604a5d661aSToomas Soome\ 5614a5d661aSToomas Soome\ Select a boot environment 5624a5d661aSToomas Soome\ 5634a5d661aSToomas Soome 5644a5d661aSToomas Soome: set_bootenv ( N -- N TRUE ) 5654a5d661aSToomas Soome dup s" bootenv_root[E]" 13 +c! getenv 5664a5d661aSToomas Soome s" currdev" getenv compare 0= if 5674a5d661aSToomas Soome s" zfs_be_active" getenv type ." is already active" 5684a5d661aSToomas Soome else 5694a5d661aSToomas Soome dup s" set currdev=${bootenv_root[E]}" 27 +c! evaluate 5704a5d661aSToomas Soome dup s" bootenvmenu_caption[E]" 20 +c! getenv 5714a5d661aSToomas Soome s" zfs_be_active" setenv 5724a5d661aSToomas Soome ." Activating " s" currdev" getenv type cr 5734a5d661aSToomas Soome s" unload" evaluate 5744a5d661aSToomas Soome free-module-options 57558c9f557SToomas Soome unset_boot_options 5764a5d661aSToomas Soome s" /boot/defaults/loader.conf" read-conf 5774a5d661aSToomas Soome s" /boot/loader.conf" read-conf 5784a5d661aSToomas Soome s" /boot/loader.conf.local" read-conf 5794a5d661aSToomas Soome init_bootenv 580*a281b0efSToomas Soome 581*a281b0efSToomas Soome s" 1" s" zfs_be_currpage" setenv 582*a281b0efSToomas Soome s" be-set-page" evaluate 5834a5d661aSToomas Soome then 5844a5d661aSToomas Soome 585*a281b0efSToomas Soome 500 ms \ sleep so user can see the message 5864a5d661aSToomas Soome be_draw_screen 5874a5d661aSToomas Soome menu-redraw 5884a5d661aSToomas Soome TRUE 5894a5d661aSToomas Soome; 5904a5d661aSToomas Soome 5914a5d661aSToomas Soome\ 592*a281b0efSToomas Soome\ Chainload this entry. Normally we do not return, in case of error 593*a281b0efSToomas Soome\ from chain load, we continue with normal menu code. 594*a281b0efSToomas Soome\ 595*a281b0efSToomas Soome 596*a281b0efSToomas Soome: set_be_chain ( N -- no return | N TRUE ) 597*a281b0efSToomas Soome dup s" chain ${bootenv_root[E]}" 21 +c! evaluate catch drop 598*a281b0efSToomas Soome 599*a281b0efSToomas Soome menu-redraw 600*a281b0efSToomas Soome TRUE 601*a281b0efSToomas Soome; 602*a281b0efSToomas Soome 603*a281b0efSToomas Soome\ 6044a5d661aSToomas Soome\ Switch to the next page of boot environments 6054a5d661aSToomas Soome\ 6064a5d661aSToomas Soome 6074a5d661aSToomas Soome: set_be_page ( N -- N TRUE ) 6084a5d661aSToomas Soome s" zfs_be_currpage" getenv dup -1 = if 6094a5d661aSToomas Soome drop s" 1" 6104a5d661aSToomas Soome else 6114a5d661aSToomas Soome 0 s>d 2swap 6124a5d661aSToomas Soome >number ( ud caddr/u -- ud' caddr'/u' ) 6134a5d661aSToomas Soome 2drop 6144a5d661aSToomas Soome 1 um/mod ( ud u1 -- u2 u3 ) 6154a5d661aSToomas Soome swap drop ( ud2 u3 -- u3 ) 6164a5d661aSToomas Soome 1+ \ increment the page number 6174a5d661aSToomas Soome dup 6184a5d661aSToomas Soome s" zfs_be_pages" getenv 6194a5d661aSToomas Soome 0 s>d 2swap 6204a5d661aSToomas Soome >number ( ud caddr/u -- ud' caddr'/u' ) 6214a5d661aSToomas Soome 2drop 6224a5d661aSToomas Soome 1 um/mod ( ud u1 -- u2 u3 ) 6234a5d661aSToomas Soome swap drop ( ud2 u3 -- u3 ) 6244a5d661aSToomas Soome > if drop 1 then 6254a5d661aSToomas Soome s>d <# #s #> \ convert back to a string 6264a5d661aSToomas Soome then 6274a5d661aSToomas Soome 6284a5d661aSToomas Soome s" zfs_be_currpage" setenv 6294a5d661aSToomas Soome s" be-set-page" evaluate 6304a5d661aSToomas Soome 3 goto_menu 6314a5d661aSToomas Soome; 6324a5d661aSToomas Soome 6334a5d661aSToomas Soomeonly forth definitions 634