xref: /titanic_53/usr/src/boot/sys/boot/forth/menu-commands.4th (revision a281b0ef076f3b6cd24864ecb984a4b92dd8b1b8)
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