menu-commands.4th revision 243660
1285101Semaste\ Copyright (c) 2006-2012 Devin Teske <dteske@FreeBSD.org>
2285101Semaste\ All rights reserved.
3353358Sdim\ 
4353358Sdim\ Redistribution and use in source and binary forms, with or without
5353358Sdim\ modification, are permitted provided that the following conditions
6285101Semaste\ are met:
7285101Semaste\ 1. Redistributions of source code must retain the above copyright
8285101Semaste\    notice, this list of conditions and the following disclaimer.
9285101Semaste\ 2. Redistributions in binary form must reproduce the above copyright
10285101Semaste\    notice, this list of conditions and the following disclaimer in the
11285101Semaste\    documentation and/or other materials provided with the distribution.
12314564Sdim\ 
13285101Semaste\ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14285101Semaste\ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15314564Sdim\ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16285101Semaste\ ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17314564Sdim\ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18314564Sdim\ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19285101Semaste\ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20314564Sdim\ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21285101Semaste\ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22314564Sdim\ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23285101Semaste\ SUCH DAMAGE.
24321369Sdim\ 
25321369Sdim\ $FreeBSD: head/sys/boot/forth/menu-commands.4th 243660 2012-11-28 18:35:46Z dteske $
26321369Sdim
27321369Sdimmarker task-menu-commands.4th
28314564Sdim
29285101Semasteinclude /boot/menusets.4th
30314564Sdim
31287521Sdimvariable kernel_state
32285101Semastevariable root_state
33314564Sdim
34314564Sdim\ 
35314564Sdim\ Boot
36285101Semaste\ 
37285101Semaste
38285101Semaste: init_boot ( N -- N )
39285101Semaste	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