menu-commands.4th revision 242667
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 242667 2012-11-06 19:26:36Z dteske $
26222417Sjulian
27222417Sjulianmarker task-menu-commands.4th
28222417Sjulian
29242667Sdteskeinclude /boot/menusets.4th
30242667Sdteske
31241523Sdteskevariable kernel_state
32241523Sdteskevariable root_state
33241523Sdteske
34222417Sjulian: acpi_enable ( -- )
35222417Sjulian	s" set acpi_load=YES" evaluate \ XXX deprecated but harmless
36222417Sjulian	s" set hint.acpi.0.disabled=0" evaluate
37222417Sjulian	s" loader.acpi_disabled_by_user" unsetenv
38222417Sjulian;
39222417Sjulian
40222417Sjulian: acpi_disable ( -- )
41222417Sjulian	s" acpi_load" unsetenv \ XXX deprecated but harmless
42222417Sjulian	s" set hint.acpi.0.disabled=1" evaluate
43222417Sjulian	s" set loader.acpi_disabled_by_user=1" evaluate
44222417Sjulian;
45222417Sjulian
46222417Sjulian: toggle_acpi ( N -- N TRUE )
47222417Sjulian
48222417Sjulian	\ Make changes effective _before_ calling menu-redraw
49222417Sjulian
50222417Sjulian	acpienabled? if
51222417Sjulian		acpi_disable
52222417Sjulian	else
53222417Sjulian		acpi_enable
54222417Sjulian	then
55222417Sjulian
56222417Sjulian	menu-redraw
57222417Sjulian
58222417Sjulian	TRUE \ loop menu again
59222417Sjulian;
60222417Sjulian
61241523Sdteske: init_safemode ( N -- N )
62241523Sdteske	s" kern.smp.disabled" getenv -1 <> if
63241523Sdteske		drop ( n c-addr -- n ) \ unused
64241523Sdteske		toggle_menuitem ( n -- n )
65241523Sdteske	then
66241523Sdteske;
67241523Sdteske
68222417Sjulian: toggle_safemode ( N -- N TRUE )
69222417Sjulian	toggle_menuitem
70222417Sjulian
71222417Sjulian	\ Now we're going to make the change effective
72222417Sjulian
73222417Sjulian	s" toggle_stateN @"      \ base name of toggle state var
74222417Sjulian	-rot 2dup 12 + c! rot    \ replace 'N' with ASCII numeral
75222417Sjulian
76222417Sjulian	evaluate 0= if
77233941Savg		s" kern.smp.disabled" unsetenv
78222417Sjulian		s" hw.ata.ata_dma" unsetenv
79222417Sjulian		s" hw.ata.atapi_dma" unsetenv
80222417Sjulian		s" hw.ata.wc" unsetenv
81222417Sjulian		s" hw.eisa_slots" unsetenv
82233941Savg		s" kern.eventtimer.periodic" unsetenv
83233941Savg		s" kern.geom.part.check_integrity" unsetenv
84222417Sjulian	else
85233941Savg		s" set kern.smp.disabled=1" evaluate
86222417Sjulian		s" set hw.ata.ata_dma=0" evaluate
87222417Sjulian		s" set hw.ata.atapi_dma=0" evaluate
88222417Sjulian		s" set hw.ata.wc=0" evaluate
89222417Sjulian		s" set hw.eisa_slots=0" evaluate
90233941Savg		s" set kern.eventtimer.periodic=1" evaluate
91233941Savg		s" set kern.geom.part.check_integrity=0" evaluate
92222417Sjulian	then
93222417Sjulian
94222417Sjulian	menu-redraw
95222417Sjulian
96222417Sjulian	TRUE \ loop menu again
97222417Sjulian;
98222417Sjulian
99241523Sdteske: init_singleuser ( N -- N )
100241523Sdteske	s" boot_single" getenv -1 <> if
101241523Sdteske		drop ( n c-addr -- n ) \ unused
102241523Sdteske		toggle_menuitem ( n -- n )
103241523Sdteske	then
104241523Sdteske;
105241523Sdteske
106222417Sjulian: toggle_singleuser ( N -- N TRUE )
107222417Sjulian	toggle_menuitem
108222417Sjulian	menu-redraw
109222417Sjulian
110222417Sjulian	\ Now we're going to make the change effective
111222417Sjulian
112222417Sjulian	s" toggle_stateN @"      \ base name of toggle state var
113222417Sjulian	-rot 2dup 12 + c! rot    \ replace 'N' with ASCII numeral
114222417Sjulian
115222417Sjulian	evaluate 0= if
116222417Sjulian		s" boot_single" unsetenv
117222417Sjulian	else
118222417Sjulian		s" set boot_single=YES" evaluate
119222417Sjulian	then
120222417Sjulian
121222417Sjulian	TRUE \ loop menu again
122222417Sjulian;
123222417Sjulian
124241523Sdteske: init_verbose ( N -- N )
125241523Sdteske	s" boot_verbose" getenv -1 <> if
126241523Sdteske		drop ( n c-addr -- n ) \ unused
127241523Sdteske		toggle_menuitem ( n -- n )
128241523Sdteske	then
129241523Sdteske;
130241523Sdteske
131222417Sjulian: toggle_verbose ( N -- N TRUE )
132222417Sjulian	toggle_menuitem
133222417Sjulian	menu-redraw
134222417Sjulian
135222417Sjulian	\ Now we're going to make the change effective
136222417Sjulian
137222417Sjulian	s" toggle_stateN @"      \ base name of toggle state var
138222417Sjulian	-rot 2dup 12 + c! rot    \ replace 'N' with ASCII numeral
139222417Sjulian
140222417Sjulian	evaluate 0= if
141222417Sjulian		s" boot_verbose" unsetenv
142222417Sjulian	else
143222417Sjulian		s" set boot_verbose=YES" evaluate
144222417Sjulian	then
145222417Sjulian
146222417Sjulian	TRUE \ loop menu again
147222417Sjulian;
148222417Sjulian
149222417Sjulian: goto_prompt ( N -- N FALSE )
150222417Sjulian
151222417Sjulian	s" set autoboot_delay=NO" evaluate
152222417Sjulian
153222417Sjulian	cr
154222417Sjulian	." To get back to the menu, type `menu' and press ENTER" cr
155222417Sjulian	." or type `boot' and press ENTER to start FreeBSD." cr
156222417Sjulian	cr
157222417Sjulian
158222417Sjulian	FALSE \ exit the menu
159222417Sjulian;
160222417Sjulian
161241523Sdteske: init_cyclestate ( N K -- N )
162241523Sdteske	over                   ( n k -- n k n )
163241523Sdteske	s" cycle_stateN"       ( n k n -- n k n c-addr u )
164241523Sdteske	-rot tuck 11 + c! swap ( n k n c-addr u -- n k c-addr u )
165241523Sdteske	evaluate               ( n k c-addr u -- n k addr )
166241523Sdteske	begin
167241523Sdteske		tuck @  ( n k addr -- n addr k c )
168241523Sdteske		over <> ( n addr k c -- n addr k 0|-1 )
169241523Sdteske	while
170241523Sdteske		rot ( n addr k -- addr k n )
171241523Sdteske		cycle_menuitem
172241523Sdteske		swap rot ( addr k n -- n k addr )
173241523Sdteske	repeat
174241523Sdteske	2drop ( n k addr -- n )
175241523Sdteske;
176241523Sdteske
177241523Sdteske: init_kernel ( N -- N )
178241523Sdteske	kernel_state @  ( n -- n k )
179241523Sdteske	init_cyclestate ( n k -- n )
180241523Sdteske;
181241523Sdteske
182222417Sjulian: cycle_kernel ( N -- N TRUE )
183222417Sjulian	cycle_menuitem
184222417Sjulian	menu-redraw
185222417Sjulian
186222417Sjulian	\ Now we're going to make the change effective
187222417Sjulian
188222417Sjulian	s" cycle_stateN"         \ base name of array state var
189222417Sjulian	-rot 2dup 11 + c! rot    \ replace 'N' with ASCII numeral
190222417Sjulian	evaluate                 \ translate name into address
191222417Sjulian	@                        \ dereference address into value
192241523Sdteske	dup kernel_state !       \ save a copy for re-initialization
193222417Sjulian	48 +                     \ convert to ASCII numeral
194222417Sjulian
195222417Sjulian	s" set kernel=${kernel_prefix}${kernel[N]}${kernel_suffix}"
196222417Sjulian	                          \ command to assemble full kernel-path
197222417Sjulian	-rot tuck 36 + c! swap    \ replace 'N' with array index value
198222417Sjulian	evaluate                  \ sets $kernel to full kernel-path
199222417Sjulian
200222417Sjulian	TRUE \ loop menu again
201222417Sjulian;
202222417Sjulian
203241523Sdteske: init_root ( N -- N )
204241523Sdteske	root_state @    ( n -- n k )
205241523Sdteske	init_cyclestate ( n k -- n )
206241523Sdteske;
207241523Sdteske
208222417Sjulian: cycle_root ( N -- N TRUE )
209222417Sjulian	cycle_menuitem
210222417Sjulian	menu-redraw
211222417Sjulian
212222417Sjulian	\ Now we're going to make the change effective
213222417Sjulian
214222417Sjulian	s" cycle_stateN"         \ base name of array state var
215222417Sjulian	-rot 2dup 11 + c! rot    \ replace 'N' with ASCII numeral
216222417Sjulian	evaluate                 \ translate name into address
217222417Sjulian	@                        \ dereference address into value
218241523Sdteske	dup root_state !         \ save a copy for re-initialization
219222417Sjulian	48 +                     \ convert to ASCII numeral
220222417Sjulian
221241367Sdteske	s" set root=${root_prefix}${root[N]}${root_suffix}"
222241367Sdteske	                          \ command to assemble root image-path
223222417Sjulian	-rot tuck 30 + c! swap    \ replace 'N' with array index value
224222417Sjulian	evaluate                  \ sets $kernel to full kernel-path
225222417Sjulian
226222417Sjulian	TRUE \ loop menu again
227222417Sjulian;
228242667Sdteske
229242667Sdteske: goto_menu ( N M -- N TRUE )
230242667Sdteske	menu-unset
231242667Sdteske	menuset-loadsetnum ( n m -- n )
232242667Sdteske	menu-redraw
233242667Sdteske	TRUE \ Loop menu again
234242667Sdteske;
235