menu-commands.4th revision 243660
1241310Sdteske\ Copyright (c) 2006-2012 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 243660 2012-11-28 18:35:46Z dteske $ 26222417Sjulian 27222417Sjulianmarker task-menu-commands.4th 28222417Sjulian 29242667Sdteskeinclude /boot/menusets.4th 30242667Sdteske 31241523Sdteskevariable kernel_state 32241523Sdteskevariable root_state 33241523Sdteske 34243114Sdteske\ 35243660Sdteske\ Boot 36243660Sdteske\ 37243660Sdteske 38243660Sdteske: init_boot ( N -- N ) 39243660Sdteske dup 40243660Sdteske s" boot_single" getenv -1 <> if 41243660Sdteske drop ( n n c-addr -- n n ) \ unused 42243660Sdteske toggle_menuitem ( n n -- n n ) 43243660Sdteske s" set menu_keycode[N]=115" \ base command to execute 44243660Sdteske else 45243660Sdteske s" set menu_keycode[N]=98" \ base command to execute 46243660Sdteske then 47243660Sdteske 17 +c! \ replace 'N' with ASCII numeral 48243660Sdteske evaluate 49243660Sdteske; 50243660Sdteske 51243660Sdteske\ 52243660Sdteske\ Alternate Boot 53243660Sdteske\ 54243660Sdteske 55243660Sdteske: init_altboot ( N -- N ) 56243660Sdteske dup 57243660Sdteske s" boot_single" getenv -1 <> if 58243660Sdteske drop ( n c-addr -- n ) \ unused 59243660Sdteske toggle_menuitem ( n -- n ) 60243660Sdteske s" set menu_keycode[N]=109" \ base command to execute 61243660Sdteske else 62243660Sdteske s" set menu_keycode[N]=115" \ base command to execute 63243660Sdteske then 64243660Sdteske 17 +c! \ replace 'N' with ASCII numeral 65243660Sdteske evaluate 66243660Sdteske; 67243660Sdteske 68243660Sdteske: altboot ( -- ) 69243660Sdteske s" boot_single" 2dup getenv -1 <> if 70243660Sdteske drop ( c-addr/u c-addr -- c-addr/u ) \ unused 71243660Sdteske unsetenv ( c-addr/u -- ) 72243660Sdteske else 73243660Sdteske 2drop ( c-addr/u -- ) \ unused 74243660Sdteske s" set boot_single=YES" evaluate 75243660Sdteske then 76243660Sdteske 0 boot ( state -- ) 77243660Sdteske; 78243660Sdteske 79243660Sdteske\ 80243114Sdteske\ ACPI 81243114Sdteske\ 82243114Sdteske 83222417Sjulian: acpi_enable ( -- ) 84222417Sjulian s" set acpi_load=YES" evaluate \ XXX deprecated but harmless 85222417Sjulian s" set hint.acpi.0.disabled=0" evaluate 86222417Sjulian s" loader.acpi_disabled_by_user" unsetenv 87222417Sjulian; 88222417Sjulian 89222417Sjulian: acpi_disable ( -- ) 90222417Sjulian s" acpi_load" unsetenv \ XXX deprecated but harmless 91222417Sjulian s" set hint.acpi.0.disabled=1" evaluate 92222417Sjulian s" set loader.acpi_disabled_by_user=1" evaluate 93222417Sjulian; 94222417Sjulian 95222417Sjulian: toggle_acpi ( N -- N TRUE ) 96222417Sjulian 97222417Sjulian \ Make changes effective _before_ calling menu-redraw 98222417Sjulian 99222417Sjulian acpienabled? if 100222417Sjulian acpi_disable 101222417Sjulian else 102222417Sjulian acpi_enable 103222417Sjulian then 104222417Sjulian 105222417Sjulian menu-redraw 106222417Sjulian 107222417Sjulian TRUE \ loop menu again 108222417Sjulian; 109222417Sjulian 110243114Sdteske\ 111243114Sdteske\ Safe Mode 112243114Sdteske\ 113243114Sdteske 114243114Sdteske: safemode_enabled? ( -- flag ) 115243114Sdteske s" kern.smp.disabled" getenv -1 <> dup if 116243114Sdteske swap drop ( c-addr flag -- flag ) 117243114Sdteske then 118243114Sdteske; 119243114Sdteske 120243114Sdteske: safemode_enable ( -- ) 121243114Sdteske s" set kern.smp.disabled=1" evaluate 122243114Sdteske s" set hw.ata.ata_dma=0" evaluate 123243114Sdteske s" set hw.ata.atapi_dma=0" evaluate 124243114Sdteske s" set hw.ata.wc=0" evaluate 125243114Sdteske s" set hw.eisa_slots=0" evaluate 126243114Sdteske s" set kern.eventtimer.periodic=1" evaluate 127243114Sdteske s" set kern.geom.part.check_integrity=0" evaluate 128243114Sdteske; 129243114Sdteske 130243114Sdteske: safemode_disable ( -- ) 131243114Sdteske s" kern.smp.disabled" unsetenv 132243114Sdteske s" hw.ata.ata_dma" unsetenv 133243114Sdteske s" hw.ata.atapi_dma" unsetenv 134243114Sdteske s" hw.ata.wc" unsetenv 135243114Sdteske s" hw.eisa_slots" unsetenv 136243114Sdteske s" kern.eventtimer.periodic" unsetenv 137243114Sdteske s" kern.geom.part.check_integrity" unsetenv 138243114Sdteske; 139243114Sdteske 140241523Sdteske: init_safemode ( N -- N ) 141243114Sdteske safemode_enabled? if 142241523Sdteske toggle_menuitem ( n -- n ) 143241523Sdteske then 144241523Sdteske; 145241523Sdteske 146222417Sjulian: toggle_safemode ( N -- N TRUE ) 147222417Sjulian toggle_menuitem 148222417Sjulian 149222417Sjulian \ Now we're going to make the change effective 150222417Sjulian 151243114Sdteske dup toggle_stateN @ 0= if 152243114Sdteske safemode_disable 153222417Sjulian else 154243114Sdteske safemode_enable 155222417Sjulian then 156222417Sjulian 157222417Sjulian menu-redraw 158222417Sjulian 159222417Sjulian TRUE \ loop menu again 160222417Sjulian; 161222417Sjulian 162243114Sdteske\ 163243114Sdteske\ Single User Mode 164243114Sdteske\ 165243114Sdteske 166243114Sdteske: singleuser_enabled? ( -- flag ) 167243114Sdteske s" boot_single" getenv -1 <> dup if 168243114Sdteske swap drop ( c-addr flag -- flag ) 169243114Sdteske then 170243114Sdteske; 171243114Sdteske 172243114Sdteske: singleuser_enable ( -- ) 173243114Sdteske s" set boot_single=YES" evaluate 174243114Sdteske; 175243114Sdteske 176243114Sdteske: singleuser_disable ( -- ) 177243114Sdteske s" boot_single" unsetenv 178243114Sdteske; 179243114Sdteske 180241523Sdteske: init_singleuser ( N -- N ) 181243114Sdteske singleuser_enabled? if 182241523Sdteske toggle_menuitem ( n -- n ) 183241523Sdteske then 184241523Sdteske; 185241523Sdteske 186222417Sjulian: toggle_singleuser ( N -- N TRUE ) 187222417Sjulian toggle_menuitem 188222417Sjulian menu-redraw 189222417Sjulian 190222417Sjulian \ Now we're going to make the change effective 191222417Sjulian 192243114Sdteske dup toggle_stateN @ 0= if 193243114Sdteske singleuser_disable 194222417Sjulian else 195243114Sdteske singleuser_enable 196222417Sjulian then 197222417Sjulian 198222417Sjulian TRUE \ loop menu again 199222417Sjulian; 200222417Sjulian 201243114Sdteske\ 202243114Sdteske\ Verbose Boot 203243114Sdteske\ 204243114Sdteske 205243114Sdteske: verbose_enabled? ( -- flag ) 206243114Sdteske s" boot_verbose" getenv -1 <> dup if 207243114Sdteske swap drop ( c-addr flag -- flag ) 208243114Sdteske then 209243114Sdteske; 210243114Sdteske 211243114Sdteske: verbose_enable ( -- ) 212243114Sdteske s" set boot_verbose=YES" evaluate 213243114Sdteske; 214243114Sdteske 215243114Sdteske: verbose_disable ( -- ) 216243114Sdteske s" boot_verbose" unsetenv 217243114Sdteske; 218243114Sdteske 219241523Sdteske: init_verbose ( N -- N ) 220243114Sdteske verbose_enabled? if 221241523Sdteske toggle_menuitem ( n -- n ) 222241523Sdteske then 223241523Sdteske; 224241523Sdteske 225222417Sjulian: toggle_verbose ( N -- N TRUE ) 226222417Sjulian toggle_menuitem 227222417Sjulian menu-redraw 228222417Sjulian 229222417Sjulian \ Now we're going to make the change effective 230222417Sjulian 231243114Sdteske dup toggle_stateN @ 0= if 232243114Sdteske verbose_disable 233222417Sjulian else 234243114Sdteske verbose_enable 235222417Sjulian then 236222417Sjulian 237222417Sjulian TRUE \ loop menu again 238222417Sjulian; 239222417Sjulian 240243114Sdteske\ 241243114Sdteske\ Escape to Prompt 242243114Sdteske\ 243243114Sdteske 244222417Sjulian: goto_prompt ( N -- N FALSE ) 245222417Sjulian 246222417Sjulian s" set autoboot_delay=NO" evaluate 247222417Sjulian 248222417Sjulian cr 249222417Sjulian ." To get back to the menu, type `menu' and press ENTER" cr 250222417Sjulian ." or type `boot' and press ENTER to start FreeBSD." cr 251222417Sjulian cr 252222417Sjulian 253222417Sjulian FALSE \ exit the menu 254222417Sjulian; 255222417Sjulian 256243114Sdteske\ 257243114Sdteske\ Cyclestate (used by kernel/root below) 258243114Sdteske\ 259243114Sdteske 260241523Sdteske: init_cyclestate ( N K -- N ) 261243114Sdteske over cycle_stateN ( n k -- n k addr ) 262241523Sdteske begin 263241523Sdteske tuck @ ( n k addr -- n addr k c ) 264241523Sdteske over <> ( n addr k c -- n addr k 0|-1 ) 265241523Sdteske while 266241523Sdteske rot ( n addr k -- addr k n ) 267241523Sdteske cycle_menuitem 268241523Sdteske swap rot ( addr k n -- n k addr ) 269241523Sdteske repeat 270241523Sdteske 2drop ( n k addr -- n ) 271241523Sdteske; 272241523Sdteske 273243114Sdteske\ 274243114Sdteske\ Kernel 275243114Sdteske\ 276243114Sdteske 277241523Sdteske: init_kernel ( N -- N ) 278241523Sdteske kernel_state @ ( n -- n k ) 279241523Sdteske init_cyclestate ( n k -- n ) 280241523Sdteske; 281241523Sdteske 282222417Sjulian: cycle_kernel ( N -- N TRUE ) 283222417Sjulian cycle_menuitem 284222417Sjulian menu-redraw 285222417Sjulian 286222417Sjulian \ Now we're going to make the change effective 287222417Sjulian 288243114Sdteske dup cycle_stateN @ 289241523Sdteske dup kernel_state ! \ save a copy for re-initialization 290222417Sjulian 48 + \ convert to ASCII numeral 291222417Sjulian 292222417Sjulian s" set kernel=${kernel_prefix}${kernel[N]}${kernel_suffix}" 293243114Sdteske 36 +c! \ replace 'N' with ASCII numeral 294243114Sdteske evaluate \ sets $kernel to full kernel-path 295222417Sjulian 296222417Sjulian TRUE \ loop menu again 297222417Sjulian; 298222417Sjulian 299243114Sdteske\ 300243114Sdteske\ Root 301243114Sdteske\ 302243114Sdteske 303241523Sdteske: init_root ( N -- N ) 304241523Sdteske root_state @ ( n -- n k ) 305241523Sdteske init_cyclestate ( n k -- n ) 306241523Sdteske; 307241523Sdteske 308222417Sjulian: cycle_root ( N -- N TRUE ) 309222417Sjulian cycle_menuitem 310222417Sjulian menu-redraw 311222417Sjulian 312222417Sjulian \ Now we're going to make the change effective 313222417Sjulian 314243114Sdteske dup cycle_stateN @ 315241523Sdteske dup root_state ! \ save a copy for re-initialization 316222417Sjulian 48 + \ convert to ASCII numeral 317222417Sjulian 318241367Sdteske s" set root=${root_prefix}${root[N]}${root_suffix}" 319243114Sdteske 30 +c! \ replace 'N' with ASCII numeral 320243114Sdteske evaluate \ sets $root to full root-path 321222417Sjulian 322222417Sjulian TRUE \ loop menu again 323222417Sjulian; 324242667Sdteske 325243114Sdteske\ 326243114Sdteske\ Menusets 327243114Sdteske\ 328243114Sdteske 329242667Sdteske: goto_menu ( N M -- N TRUE ) 330242667Sdteske menu-unset 331242667Sdteske menuset-loadsetnum ( n m -- n ) 332242667Sdteske menu-redraw 333242667Sdteske TRUE \ Loop menu again 334242667Sdteske; 335243660Sdteske 336243660Sdteske\ 337243660Sdteske\ Defaults 338243660Sdteske\ 339243660Sdteske 340243660Sdteske: set_default_boot_options ( N -- N TRUE ) 341243660Sdteske acpi_enable 342243660Sdteske safemode_disable 343243660Sdteske singleuser_disable 344243660Sdteske verbose_disable 345243660Sdteske 2 goto_menu 346243660Sdteske; 347