menu-commands.4th revision 280931
1\ Copyright (c) 2006-2013 Devin Teske <dteske@FreeBSD.org> 2\ All rights reserved. 3\ 4\ Redistribution and use in source and binary forms, with or without 5\ modification, are permitted provided that the following conditions 6\ are met: 7\ 1. Redistributions of source code must retain the above copyright 8\ notice, this list of conditions and the following disclaimer. 9\ 2. Redistributions in binary form must reproduce the above copyright 10\ notice, this list of conditions and the following disclaimer in the 11\ documentation and/or other materials provided with the distribution. 12\ 13\ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 14\ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15\ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16\ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 17\ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18\ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19\ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20\ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21\ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22\ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23\ SUCH DAMAGE. 24\ 25\ $FreeBSD: head/sys/boot/forth/menu-commands.4th 280931 2015-04-01 00:49:34Z dteske $ 26 27marker task-menu-commands.4th 28 29include /boot/menusets.4th 30 31variable kernel_state 32variable root_state 330 kernel_state ! 340 root_state ! 35 36\ 37\ Boot 38\ 39 40: init_boot ( N -- N ) 41 dup 42 s" boot_single" getenv -1 <> if 43 drop ( n n c-addr -- n n ) \ unused 44 toggle_menuitem ( n n -- n n ) 45 s" set menu_keycode[N]=115" \ base command to execute 46 else 47 s" set menu_keycode[N]=98" \ base command to execute 48 then 49 17 +c! \ replace 'N' with ASCII numeral 50 evaluate 51; 52 53\ 54\ Alternate Boot 55\ 56 57: init_altboot ( N -- N ) 58 dup 59 s" boot_single" getenv -1 <> if 60 drop ( n c-addr -- n ) \ unused 61 toggle_menuitem ( n -- n ) 62 s" set menu_keycode[N]=109" \ base command to execute 63 else 64 s" set menu_keycode[N]=115" \ base command to execute 65 then 66 17 +c! \ replace 'N' with ASCII numeral 67 evaluate 68; 69 70: altboot ( N -- NOTREACHED ) 71 s" boot_single" 2dup getenv -1 <> if 72 drop ( c-addr/u c-addr -- c-addr/u ) \ unused 73 unsetenv ( c-addr/u -- ) 74 else 75 2drop ( c-addr/u -- ) \ unused 76 s" set boot_single=YES" evaluate 77 then 78 0 boot ( state -- ) 79; 80 81\ 82\ ACPI 83\ 84 85: acpi_enable ( -- ) 86 s" set acpi_load=YES" evaluate \ XXX deprecated but harmless 87 s" set hint.acpi.0.disabled=0" evaluate 88 s" loader.acpi_disabled_by_user" unsetenv 89; 90 91: acpi_disable ( -- ) 92 s" acpi_load" unsetenv \ XXX deprecated but harmless 93 s" set hint.acpi.0.disabled=1" evaluate 94 s" set loader.acpi_disabled_by_user=1" evaluate 95; 96 97: toggle_acpi ( N -- N TRUE ) 98 99 \ Make changes effective _before_ calling menu-redraw 100 101 acpienabled? if 102 acpi_disable 103 else 104 acpi_enable 105 then 106 107 menu-redraw 108 109 TRUE \ loop menu again 110; 111 112\ 113\ Safe Mode 114\ 115 116: safemode_enabled? ( -- flag ) 117 s" kern.smp.disabled" getenv -1 <> dup if 118 swap drop ( c-addr flag -- flag ) 119 then 120; 121 122: safemode_enable ( -- ) 123 s" set kern.smp.disabled=1" evaluate 124 s" set hw.ata.ata_dma=0" evaluate 125 s" set hw.ata.atapi_dma=0" evaluate 126 s" set hw.ata.wc=0" evaluate 127 s" set hw.eisa_slots=0" evaluate 128 s" set kern.eventtimer.periodic=1" evaluate 129 s" set kern.geom.part.check_integrity=0" evaluate 130; 131 132: safemode_disable ( -- ) 133 s" kern.smp.disabled" unsetenv 134 s" hw.ata.ata_dma" unsetenv 135 s" hw.ata.atapi_dma" unsetenv 136 s" hw.ata.wc" unsetenv 137 s" hw.eisa_slots" unsetenv 138 s" kern.eventtimer.periodic" unsetenv 139 s" kern.geom.part.check_integrity" unsetenv 140; 141 142: init_safemode ( N -- N ) 143 safemode_enabled? if 144 toggle_menuitem ( n -- n ) 145 then 146; 147 148: toggle_safemode ( N -- N TRUE ) 149 toggle_menuitem 150 151 \ Now we're going to make the change effective 152 153 dup toggle_stateN @ 0= if 154 safemode_disable 155 else 156 safemode_enable 157 then 158 159 menu-redraw 160 161 TRUE \ loop menu again 162; 163 164\ 165\ Single User Mode 166\ 167 168: singleuser_enabled? ( -- flag ) 169 s" boot_single" getenv -1 <> dup if 170 swap drop ( c-addr flag -- flag ) 171 then 172; 173 174: singleuser_enable ( -- ) 175 s" set boot_single=YES" evaluate 176; 177 178: singleuser_disable ( -- ) 179 s" boot_single" unsetenv 180; 181 182: init_singleuser ( N -- N ) 183 singleuser_enabled? if 184 toggle_menuitem ( n -- n ) 185 then 186; 187 188: toggle_singleuser ( N -- N TRUE ) 189 toggle_menuitem 190 menu-redraw 191 192 \ Now we're going to make the change effective 193 194 dup toggle_stateN @ 0= if 195 singleuser_disable 196 else 197 singleuser_enable 198 then 199 200 TRUE \ loop menu again 201; 202 203\ 204\ Verbose Boot 205\ 206 207: verbose_enabled? ( -- flag ) 208 s" boot_verbose" getenv -1 <> dup if 209 swap drop ( c-addr flag -- flag ) 210 then 211; 212 213: verbose_enable ( -- ) 214 s" set boot_verbose=YES" evaluate 215; 216 217: verbose_disable ( -- ) 218 s" boot_verbose" unsetenv 219; 220 221: init_verbose ( N -- N ) 222 verbose_enabled? if 223 toggle_menuitem ( n -- n ) 224 then 225; 226 227: toggle_verbose ( N -- N TRUE ) 228 toggle_menuitem 229 menu-redraw 230 231 \ Now we're going to make the change effective 232 233 dup toggle_stateN @ 0= if 234 verbose_disable 235 else 236 verbose_enable 237 then 238 239 TRUE \ loop menu again 240; 241 242\ 243\ Escape to Prompt 244\ 245 246: goto_prompt ( N -- N FALSE ) 247 248 s" set autoboot_delay=NO" evaluate 249 250 cr 251 ." To get back to the menu, type `menu' and press ENTER" cr 252 ." or type `boot' and press ENTER to start FreeBSD." cr 253 cr 254 255 FALSE \ exit the menu 256; 257 258\ 259\ Cyclestate (used by kernel/root below) 260\ 261 262: init_cyclestate ( N K -- N ) 263 over cycle_stateN ( n k -- n k addr ) 264 begin 265 tuck @ ( n k addr -- n addr k c ) 266 over <> ( n addr k c -- n addr k 0|-1 ) 267 while 268 rot ( n addr k -- addr k n ) 269 cycle_menuitem 270 swap rot ( addr k n -- n k addr ) 271 repeat 272 2drop ( n k addr -- n ) 273; 274 275\ 276\ Kernel 277\ 278 279: init_kernel ( N -- N ) 280 kernel_state @ ( n -- n k ) 281 init_cyclestate ( n k -- n ) 282; 283 284: activate_kernel ( N -- N ) 285 dup cycle_stateN @ ( n -- n n2 ) 286 dup kernel_state ! ( n n2 -- n n2 ) \ copy for re-initialization 287 48 + ( n n2 -- n n2' ) \ kernel_state to ASCII num 288 289 s" set kernel=${kernel_prefix}${kernel[N]}${kernel_suffix}" 290 36 +c! ( n n2 c-addr/u -- n c-addr/u ) \ 'N' to ASCII num 291 evaluate ( n c-addr/u -- n ) \ sets $kernel to full kernel-path 292; 293 294: cycle_kernel ( N -- N TRUE ) 295 cycle_menuitem \ cycle cycle_stateN to next value 296 activate_kernel \ apply current cycle_stateN 297 menu-redraw \ redraw menu 298 TRUE \ loop menu again 299; 300 301\ 302\ Root 303\ 304 305: init_root ( N -- N ) 306 root_state @ ( n -- n k ) 307 init_cyclestate ( n k -- n ) 308; 309 310: activate_root ( N -- N ) 311 dup cycle_stateN @ ( n -- n n2 ) 312 dup root_state ! ( n n2 -- n n2 ) \ copy for re-initialization 313 48 + ( n n2 -- n n2' ) \ root_state to ASCII num 314 315 s" set root=${root_prefix}${root[N]}${root_suffix}" 316 30 +c! ( n n2 c-addr/u -- n c-addr/u ) \ 'N' to ASCII num 317 evaluate ( n c-addr/u -- n ) \ sets $root to full kernel-path 318; 319 320: cycle_root ( N -- N TRUE ) 321 cycle_menuitem \ cycle cycle_stateN to next value 322 activate_root \ apply current cycle_stateN 323 menu-redraw \ redraw menu 324 TRUE \ loop menu again 325; 326 327\ 328\ Menusets 329\ 330 331: goto_menu ( N M -- N TRUE ) 332 menu-unset 333 menuset-loadsetnum ( n m -- n ) 334 menu-redraw 335 TRUE \ Loop menu again 336; 337 338\ 339\ Defaults 340\ 341 342: set_default_boot_options ( N -- N TRUE ) 343 acpi_enable 344 safemode_disable 345 singleuser_disable 346 verbose_disable 347 2 goto_menu 348; 349