menu-commands.4th revision 262701
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: stable/10/sys/boot/forth/menu-commands.4th 262701 2014-03-03 07:16:39Z 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 ( -- )
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