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