menu-commands.4th revision 257650
1257650Sdteske\ Copyright (c) 2006-2013 Devin Teske <dteske@FreeBSD.org> 2222417Sjulian\ All rights reserved. 3222417Sjulian\ 4222417Sjulian\ Redistribution and use in source and binary forms, with or without 5222417Sjulian\ modification, are permitted provided that the following conditions 6222417Sjulian\ are met: 7222417Sjulian\ 1. Redistributions of source code must retain the above copyright 8222417Sjulian\ notice, this list of conditions and the following disclaimer. 9222417Sjulian\ 2. Redistributions in binary form must reproduce the above copyright 10222417Sjulian\ notice, this list of conditions and the following disclaimer in the 11222417Sjulian\ documentation and/or other materials provided with the distribution. 12222417Sjulian\ 13222417Sjulian\ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 14222417Sjulian\ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15222417Sjulian\ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16222417Sjulian\ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 17222417Sjulian\ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18222417Sjulian\ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19222417Sjulian\ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20222417Sjulian\ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21222417Sjulian\ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22222417Sjulian\ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23222417Sjulian\ SUCH DAMAGE. 24222417Sjulian\ 25222417Sjulian\ $FreeBSD: head/sys/boot/forth/menu-commands.4th 257650 2013-11-04 20:28:10Z dteske $ 26222417Sjulian 27222417Sjulianmarker task-menu-commands.4th 28222417Sjulian 29242667Sdteskeinclude /boot/menusets.4th 30242667Sdteske 31241523Sdteskevariable kernel_state 32241523Sdteskevariable root_state 33257650Sdteske0 kernel_state ! 34257650Sdteske0 root_state ! 35241523Sdteske 36243114Sdteske\ 37243660Sdteske\ Boot 38243660Sdteske\ 39243660Sdteske 40243660Sdteske: init_boot ( N -- N ) 41243660Sdteske dup 42243660Sdteske s" boot_single" getenv -1 <> if 43243660Sdteske drop ( n n c-addr -- n n ) \ unused 44243660Sdteske toggle_menuitem ( n n -- n n ) 45243660Sdteske s" set menu_keycode[N]=115" \ base command to execute 46243660Sdteske else 47243660Sdteske s" set menu_keycode[N]=98" \ base command to execute 48243660Sdteske then 49243660Sdteske 17 +c! \ replace 'N' with ASCII numeral 50243660Sdteske evaluate 51243660Sdteske; 52243660Sdteske 53243660Sdteske\ 54243660Sdteske\ Alternate Boot 55243660Sdteske\ 56243660Sdteske 57243660Sdteske: init_altboot ( N -- N ) 58243660Sdteske dup 59243660Sdteske s" boot_single" getenv -1 <> if 60243660Sdteske drop ( n c-addr -- n ) \ unused 61243660Sdteske toggle_menuitem ( n -- n ) 62243660Sdteske s" set menu_keycode[N]=109" \ base command to execute 63243660Sdteske else 64243660Sdteske s" set menu_keycode[N]=115" \ base command to execute 65243660Sdteske then 66243660Sdteske 17 +c! \ replace 'N' with ASCII numeral 67243660Sdteske evaluate 68243660Sdteske; 69243660Sdteske 70243660Sdteske: altboot ( -- ) 71243660Sdteske s" boot_single" 2dup getenv -1 <> if 72243660Sdteske drop ( c-addr/u c-addr -- c-addr/u ) \ unused 73243660Sdteske unsetenv ( c-addr/u -- ) 74243660Sdteske else 75243660Sdteske 2drop ( c-addr/u -- ) \ unused 76243660Sdteske s" set boot_single=YES" evaluate 77243660Sdteske then 78243660Sdteske 0 boot ( state -- ) 79243660Sdteske; 80243660Sdteske 81243660Sdteske\ 82243114Sdteske\ ACPI 83243114Sdteske\ 84243114Sdteske 85222417Sjulian: acpi_enable ( -- ) 86222417Sjulian s" set acpi_load=YES" evaluate \ XXX deprecated but harmless 87222417Sjulian s" set hint.acpi.0.disabled=0" evaluate 88222417Sjulian s" loader.acpi_disabled_by_user" unsetenv 89222417Sjulian; 90222417Sjulian 91222417Sjulian: acpi_disable ( -- ) 92222417Sjulian s" acpi_load" unsetenv \ XXX deprecated but harmless 93222417Sjulian s" set hint.acpi.0.disabled=1" evaluate 94222417Sjulian s" set loader.acpi_disabled_by_user=1" evaluate 95222417Sjulian; 96222417Sjulian 97222417Sjulian: toggle_acpi ( N -- N TRUE ) 98222417Sjulian 99222417Sjulian \ Make changes effective _before_ calling menu-redraw 100222417Sjulian 101222417Sjulian acpienabled? if 102222417Sjulian acpi_disable 103222417Sjulian else 104222417Sjulian acpi_enable 105222417Sjulian then 106222417Sjulian 107222417Sjulian menu-redraw 108222417Sjulian 109222417Sjulian TRUE \ loop menu again 110222417Sjulian; 111222417Sjulian 112243114Sdteske\ 113243114Sdteske\ Safe Mode 114243114Sdteske\ 115243114Sdteske 116243114Sdteske: safemode_enabled? ( -- flag ) 117243114Sdteske s" kern.smp.disabled" getenv -1 <> dup if 118243114Sdteske swap drop ( c-addr flag -- flag ) 119243114Sdteske then 120243114Sdteske; 121243114Sdteske 122243114Sdteske: safemode_enable ( -- ) 123243114Sdteske s" set kern.smp.disabled=1" evaluate 124243114Sdteske s" set hw.ata.ata_dma=0" evaluate 125243114Sdteske s" set hw.ata.atapi_dma=0" evaluate 126243114Sdteske s" set hw.ata.wc=0" evaluate 127243114Sdteske s" set hw.eisa_slots=0" evaluate 128243114Sdteske s" set kern.eventtimer.periodic=1" evaluate 129243114Sdteske s" set kern.geom.part.check_integrity=0" evaluate 130243114Sdteske; 131243114Sdteske 132243114Sdteske: safemode_disable ( -- ) 133243114Sdteske s" kern.smp.disabled" unsetenv 134243114Sdteske s" hw.ata.ata_dma" unsetenv 135243114Sdteske s" hw.ata.atapi_dma" unsetenv 136243114Sdteske s" hw.ata.wc" unsetenv 137243114Sdteske s" hw.eisa_slots" unsetenv 138243114Sdteske s" kern.eventtimer.periodic" unsetenv 139243114Sdteske s" kern.geom.part.check_integrity" unsetenv 140243114Sdteske; 141243114Sdteske 142241523Sdteske: init_safemode ( N -- N ) 143243114Sdteske safemode_enabled? if 144241523Sdteske toggle_menuitem ( n -- n ) 145241523Sdteske then 146241523Sdteske; 147241523Sdteske 148222417Sjulian: toggle_safemode ( N -- N TRUE ) 149222417Sjulian toggle_menuitem 150222417Sjulian 151222417Sjulian \ Now we're going to make the change effective 152222417Sjulian 153243114Sdteske dup toggle_stateN @ 0= if 154243114Sdteske safemode_disable 155222417Sjulian else 156243114Sdteske safemode_enable 157222417Sjulian then 158222417Sjulian 159222417Sjulian menu-redraw 160222417Sjulian 161222417Sjulian TRUE \ loop menu again 162222417Sjulian; 163222417Sjulian 164243114Sdteske\ 165243114Sdteske\ Single User Mode 166243114Sdteske\ 167243114Sdteske 168243114Sdteske: singleuser_enabled? ( -- flag ) 169243114Sdteske s" boot_single" getenv -1 <> dup if 170243114Sdteske swap drop ( c-addr flag -- flag ) 171243114Sdteske then 172243114Sdteske; 173243114Sdteske 174243114Sdteske: singleuser_enable ( -- ) 175243114Sdteske s" set boot_single=YES" evaluate 176243114Sdteske; 177243114Sdteske 178243114Sdteske: singleuser_disable ( -- ) 179243114Sdteske s" boot_single" unsetenv 180243114Sdteske; 181243114Sdteske 182241523Sdteske: init_singleuser ( N -- N ) 183243114Sdteske singleuser_enabled? if 184241523Sdteske toggle_menuitem ( n -- n ) 185241523Sdteske then 186241523Sdteske; 187241523Sdteske 188222417Sjulian: toggle_singleuser ( N -- N TRUE ) 189222417Sjulian toggle_menuitem 190222417Sjulian menu-redraw 191222417Sjulian 192222417Sjulian \ Now we're going to make the change effective 193222417Sjulian 194243114Sdteske dup toggle_stateN @ 0= if 195243114Sdteske singleuser_disable 196222417Sjulian else 197243114Sdteske singleuser_enable 198222417Sjulian then 199222417Sjulian 200222417Sjulian TRUE \ loop menu again 201222417Sjulian; 202222417Sjulian 203243114Sdteske\ 204243114Sdteske\ Verbose Boot 205243114Sdteske\ 206243114Sdteske 207243114Sdteske: verbose_enabled? ( -- flag ) 208243114Sdteske s" boot_verbose" getenv -1 <> dup if 209243114Sdteske swap drop ( c-addr flag -- flag ) 210243114Sdteske then 211243114Sdteske; 212243114Sdteske 213243114Sdteske: verbose_enable ( -- ) 214243114Sdteske s" set boot_verbose=YES" evaluate 215243114Sdteske; 216243114Sdteske 217243114Sdteske: verbose_disable ( -- ) 218243114Sdteske s" boot_verbose" unsetenv 219243114Sdteske; 220243114Sdteske 221241523Sdteske: init_verbose ( N -- N ) 222243114Sdteske verbose_enabled? if 223241523Sdteske toggle_menuitem ( n -- n ) 224241523Sdteske then 225241523Sdteske; 226241523Sdteske 227222417Sjulian: toggle_verbose ( N -- N TRUE ) 228222417Sjulian toggle_menuitem 229222417Sjulian menu-redraw 230222417Sjulian 231222417Sjulian \ Now we're going to make the change effective 232222417Sjulian 233243114Sdteske dup toggle_stateN @ 0= if 234243114Sdteske verbose_disable 235222417Sjulian else 236243114Sdteske verbose_enable 237222417Sjulian then 238222417Sjulian 239222417Sjulian TRUE \ loop menu again 240222417Sjulian; 241222417Sjulian 242243114Sdteske\ 243243114Sdteske\ Escape to Prompt 244243114Sdteske\ 245243114Sdteske 246222417Sjulian: goto_prompt ( N -- N FALSE ) 247222417Sjulian 248222417Sjulian s" set autoboot_delay=NO" evaluate 249222417Sjulian 250222417Sjulian cr 251222417Sjulian ." To get back to the menu, type `menu' and press ENTER" cr 252222417Sjulian ." or type `boot' and press ENTER to start FreeBSD." cr 253222417Sjulian cr 254222417Sjulian 255222417Sjulian FALSE \ exit the menu 256222417Sjulian; 257222417Sjulian 258243114Sdteske\ 259243114Sdteske\ Cyclestate (used by kernel/root below) 260243114Sdteske\ 261243114Sdteske 262241523Sdteske: init_cyclestate ( N K -- N ) 263243114Sdteske over cycle_stateN ( n k -- n k addr ) 264241523Sdteske begin 265241523Sdteske tuck @ ( n k addr -- n addr k c ) 266241523Sdteske over <> ( n addr k c -- n addr k 0|-1 ) 267241523Sdteske while 268241523Sdteske rot ( n addr k -- addr k n ) 269241523Sdteske cycle_menuitem 270241523Sdteske swap rot ( addr k n -- n k addr ) 271241523Sdteske repeat 272241523Sdteske 2drop ( n k addr -- n ) 273241523Sdteske; 274241523Sdteske 275243114Sdteske\ 276243114Sdteske\ Kernel 277243114Sdteske\ 278243114Sdteske 279241523Sdteske: init_kernel ( N -- N ) 280241523Sdteske kernel_state @ ( n -- n k ) 281241523Sdteske init_cyclestate ( n k -- n ) 282241523Sdteske; 283241523Sdteske 284257650Sdteske: activate_kernel ( N -- N ) 285257650Sdteske dup cycle_stateN @ ( n -- n n2 ) 286257650Sdteske dup kernel_state ! ( n n2 -- n n2 ) \ copy for re-initialization 287257650Sdteske 48 + ( n n2 -- n n2' ) \ kernel_state to ASCII num 288222417Sjulian 289222417Sjulian s" set kernel=${kernel_prefix}${kernel[N]}${kernel_suffix}" 290257650Sdteske 36 +c! ( n n2 c-addr/u -- n c-addr/u ) \ 'N' to ASCII num 291257650Sdteske evaluate ( n c-addr/u -- n ) \ sets $kernel to full kernel-path 292257650Sdteske; 293222417Sjulian 294257650Sdteske: cycle_kernel ( N -- N TRUE ) 295257650Sdteske cycle_menuitem \ cycle cycle_stateN to next value 296257650Sdteske activate_kernel \ apply current cycle_stateN 297257650Sdteske menu-redraw \ redraw menu 298257650Sdteske TRUE \ loop menu again 299222417Sjulian; 300222417Sjulian 301243114Sdteske\ 302243114Sdteske\ Root 303243114Sdteske\ 304243114Sdteske 305241523Sdteske: init_root ( N -- N ) 306241523Sdteske root_state @ ( n -- n k ) 307241523Sdteske init_cyclestate ( n k -- n ) 308241523Sdteske; 309241523Sdteske 310257650Sdteske: activate_root ( N -- N ) 311257650Sdteske dup cycle_stateN @ ( n -- n n2 ) 312257650Sdteske dup root_state ! ( n n2 -- n n2 ) \ copy for re-initialization 313257650Sdteske 48 + ( n n2 -- n n2' ) \ root_state to ASCII num 314222417Sjulian 315241367Sdteske s" set root=${root_prefix}${root[N]}${root_suffix}" 316257650Sdteske 30 +c! ( n n2 c-addr/u -- n c-addr/u ) \ 'N' to ASCII num 317257650Sdteske evaluate ( n c-addr/u -- n ) \ sets $root to full kernel-path 318257650Sdteske; 319222417Sjulian 320257650Sdteske: cycle_root ( N -- N TRUE ) 321257650Sdteske cycle_menuitem \ cycle cycle_stateN to next value 322257650Sdteske activate_root \ apply current cycle_stateN 323257650Sdteske menu-redraw \ redraw menu 324257650Sdteske TRUE \ loop menu again 325222417Sjulian; 326242667Sdteske 327243114Sdteske\ 328243114Sdteske\ Menusets 329243114Sdteske\ 330243114Sdteske 331242667Sdteske: goto_menu ( N M -- N TRUE ) 332242667Sdteske menu-unset 333242667Sdteske menuset-loadsetnum ( n m -- n ) 334242667Sdteske menu-redraw 335242667Sdteske TRUE \ Loop menu again 336242667Sdteske; 337243660Sdteske 338243660Sdteske\ 339243660Sdteske\ Defaults 340243660Sdteske\ 341243660Sdteske 342243660Sdteske: set_default_boot_options ( N -- N TRUE ) 343243660Sdteske acpi_enable 344243660Sdteske safemode_disable 345243660Sdteske singleuser_disable 346243660Sdteske verbose_disable 347243660Sdteske 2 goto_menu 348243660Sdteske; 349