From 55f9ff659dbc53285c3bcd7a0622def76059d755 Mon Sep 17 00:00:00 2001 From: Devin Teske Date: Sun, 14 Oct 2012 06:52:49 +0000 Subject: [PATCH] Since the introduction of the new advanced boot menu (r222417), options like "boot verbose", "single user mode", "ACPI" and more are now stateful boolean menuitems rather than direct action-items. A short-coming in this new menu system is that when a user sets a non-default value in loader.conf(5), this non-default state is not reflected in the menu -- leading to confusion as to whether the option was taking effect or not. This patch adds dynamic menuitem constructors _and_ the necessary Forth callbacks to initialize these stateful menuitems -- causing the aforementioned menuitems to adhere to loader.conf(5) settings. PR: bin/172529 Approved by: adrian (co-mentor) MFC after: 21 days --- sys/boot/forth/menu-commands.4th | 52 ++++++++++++++++++++++++++++ sys/boot/forth/menu.4th | 58 ++++++++++++++++++++++++++++++++ sys/boot/forth/menu.rc | 3 ++ 3 files changed, 113 insertions(+) diff --git a/sys/boot/forth/menu-commands.4th b/sys/boot/forth/menu-commands.4th index b4f703352e81..4dba8b38c72e 100644 --- a/sys/boot/forth/menu-commands.4th +++ b/sys/boot/forth/menu-commands.4th @@ -26,6 +26,9 @@ marker task-menu-commands.4th +variable kernel_state +variable root_state + : acpi_enable ( -- ) s" set acpi_load=YES" evaluate \ XXX deprecated but harmless s" set hint.acpi.0.disabled=0" evaluate @@ -53,6 +56,13 @@ marker task-menu-commands.4th TRUE \ loop menu again ; +: init_safemode ( N -- N ) + s" kern.smp.disabled" getenv -1 <> if + drop ( n c-addr -- n ) \ unused + toggle_menuitem ( n -- n ) + then +; + : toggle_safemode ( N -- N TRUE ) toggle_menuitem @@ -84,6 +94,13 @@ marker task-menu-commands.4th TRUE \ loop menu again ; +: init_singleuser ( N -- N ) + s" boot_single" getenv -1 <> if + drop ( n c-addr -- n ) \ unused + toggle_menuitem ( n -- n ) + then +; + : toggle_singleuser ( N -- N TRUE ) toggle_menuitem menu-redraw @@ -102,6 +119,13 @@ marker task-menu-commands.4th TRUE \ loop menu again ; +: init_verbose ( N -- N ) + s" boot_verbose" getenv -1 <> if + drop ( n c-addr -- n ) \ unused + toggle_menuitem ( n -- n ) + then +; + : toggle_verbose ( N -- N TRUE ) toggle_menuitem menu-redraw @@ -132,6 +156,27 @@ marker task-menu-commands.4th FALSE \ exit the menu ; +: init_cyclestate ( N K -- N ) + over ( n k -- n k n ) + s" cycle_stateN" ( n k n -- n k n c-addr u ) + -rot tuck 11 + c! swap ( n k n c-addr u -- n k c-addr u ) + evaluate ( n k c-addr u -- n k addr ) + begin + tuck @ ( n k addr -- n addr k c ) + over <> ( n addr k c -- n addr k 0|-1 ) + while + rot ( n addr k -- addr k n ) + cycle_menuitem + swap rot ( addr k n -- n k addr ) + repeat + 2drop ( n k addr -- n ) +; + +: init_kernel ( N -- N ) + kernel_state @ ( n -- n k ) + init_cyclestate ( n k -- n ) +; + : cycle_kernel ( N -- N TRUE ) cycle_menuitem menu-redraw @@ -142,6 +187,7 @@ marker task-menu-commands.4th -rot 2dup 11 + c! rot \ replace 'N' with ASCII numeral evaluate \ translate name into address @ \ dereference address into value + dup kernel_state ! \ save a copy for re-initialization 48 + \ convert to ASCII numeral s" set kernel=${kernel_prefix}${kernel[N]}${kernel_suffix}" @@ -152,6 +198,11 @@ marker task-menu-commands.4th TRUE \ loop menu again ; +: init_root ( N -- N ) + root_state @ ( n -- n k ) + init_cyclestate ( n k -- n ) +; + : cycle_root ( N -- N TRUE ) cycle_menuitem menu-redraw @@ -162,6 +213,7 @@ marker task-menu-commands.4th -rot 2dup 11 + c! rot \ replace 'N' with ASCII numeral evaluate \ translate name into address @ \ dereference address into value + dup root_state ! \ save a copy for re-initialization 48 + \ convert to ASCII numeral s" set root=${root_prefix}${root[N]}${root_suffix}" diff --git a/sys/boot/forth/menu.4th b/sys/boot/forth/menu.4th index dcfc94f292cf..f39131d88588 100644 --- a/sys/boot/forth/menu.4th +++ b/sys/boot/forth/menu.4th @@ -76,6 +76,16 @@ variable menu_timeout \ determined configurable delay duration variable menu_timeout_x \ column position of timeout message variable menu_timeout_y \ row position of timeout message +\ Menu initialization status variables +variable init_state1 +variable init_state2 +variable init_state3 +variable init_state4 +variable init_state5 +variable init_state6 +variable init_state7 +variable init_state8 + \ Boolean option status variables variable toggle_state1 variable toggle_state2 @@ -421,6 +431,16 @@ create init_text8 255 allot then 24 over 2 / - 9 at-xy type + \ If $menu_init is set, evaluate it (allowing for whole menus to be + \ constructed dynamically -- as this function could conceivably set + \ the remaining environment variables to construct the menu entirely). + \ + s" menu_init" getenv dup -1 <> if + evaluate + else + drop + then + \ Print our menu options with respective key/variable associations. \ `printmenuitem' ends by adding the decimal ASCII value for the \ numerical prefix to the stack. We store the value left on the stack @@ -499,6 +519,24 @@ create init_text8 255 allot dup menuacpi @ = if acpimenuitem ( -- C-Addr/U | -1 ) else + \ make sure we have not already initialized this item + s" init_stateN" + -rot 2dup 10 + c! rot \ repace 'N' + evaluate dup @ 0= if + 1 swap ! + + \ If this menuitem has an initializer, run it + s" menu_init[x]" + -rot 2dup 10 + c! rot \ replace 'x' + getenv dup -1 <> if + evaluate + else + drop + then + else + drop + then + loader_color? if s" ansi_caption[x]" else @@ -917,6 +955,10 @@ create init_text8 255 allot -rot 2dup 13 + c! rot \ replace 'x' unsetenv + s" menu_init[x]" \ initializer basename + -rot 2dup 10 + c! rot \ replace 'x' + unsetenv + s" menu_keycode[x]" \ keycode basename -rot 2dup 13 + c! rot \ replace 'x' unsetenv @@ -959,6 +1001,10 @@ create init_text8 255 allot -rot 2dup 9 + c! rot \ replace 'N' with current iteration evaluate \ assign zero (0) to key assoc. var + s" 0 init_stateN !" \ used by menu-create + -rot 2dup 12 + c! rot \ replace 'N' + evaluate + 1+ dup 56 > \ increment, continue if less than 57 until drop \ iterator @@ -979,6 +1025,8 @@ create init_text8 255 allot s" menu_optionstext" unsetenv 0 menuoptions ! + \ clear the menu initializer + s" menu_init" unsetenv ; \ This function both unsets menu variables and visually erases the menu area @@ -994,6 +1042,16 @@ bullet menubllt ! 10 menuY ! 5 menuX ! +\ Initialize our menu initialization state variables +0 init_state1 ! +0 init_state2 ! +0 init_state3 ! +0 init_state4 ! +0 init_state5 ! +0 init_state6 ! +0 init_state7 ! +0 init_state8 ! + \ Initialize our boolean state variables 0 toggle_state1 ! 0 toggle_state2 ! diff --git a/sys/boot/forth/menu.rc b/sys/boot/forth/menu.rc index c2faf687783f..a980419e0bb0 100644 --- a/sys/boot/forth/menu.rc +++ b/sys/boot/forth/menu.rc @@ -48,6 +48,7 @@ set toggled_ansi[4]="ACPI Support On" set menu_caption[5]="Safe [M]ode... off" set toggled_text[5]="Safe [M]ode... On" +set menu_init[5]="init_safemode" set menu_command[5]="toggle_safemode" set menu_keycode[5]="109" set ansi_caption[5]="Safe Mode... Off" @@ -55,6 +56,7 @@ set toggled_ansi[5]="Safe Mode... On" set menu_caption[6]="[S]ingle User. off" set toggled_text[6]="[S]ingle User. On" +set menu_init[6]="init_singleuser" set menu_command[6]="toggle_singleuser" set menu_keycode[6]="115" set ansi_caption[6]="Single User. Off" @@ -62,6 +64,7 @@ set toggled_ansi[6]="Single User. On" set menu_caption[7]="[V]erbose..... off" set toggled_text[7]="[V]erbose..... On" +set menu_init[7]="init_verbose" set menu_command[7]="toggle_verbose" set menu_keycode[7]="118" set ansi_caption[7]="Verbose..... Off"