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