menu-commands.4th revision 243114
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 243114 2012-11-16 01:24:11Z dteske $
26222417Sjulian
27222417Sjulianmarker task-menu-commands.4th
28222417Sjulian
29242667Sdteskeinclude /boot/menusets.4th
30242667Sdteske
31241523Sdteskevariable kernel_state
32241523Sdteskevariable root_state
33241523Sdteske
34243114Sdteske\ 
35243114Sdteske\ ACPI
36243114Sdteske\ 
37243114Sdteske
38222417Sjulian: acpi_enable ( -- )
39222417Sjulian	s" set acpi_load=YES" evaluate \ XXX deprecated but harmless
40222417Sjulian	s" set hint.acpi.0.disabled=0" evaluate
41222417Sjulian	s" loader.acpi_disabled_by_user" unsetenv
42222417Sjulian;
43222417Sjulian
44222417Sjulian: acpi_disable ( -- )
45222417Sjulian	s" acpi_load" unsetenv \ XXX deprecated but harmless
46222417Sjulian	s" set hint.acpi.0.disabled=1" evaluate
47222417Sjulian	s" set loader.acpi_disabled_by_user=1" evaluate
48222417Sjulian;
49222417Sjulian
50222417Sjulian: toggle_acpi ( N -- N TRUE )
51222417Sjulian
52222417Sjulian	\ Make changes effective _before_ calling menu-redraw
53222417Sjulian
54222417Sjulian	acpienabled? if
55222417Sjulian		acpi_disable
56222417Sjulian	else
57222417Sjulian		acpi_enable
58222417Sjulian	then
59222417Sjulian
60222417Sjulian	menu-redraw
61222417Sjulian
62222417Sjulian	TRUE \ loop menu again
63222417Sjulian;
64222417Sjulian
65243114Sdteske\ 
66243114Sdteske\ Safe Mode
67243114Sdteske\ 
68243114Sdteske
69243114Sdteske: safemode_enabled? ( -- flag )
70243114Sdteske	s" kern.smp.disabled" getenv -1 <> dup if
71243114Sdteske		swap drop ( c-addr flag -- flag )
72243114Sdteske	then
73243114Sdteske;
74243114Sdteske
75243114Sdteske: safemode_enable ( -- )
76243114Sdteske	s" set kern.smp.disabled=1" evaluate
77243114Sdteske	s" set hw.ata.ata_dma=0" evaluate
78243114Sdteske	s" set hw.ata.atapi_dma=0" evaluate
79243114Sdteske	s" set hw.ata.wc=0" evaluate
80243114Sdteske	s" set hw.eisa_slots=0" evaluate
81243114Sdteske	s" set kern.eventtimer.periodic=1" evaluate
82243114Sdteske	s" set kern.geom.part.check_integrity=0" evaluate
83243114Sdteske;
84243114Sdteske
85243114Sdteske: safemode_disable ( -- )
86243114Sdteske	s" kern.smp.disabled" unsetenv
87243114Sdteske	s" hw.ata.ata_dma" unsetenv
88243114Sdteske	s" hw.ata.atapi_dma" unsetenv
89243114Sdteske	s" hw.ata.wc" unsetenv
90243114Sdteske	s" hw.eisa_slots" unsetenv
91243114Sdteske	s" kern.eventtimer.periodic" unsetenv
92243114Sdteske	s" kern.geom.part.check_integrity" unsetenv
93243114Sdteske;
94243114Sdteske
95241523Sdteske: init_safemode ( N -- N )
96243114Sdteske	safemode_enabled? if
97241523Sdteske		toggle_menuitem ( n -- n )
98241523Sdteske	then
99241523Sdteske;
100241523Sdteske
101222417Sjulian: toggle_safemode ( N -- N TRUE )
102222417Sjulian	toggle_menuitem
103222417Sjulian
104222417Sjulian	\ Now we're going to make the change effective
105222417Sjulian
106243114Sdteske	dup toggle_stateN @ 0= if
107243114Sdteske		safemode_disable
108222417Sjulian	else
109243114Sdteske		safemode_enable
110222417Sjulian	then
111222417Sjulian
112222417Sjulian	menu-redraw
113222417Sjulian
114222417Sjulian	TRUE \ loop menu again
115222417Sjulian;
116222417Sjulian
117243114Sdteske\ 
118243114Sdteske\ Single User Mode
119243114Sdteske\ 
120243114Sdteske
121243114Sdteske: singleuser_enabled? ( -- flag )
122243114Sdteske	s" boot_single" getenv -1 <> dup if
123243114Sdteske		swap drop ( c-addr flag -- flag )
124243114Sdteske	then
125243114Sdteske;
126243114Sdteske
127243114Sdteske: singleuser_enable ( -- )
128243114Sdteske	s" set boot_single=YES" evaluate
129243114Sdteske;
130243114Sdteske
131243114Sdteske: singleuser_disable ( -- )
132243114Sdteske	s" boot_single" unsetenv
133243114Sdteske;
134243114Sdteske
135241523Sdteske: init_singleuser ( N -- N )
136243114Sdteske	singleuser_enabled? if
137241523Sdteske		toggle_menuitem ( n -- n )
138241523Sdteske	then
139241523Sdteske;
140241523Sdteske
141222417Sjulian: toggle_singleuser ( N -- N TRUE )
142222417Sjulian	toggle_menuitem
143222417Sjulian	menu-redraw
144222417Sjulian
145222417Sjulian	\ Now we're going to make the change effective
146222417Sjulian
147243114Sdteske	dup toggle_stateN @ 0= if
148243114Sdteske		singleuser_disable
149222417Sjulian	else
150243114Sdteske		singleuser_enable
151222417Sjulian	then
152222417Sjulian
153222417Sjulian	TRUE \ loop menu again
154222417Sjulian;
155222417Sjulian
156243114Sdteske\ 
157243114Sdteske\ Verbose Boot
158243114Sdteske\ 
159243114Sdteske
160243114Sdteske: verbose_enabled? ( -- flag )
161243114Sdteske	s" boot_verbose" getenv -1 <> dup if
162243114Sdteske		swap drop ( c-addr flag -- flag )
163243114Sdteske	then
164243114Sdteske;
165243114Sdteske
166243114Sdteske: verbose_enable ( -- )
167243114Sdteske	s" set boot_verbose=YES" evaluate
168243114Sdteske;
169243114Sdteske
170243114Sdteske: verbose_disable ( -- )
171243114Sdteske	s" boot_verbose" unsetenv
172243114Sdteske;
173243114Sdteske
174241523Sdteske: init_verbose ( N -- N )
175243114Sdteske	verbose_enabled? if
176241523Sdteske		toggle_menuitem ( n -- n )
177241523Sdteske	then
178241523Sdteske;
179241523Sdteske
180222417Sjulian: toggle_verbose ( N -- N TRUE )
181222417Sjulian	toggle_menuitem
182222417Sjulian	menu-redraw
183222417Sjulian
184222417Sjulian	\ Now we're going to make the change effective
185222417Sjulian
186243114Sdteske	dup toggle_stateN @ 0= if
187243114Sdteske		verbose_disable
188222417Sjulian	else
189243114Sdteske		verbose_enable
190222417Sjulian	then
191222417Sjulian
192222417Sjulian	TRUE \ loop menu again
193222417Sjulian;
194222417Sjulian
195243114Sdteske\ 
196243114Sdteske\ Escape to Prompt
197243114Sdteske\ 
198243114Sdteske
199222417Sjulian: goto_prompt ( N -- N FALSE )
200222417Sjulian
201222417Sjulian	s" set autoboot_delay=NO" evaluate
202222417Sjulian
203222417Sjulian	cr
204222417Sjulian	." To get back to the menu, type `menu' and press ENTER" cr
205222417Sjulian	." or type `boot' and press ENTER to start FreeBSD." cr
206222417Sjulian	cr
207222417Sjulian
208222417Sjulian	FALSE \ exit the menu
209222417Sjulian;
210222417Sjulian
211243114Sdteske\ 
212243114Sdteske\ Cyclestate (used by kernel/root below)
213243114Sdteske\ 
214243114Sdteske
215241523Sdteske: init_cyclestate ( N K -- N )
216243114Sdteske	over cycle_stateN ( n k -- n k addr )
217241523Sdteske	begin
218241523Sdteske		tuck @  ( n k addr -- n addr k c )
219241523Sdteske		over <> ( n addr k c -- n addr k 0|-1 )
220241523Sdteske	while
221241523Sdteske		rot ( n addr k -- addr k n )
222241523Sdteske		cycle_menuitem
223241523Sdteske		swap rot ( addr k n -- n k addr )
224241523Sdteske	repeat
225241523Sdteske	2drop ( n k addr -- n )
226241523Sdteske;
227241523Sdteske
228243114Sdteske\
229243114Sdteske\ Kernel
230243114Sdteske\ 
231243114Sdteske
232241523Sdteske: init_kernel ( N -- N )
233241523Sdteske	kernel_state @  ( n -- n k )
234241523Sdteske	init_cyclestate ( n k -- n )
235241523Sdteske;
236241523Sdteske
237222417Sjulian: cycle_kernel ( N -- N TRUE )
238222417Sjulian	cycle_menuitem
239222417Sjulian	menu-redraw
240222417Sjulian
241222417Sjulian	\ Now we're going to make the change effective
242222417Sjulian
243243114Sdteske	dup cycle_stateN @
244241523Sdteske	dup kernel_state !       \ save a copy for re-initialization
245222417Sjulian	48 +                     \ convert to ASCII numeral
246222417Sjulian
247222417Sjulian	s" set kernel=${kernel_prefix}${kernel[N]}${kernel_suffix}"
248243114Sdteske	36 +c!   \ replace 'N' with ASCII numeral
249243114Sdteske	evaluate \ sets $kernel to full kernel-path
250222417Sjulian
251222417Sjulian	TRUE \ loop menu again
252222417Sjulian;
253222417Sjulian
254243114Sdteske\ 
255243114Sdteske\ Root
256243114Sdteske\ 
257243114Sdteske
258241523Sdteske: init_root ( N -- N )
259241523Sdteske	root_state @    ( n -- n k )
260241523Sdteske	init_cyclestate ( n k -- n )
261241523Sdteske;
262241523Sdteske
263222417Sjulian: cycle_root ( N -- N TRUE )
264222417Sjulian	cycle_menuitem
265222417Sjulian	menu-redraw
266222417Sjulian
267222417Sjulian	\ Now we're going to make the change effective
268222417Sjulian
269243114Sdteske	dup cycle_stateN @
270241523Sdteske	dup root_state !         \ save a copy for re-initialization
271222417Sjulian	48 +                     \ convert to ASCII numeral
272222417Sjulian
273241367Sdteske	s" set root=${root_prefix}${root[N]}${root_suffix}"
274243114Sdteske	30 +c!   \ replace 'N' with ASCII numeral
275243114Sdteske	evaluate \ sets $root to full root-path
276222417Sjulian
277222417Sjulian	TRUE \ loop menu again
278222417Sjulian;
279242667Sdteske
280243114Sdteske\ 
281243114Sdteske\ Menusets
282243114Sdteske\ 
283243114Sdteske
284242667Sdteske: goto_menu ( N M -- N TRUE )
285242667Sdteske	menu-unset
286242667Sdteske	menuset-loadsetnum ( n m -- n )
287242667Sdteske	menu-redraw
288242667Sdteske	TRUE \ Loop menu again
289242667Sdteske;
290