1 () () 2 3 4 5 Copyright (c) 2006-2015 Devin Teske <dteske@FreeBSD.org> All rights 6 reserved. Redistribution and use in source and binary forms, with or without 7 modification, are permitted provided that the following conditions are met: 8 1. Redistributions of source code must retain the above copyright notice, 9 this list of conditions and the following disclaimer. 2. Redistributions in 10 binary form must reproduce the above copyright notice, this list of 11 conditions and the following disclaimer in the documentation and/or other 12 materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE 13 AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 14 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 15 FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 16 AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 17 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 18 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 19 OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 20 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 21 OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 22 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Copyright 2015 Toomas Soome 23 <tsoome@me.com> Copyright 2019 OmniOS Community Edition (OmniOSce) 24 Association. Copyright 2019 Joyent, Inc. 25 26 marker task-menu-commands.4th 27 28 include /boot/forth/menusets.4th 29 30 only forth definitions 31 32 variable osconsole_state variable acpi_state variable kernel_state variable 33 root_state variable kmdb_state variable drop_into_kmdb_state 0 kmdb_state ! 0 34 drop_into_kmdb_state ! 0 osconsole_state ! 0 acpi_state ! 0 kernel_state ! 35 0 root_state ! 36 37 also menu-namespace also menu-command-helpers 38 39 Boot 40 41 : init_boot ( N -- N ) dup s" smartos" getenv? if s" set 42 menu_keycode[N]=98" base command to execute else s" 43 boot_single" getenv -1 <> if drop ( n n c-addr -- n n ) unused 44 toggle_menuitem ( n n -- n n ) s" set 45 menu_keycode[N]=115" base command to execute else s" 46 set menu_keycode[N]=98" base command to execute then then 17 47 +c! replace 'N' with ASCII numeral evaluate ; 48 49 Alternate Boot 50 51 : init_altboot ( N -- N ) dup s" smartos" getenv? if s" set 52 menu_keycode[N]=114" base command to execute else s" 53 boot_single" getenv -1 <> if drop ( n c-addr -- n ) unused 54 toggle_menuitem ( n -- n ) s" set 55 menu_keycode[N]=109" base command to execute else s" 56 set menu_keycode[N]=115" base command to execute then then 57 17 +c! replace 'N' with ASCII numeral evaluate ; 58 59 : altboot ( N -- NOTREACHED ) s" smartos" getenv? if s" alt-boot- 60 args" getenv dup -1 <> if s" boot-args" setenv ( c-addr/u -- ) 61 then ." NoInstall/Recovery mode boot. login/pw: root/root" 62 cr else s" boot_single" 2dup getenv -1 <> if drop ( 63 c-addr/u c-addr -- c-addr/u ) unused unsetenv ( c-addr/u -- ) 64 else 2drop ( c-addr/u -- ) unused s" 65 set boot_single=YES" evaluate then then 0 boot ( state -- 66 ) ; 67 68 Single User Mode 69 70 : singleuser_enabled? ( -- flag ) s" boot_single" getenv -1 <> dup if 71 swap drop ( c-addr flag -- flag ) then ; 72 73 : singleuser_enable ( -- ) s" set boot_single=YES" evaluate ; 74 75 : singleuser_disable ( -- ) s" boot_single" unsetenv ; 76 77 : init_singleuser ( N -- N ) singleuser_enabled? if toggle_menuitem ( 78 n -- n ) then ; 79 80 : toggle_singleuser ( N -- N TRUE ) toggle_menuitem menu-redraw 81 82 Now we're going to make the change effective 83 84 dup toggle_stateN @ 0= if singleuser_disable else 85 singleuser_enable then 86 87 TRUE loop menu again ; 88 89 Verbose Boot 90 91 : verbose_enabled? ( -- flag ) s" boot_verbose" getenv -1 <> dup if 92 swap drop ( c-addr flag -- flag ) then ; 93 94 : verbose_enable ( -- ) s" set boot_verbose=YES" evaluate ; 95 96 : verbose_disable ( -- ) s" boot_verbose" unsetenv ; 97 98 : init_verbose ( N -- N ) verbose_enabled? if toggle_menuitem ( 99 n -- n ) then ; 100 101 : toggle_verbose ( N -- N TRUE ) toggle_menuitem menu-redraw 102 103 Now we're going to make the change effective 104 105 dup toggle_stateN @ 0= if verbose_disable else 106 verbose_enable then 107 108 TRUE loop menu again ; 109 110 kmdb 111 112 : kmdb_enabled? ( -- flag ) s" boot_kmdb" getenv -1 <> dup if swap 113 drop ( c-addr flag -- flag ) then ; 114 115 : kmdb_enable ( -- ) s" set boot_kmdb=YES" evaluate ; 116 117 : kmdb_disable ( -- ) s" boot_kmdb" unsetenv s" boot_drop_into_kmdb" 118 unsetenv ; 119 120 : init_kmdb ( N -- N ) dup kmdb_state ! store entry number for 121 kmdb+drop_into_kmdb kmdb_enabled? if toggle_menuitem ( n -- n ) 122 then ; 123 124 : toggle_kmdb ( N -- N TRUE ) toggle_menuitem dup toggle_stateN @ 0= 125 if ( kmdb is not set ) drop_into_kmdb_state @ if ( drop_into_kmdb is 126 set? ) drop_into_kmdb_state @ toggle_stateN @ if ( drop_into_kmdb 127 is enabled? ) drop_into_kmdb_state @ toggle_menuitem drop 128 then then then menu-redraw 129 130 Now we're going to make the change effective 131 132 dup toggle_stateN @ 0= if kmdb_disable else 133 kmdb_enable then 134 135 TRUE loop menu again ; 136 137 drop into kmdb 138 139 : drop_into_kmdb_disable ( -- ) s" boot_drop_into_kmdb" unsetenv ; 140 141 : drop_into_kmdb_enabled? ( -- flag ) -d is only allowed with -k s" 142 boot_drop_into_kmdb" getenv -1 <> kmdb_enabled? and dup if swap drop ( 143 c-addr flag -- flag ) else drop_into_kmdb_disable make 144 sure env is not set then ; 145 146 : drop_into_kmdb_enable ( -- ) kmdb_enable s" set 147 boot_drop_into_kmdb=YES" evaluate ; 148 149 : init_drop_into_kmdb ( N -- N ) dup drop_into_kmdb_state ! store 150 entry number for kmdb kmdb_enabled? drop_into_kmdb_enabled? and if 151 toggle_menuitem ( n -- n ) then ; 152 153 : toggle_drop_into_kmdb ( N -- N TRUE ) toggle_menuitem kmdb_enabled? 154 0= if kmdb_state @ toggle_menuitem drop then menu-redraw 155 156 Now we're going to make the change effective 157 158 dup toggle_stateN @ 0= if drop_into_kmdb_disable else 159 drop_into_kmdb_enable then 160 161 TRUE loop menu again ; 162 163 Reconfiguration boot 164 165 : reconfigure_enabled? ( -- flag ) s" boot_reconfigure" getenv -1 <> dup 166 if swap drop ( c-addr flag -- flag ) then ; 167 168 : reconfigure_enable ( -- ) s" set boot_reconfigure=YES" evaluate ; 169 170 : reconfigure_disable ( -- ) s" boot_reconfigure" unsetenv ; 171 172 : init_reconfigure ( N -- N ) reconfigure_enabled? if 173 toggle_menuitem ( n -- n ) then ; 174 175 : toggle_reconfigure ( N -- N TRUE ) toggle_menuitem menu-redraw 176 177 Now we're going to make the change effective 178 179 dup toggle_stateN @ 0= if reconfigure_disable else 180 reconfigure_enable then 181 182 TRUE loop menu again ; 183 184 Escape to Prompt 185 186 : goto_prompt ( N -- N FALSE ) 187 188 s" set autoboot_delay=NO" evaluate 189 190 cr ." To get back to the menu, type `menu' and press ENTER" cr ." 191 or type `boot' and press ENTER to start illumos." cr cr 192 193 FALSE exit the menu ; 194 195 Cyclestate (used by osconsole/acpi/kernel/root below) 196 197 : init_cyclestate ( N K -- N ) over cycle_stateN ( n k -- n k addr ) 198 begin tuck @ ( n k addr -- n addr k c ) over <> ( n 199 addr k c -- n addr k 0|-1 ) while rot ( n addr k -- addr k n ) 200 cycle_menuitem swap rot ( addr k n -- n k addr ) repeat 201 2drop ( n k addr -- n ) ; 202 203 OS Console getenv os_console, if not set getenv console, if not set, default 204 to "text" allowed serial consoles: ttya .. ttyd if new console will be added 205 (graphics?), this section needs to be updated : init_osconsole ( N -- N ) s" 206 os_console" getenv dup -1 = if drop s" console" getenv dup 207 -1 = if drop 0 default to text then then 208 ( n c-addr/u | n 0 ) 209 210 dup 0<> if ( n c-addr/u ) 2dup s" ttyd" compare 211 0= if 2drop 4 else 2dup s" ttyc" compare 0= if 212 2drop 3 else 2dup s" ttyb" compare 0= if 213 2drop 2 else 2dup s" ttya" compare 0= if 214 2drop 1 else 2drop 0 anything 215 else defaults to text then then then then then 216 osconsole_state ! ; 217 218 : activate_osconsole ( N -- N ) dup cycle_stateN @ ( n -- n n2 ) dup 219 osconsole_state ! ( n n2 -- n n2 ) copy for re-initialization 220 221 case 0 of s" text" endof 1 of s" ttya" endof 2 of s" ttyb" 222 endof 3 of s" ttyc" endof 4 of s" ttyd" endof dup s" unknown 223 state: " type . cr endcase s" os_console" setenv ; 224 225 : cycle_osconsole ( N -- N TRUE ) cycle_menuitem cycle cycle_stateN to next 226 value activate_osconsole apply current cycle_stateN menu-redraw 227 redraw menu TRUE loop menu again ; 228 229 ACPI : init_acpi ( N -- N ) s" acpi-user-options" getenv dup -1 <> if 230 evaluate use ?number parse step 231 232 translate option to cycle state case 1 of 1 233 acpi_state ! endof 2 of 2 acpi_state ! endof 4 of 3 acpi_state 234 ! endof 8 of 4 acpi_state ! endof 0 acpi_state ! 235 endcase else drop then ; 236 237 : activate_acpi ( N -- N ) dup cycle_stateN @ ( n -- n n2 ) dup 238 acpi_state ! ( n n2 -- n n2 ) copy for re-initialization 239 240 if N == 0, it's default, just unset env. dup 0= if drop 241 s" acpi-user-options" unsetenv else case 1 242 of s" 1" endof 2 of s" 2" endof 3 of s" 4" endof 4 243 of s" 8" endof endcase s" acpi-user-options" setenv then ; 244 245 : cycle_acpi ( N -- N TRUE ) cycle_menuitem cycle cycle_stateN to next value 246 activate_acpi apply current cycle_stateN menu-redraw redraw menu 247 TRUE loop menu again ; 248 249 Kernel 250 251 : init_kernel ( N -- N ) kernel_state @ ( n -- n k ) init_cyclestate ( 252 n k -- n ) ; 253 254 : activate_kernel ( N -- N ) dup cycle_stateN @ ( n -- n n2 ) dup 255 kernel_state ! ( n n2 -- n n2 ) copy for re-initialization 48 + 256 ( n n2 -- n n2' ) kernel_state to ASCII num 257 258 s" set kernel=${kernel_prefix}${kernel[N]}${kernel_suffix}" 36 +c! 259 ( n n2 c-addr/u -- n c-addr/u ) 'N' to ASCII num evaluate ( n 260 c-addr/u -- n ) sets $kernel to full kernel-path ; 261 262 : cycle_kernel ( N -- N TRUE ) cycle_menuitem cycle cycle_stateN to next 263 value activate_kernel apply current cycle_stateN menu-redraw redraw 264 menu TRUE loop menu again ; 265 266 Root 267 268 : init_root ( N -- N ) root_state @ ( n -- n k ) init_cyclestate ( n k 269 -- n ) ; 270 271 : activate_root ( N -- N ) dup cycle_stateN @ ( n -- n n2 ) dup 272 root_state ! ( n n2 -- n n2 ) copy for re-initialization 48 + 273 ( n n2 -- n n2' ) root_state to ASCII num 274 275 s" set root=${root_prefix}${root[N]}${root_suffix}" 30 +c! ( n 276 n2 c-addr/u -- n c-addr/u ) 'N' to ASCII num evaluate ( n c-addr/u -- n 277 ) sets $root to full kernel-path ; 278 279 : cycle_root ( N -- N TRUE ) cycle_menuitem cycle cycle_stateN to next value 280 activate_root apply current cycle_stateN menu-redraw redraw menu 281 TRUE loop menu again ; 282 283 Menusets 284 285 : goto_menu ( N M -- N TRUE ) menu-unset menuset-loadsetnum ( n m -- 286 n ) menu-redraw TRUE Loop menu again ; 287 288 Defaults 289 290 : unset_boot_options 0 acpi_state ! s" acpi-user-options" unsetenv 291 s" boot-args" unsetenv s" boot_ask" unsetenv singleuser_disable 292 verbose_disable kmdb_disable \[u00A0]disables drop_into_kmdb 293 as well reconfigure_disable ; 294 295 : set_default_boot_options ( N -- N TRUE ) unset_boot_options 2 goto_menu ; 296 297 Set boot environment defaults 298 299 300 : init_bootenv ( -- ) s" set 301 menu_caption[1]=${bemenu_current}${zfs_be_active}" evaluate s" set 302 ansi_caption[1]=${beansi_current}${zfs_be_active}" evaluate s" set 303 menu_caption[2]=${bemenu_bootfs}${currdev}" evaluate s" set 304 ansi_caption[2]=${beansi_bootfs}${currdev}" evaluate s" set 305 menu_caption[3]=${bemenu_page}${zfs_be_currpage}${bemenu_pageof}${zfs_be_pages}" 306 evaluate s" set 307 ansi_caption[3]=${beansi_page}${zfs_be_currpage}${bemenu_pageof}${zfs_be_pages}" 308 evaluate ; 309 310 Redraw the entire screen. A long BE name can corrupt the menu 311 312 : be_draw_screen clear Clear the screen (in screen.4th) 313 print_version print version string (bottom-right; see version.4th) 314 draw-beastie Draw FreeBSD logo at right (in beastie.4th) draw- 315 brand Draw brand.4th logo at top (in brand.4th) menu-init Initialize 316 menu and draw bounding box (in menu.4th) ; 317 318 Select a boot environment 319 320 : set_bootenv ( N -- N TRUE ) dup s" bootenv_root[E]" 13 +c! getenv s" 321 currdev" getenv compare 0= if s" zfs_be_active" getenv type ." is 322 already active" else dup s" set currdev=${bootenv_root[E]}" 27 323 +c! evaluate dup s" bootenvmenu_caption[E]" 20 +c! getenv s" 324 zfs_be_active" setenv ." Activating " s" currdev" getenv type cr 325 s" unload" evaluate free-module-options 326 unset_boot_options s" /boot/defaults/loader.conf" read-conf 327 s" /boot/loader.conf" read-conf s" /boot/loader.conf.local" 328 read-conf init_bootenv 329 330 s" 1" s" zfs_be_currpage" setenv s" be-set-page" evaluate 331 then 332 333 500 ms sleep so user can see the message 334 be_draw_screen menu-redraw TRUE ; 335 336 Chainload this entry. Normally we do not return, in case of error from chain 337 load, we continue with normal menu code. 338 339 : set_be_chain ( N -- no return | N TRUE ) dup s" chain ${bootenv_root[E]}" 340 21 +c! evaluate catch drop 341 342 menu-redraw TRUE ; 343 344 Switch to the next page of boot environments 345 346 : set_be_page ( N -- N TRUE ) s" zfs_be_currpage" getenv dup -1 = if 347 drop s" 1" else s2n 1+ increment the 348 page number dup s" zfs_be_pages" getenv s2n > if 349 drop 1 then n2s then 350 351 s" zfs_be_currpage" setenv s" be-set-page" evaluate 3 goto_menu ; 352 353 only forth definitions 354 355 356 357 August 28, 2019 ()