menu-commands.4th revision 243660
1\ Copyright (c) 2006-2012 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 243660 2012-11-28 18:35:46Z dteske $ 26 27marker task-menu-commands.4th 28 29include /boot/menusets.4th 30 31variable kernel_state 32variable root_state 33 34\ 35\ Boot 36\ 37 38: init_boot ( N -- N ) 39 dup 40 s" boot_single" getenv -1 <> if 41 drop ( n n c-addr -- n n ) \ unused 42 toggle_menuitem ( n n -- n n ) 43 s" set menu_keycode[N]=115" \ base command to execute 44 else 45 s" set menu_keycode[N]=98" \ base command to execute 46 then 47 17 +c! \ replace 'N' with ASCII numeral 48 evaluate 49; 50 51\ 52\ Alternate Boot 53\ 54 55: init_altboot ( N -- N ) 56 dup 57 s" boot_single" getenv -1 <> if 58 drop ( n c-addr -- n ) \ unused 59 toggle_menuitem ( n -- n ) 60 s" set menu_keycode[N]=109" \ base command to execute 61 else 62 s" set menu_keycode[N]=115" \ base command to execute 63 then 64 17 +c! \ replace 'N' with ASCII numeral 65 evaluate 66; 67 68: altboot ( -- ) 69 s" boot_single" 2dup getenv -1 <> if 70 drop ( c-addr/u c-addr -- c-addr/u ) \ unused 71 unsetenv ( c-addr/u -- ) 72 else 73 2drop ( c-addr/u -- ) \ unused 74 s" set boot_single=YES" evaluate 75 then 76 0 boot ( state -- ) 77; 78 79\ 80\ ACPI 81\ 82 83: acpi_enable ( -- ) 84 s" set acpi_load=YES" evaluate \ XXX deprecated but harmless 85 s" set hint.acpi.0.disabled=0" evaluate 86 s" loader.acpi_disabled_by_user" unsetenv 87; 88 89: acpi_disable ( -- ) 90 s" acpi_load" unsetenv \ XXX deprecated but harmless 91 s" set hint.acpi.0.disabled=1" evaluate 92 s" set loader.acpi_disabled_by_user=1" evaluate 93; 94 95: toggle_acpi ( N -- N TRUE ) 96 97 \ Make changes effective _before_ calling menu-redraw 98 99 acpienabled? if 100 acpi_disable 101 else 102 acpi_enable 103 then 104 105 menu-redraw 106 107 TRUE \ loop menu again 108; 109 110\ 111\ Safe Mode 112\ 113 114: safemode_enabled? ( -- flag ) 115 s" kern.smp.disabled" getenv -1 <> dup if 116 swap drop ( c-addr flag -- flag ) 117 then 118; 119 120: safemode_enable ( -- ) 121 s" set kern.smp.disabled=1" evaluate 122 s" set hw.ata.ata_dma=0" evaluate 123 s" set hw.ata.atapi_dma=0" evaluate 124 s" set hw.ata.wc=0" evaluate 125 s" set hw.eisa_slots=0" evaluate 126 s" set kern.eventtimer.periodic=1" evaluate 127 s" set kern.geom.part.check_integrity=0" evaluate 128; 129 130: safemode_disable ( -- ) 131 s" kern.smp.disabled" unsetenv 132 s" hw.ata.ata_dma" unsetenv 133 s" hw.ata.atapi_dma" unsetenv 134 s" hw.ata.wc" unsetenv 135 s" hw.eisa_slots" unsetenv 136 s" kern.eventtimer.periodic" unsetenv 137 s" kern.geom.part.check_integrity" unsetenv 138; 139 140: init_safemode ( N -- N ) 141 safemode_enabled? if 142 toggle_menuitem ( n -- n ) 143 then 144; 145 146: toggle_safemode ( N -- N TRUE ) 147 toggle_menuitem 148 149 \ Now we're going to make the change effective 150 151 dup toggle_stateN @ 0= if 152 safemode_disable 153 else 154 safemode_enable 155 then 156 157 menu-redraw 158 159 TRUE \ loop menu again 160; 161 162\ 163\ Single User Mode 164\ 165 166: singleuser_enabled? ( -- flag ) 167 s" boot_single" getenv -1 <> dup if 168 swap drop ( c-addr flag -- flag ) 169 then 170; 171 172: singleuser_enable ( -- ) 173 s" set boot_single=YES" evaluate 174; 175 176: singleuser_disable ( -- ) 177 s" boot_single" unsetenv 178; 179 180: init_singleuser ( N -- N ) 181 singleuser_enabled? if 182 toggle_menuitem ( n -- n ) 183 then 184; 185 186: toggle_singleuser ( N -- N TRUE ) 187 toggle_menuitem 188 menu-redraw 189 190 \ Now we're going to make the change effective 191 192 dup toggle_stateN @ 0= if 193 singleuser_disable 194 else 195 singleuser_enable 196 then 197 198 TRUE \ loop menu again 199; 200 201\ 202\ Verbose Boot 203\ 204 205: verbose_enabled? ( -- flag ) 206 s" boot_verbose" getenv -1 <> dup if 207 swap drop ( c-addr flag -- flag ) 208 then 209; 210 211: verbose_enable ( -- ) 212 s" set boot_verbose=YES" evaluate 213; 214 215: verbose_disable ( -- ) 216 s" boot_verbose" unsetenv 217; 218 219: init_verbose ( N -- N ) 220 verbose_enabled? if 221 toggle_menuitem ( n -- n ) 222 then 223; 224 225: toggle_verbose ( N -- N TRUE ) 226 toggle_menuitem 227 menu-redraw 228 229 \ Now we're going to make the change effective 230 231 dup toggle_stateN @ 0= if 232 verbose_disable 233 else 234 verbose_enable 235 then 236 237 TRUE \ loop menu again 238; 239 240\ 241\ Escape to Prompt 242\ 243 244: goto_prompt ( N -- N FALSE ) 245 246 s" set autoboot_delay=NO" evaluate 247 248 cr 249 ." To get back to the menu, type `menu' and press ENTER" cr 250 ." or type `boot' and press ENTER to start FreeBSD." cr 251 cr 252 253 FALSE \ exit the menu 254; 255 256\ 257\ Cyclestate (used by kernel/root below) 258\ 259 260: init_cyclestate ( N K -- N ) 261 over cycle_stateN ( n k -- n k addr ) 262 begin 263 tuck @ ( n k addr -- n addr k c ) 264 over <> ( n addr k c -- n addr k 0|-1 ) 265 while 266 rot ( n addr k -- addr k n ) 267 cycle_menuitem 268 swap rot ( addr k n -- n k addr ) 269 repeat 270 2drop ( n k addr -- n ) 271; 272 273\ 274\ Kernel 275\ 276 277: init_kernel ( N -- N ) 278 kernel_state @ ( n -- n k ) 279 init_cyclestate ( n k -- n ) 280; 281 282: cycle_kernel ( N -- N TRUE ) 283 cycle_menuitem 284 menu-redraw 285 286 \ Now we're going to make the change effective 287 288 dup cycle_stateN @ 289 dup kernel_state ! \ save a copy for re-initialization 290 48 + \ convert to ASCII numeral 291 292 s" set kernel=${kernel_prefix}${kernel[N]}${kernel_suffix}" 293 36 +c! \ replace 'N' with ASCII numeral 294 evaluate \ sets $kernel to full kernel-path 295 296 TRUE \ loop menu again 297; 298 299\ 300\ Root 301\ 302 303: init_root ( N -- N ) 304 root_state @ ( n -- n k ) 305 init_cyclestate ( n k -- n ) 306; 307 308: cycle_root ( N -- N TRUE ) 309 cycle_menuitem 310 menu-redraw 311 312 \ Now we're going to make the change effective 313 314 dup cycle_stateN @ 315 dup root_state ! \ save a copy for re-initialization 316 48 + \ convert to ASCII numeral 317 318 s" set root=${root_prefix}${root[N]}${root_suffix}" 319 30 +c! \ replace 'N' with ASCII numeral 320 evaluate \ sets $root to full root-path 321 322 TRUE \ loop menu again 323; 324 325\ 326\ Menusets 327\ 328 329: goto_menu ( N M -- N TRUE ) 330 menu-unset 331 menuset-loadsetnum ( n m -- n ) 332 menu-redraw 333 TRUE \ Loop menu again 334; 335 336\ 337\ Defaults 338\ 339 340: set_default_boot_options ( N -- N TRUE ) 341 acpi_enable 342 safemode_disable 343 singleuser_disable 344 verbose_disable 345 2 goto_menu 346; 347