1262701Sdteske\ 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$
26222417Sjulian
27222417Sjulianmarker task-menu-commands.4th
28222417Sjulian
29242667Sdteskeinclude /boot/menusets.4th
30242667Sdteske
31241523Sdteskevariable kernel_state
32241523Sdteskevariable root_state
33262701Sdteske0 kernel_state !
34262701Sdteske0 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
284262701Sdteske: activate_kernel ( N -- N )
285262701Sdteske	dup cycle_stateN @	( n -- n n2 )
286262701Sdteske	dup kernel_state !	( n n2 -- n n2 )  \ copy for re-initialization
287262701Sdteske	48 +			( n n2 -- n n2' ) \ kernel_state to ASCII num
288222417Sjulian
289222417Sjulian	s" set kernel=${kernel_prefix}${kernel[N]}${kernel_suffix}"
290262701Sdteske	36 +c!		( n n2 c-addr/u -- n c-addr/u ) \ 'N' to ASCII num
291262701Sdteske	evaluate	( n c-addr/u -- n ) \ sets $kernel to full kernel-path
292262701Sdteske;
293222417Sjulian
294262701Sdteske: cycle_kernel ( N -- N TRUE )
295262701Sdteske	cycle_menuitem	\ cycle cycle_stateN to next value
296262701Sdteske	activate_kernel \ apply current cycle_stateN
297262701Sdteske	menu-redraw	\ redraw menu
298262701Sdteske	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
310262701Sdteske: activate_root ( N -- N )
311262701Sdteske	dup cycle_stateN @	( n -- n n2 )
312262701Sdteske	dup root_state !	( n n2 -- n n2 )  \ copy for re-initialization
313262701Sdteske	48 +			( n n2 -- n n2' ) \ root_state to ASCII num
314222417Sjulian
315241367Sdteske	s" set root=${root_prefix}${root[N]}${root_suffix}"
316262701Sdteske	30 +c!		( n n2 c-addr/u -- n c-addr/u ) \ 'N' to ASCII num
317262701Sdteske	evaluate	( n c-addr/u -- n ) \ sets $root to full kernel-path
318262701Sdteske;
319222417Sjulian
320262701Sdteske: cycle_root ( N -- N TRUE )
321262701Sdteske	cycle_menuitem	\ cycle cycle_stateN to next value
322262701Sdteske	activate_root	\ apply current cycle_stateN
323262701Sdteske	menu-redraw	\ redraw menu
324262701Sdteske	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