menu-commands.4th revision 241523
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 241523 2012-10-14 06:52:49Z dteske $
26222417Sjulian
27222417Sjulianmarker task-menu-commands.4th
28222417Sjulian
29241523Sdteskevariable kernel_state
30241523Sdteskevariable root_state
31241523Sdteske
32222417Sjulian: acpi_enable ( -- )
33222417Sjulian	s" set acpi_load=YES" evaluate \ XXX deprecated but harmless
34222417Sjulian	s" set hint.acpi.0.disabled=0" evaluate
35222417Sjulian	s" loader.acpi_disabled_by_user" unsetenv
36222417Sjulian;
37222417Sjulian
38222417Sjulian: acpi_disable ( -- )
39222417Sjulian	s" acpi_load" unsetenv \ XXX deprecated but harmless
40222417Sjulian	s" set hint.acpi.0.disabled=1" evaluate
41222417Sjulian	s" set loader.acpi_disabled_by_user=1" evaluate
42222417Sjulian;
43222417Sjulian
44222417Sjulian: toggle_acpi ( N -- N TRUE )
45222417Sjulian
46222417Sjulian	\ Make changes effective _before_ calling menu-redraw
47222417Sjulian
48222417Sjulian	acpienabled? if
49222417Sjulian		acpi_disable
50222417Sjulian	else
51222417Sjulian		acpi_enable
52222417Sjulian	then
53222417Sjulian
54222417Sjulian	menu-redraw
55222417Sjulian
56222417Sjulian	TRUE \ loop menu again
57222417Sjulian;
58222417Sjulian
59241523Sdteske: init_safemode ( N -- N )
60241523Sdteske	s" kern.smp.disabled" getenv -1 <> if
61241523Sdteske		drop ( n c-addr -- n ) \ unused
62241523Sdteske		toggle_menuitem ( n -- n )
63241523Sdteske	then
64241523Sdteske;
65241523Sdteske
66222417Sjulian: toggle_safemode ( N -- N TRUE )
67222417Sjulian	toggle_menuitem
68222417Sjulian
69222417Sjulian	\ Now we're going to make the change effective
70222417Sjulian
71222417Sjulian	s" toggle_stateN @"      \ base name of toggle state var
72222417Sjulian	-rot 2dup 12 + c! rot    \ replace 'N' with ASCII numeral
73222417Sjulian
74222417Sjulian	evaluate 0= if
75233941Savg		s" kern.smp.disabled" unsetenv
76222417Sjulian		s" hw.ata.ata_dma" unsetenv
77222417Sjulian		s" hw.ata.atapi_dma" unsetenv
78222417Sjulian		s" hw.ata.wc" unsetenv
79222417Sjulian		s" hw.eisa_slots" unsetenv
80233941Savg		s" kern.eventtimer.periodic" unsetenv
81233941Savg		s" kern.geom.part.check_integrity" unsetenv
82222417Sjulian	else
83233941Savg		s" set kern.smp.disabled=1" evaluate
84222417Sjulian		s" set hw.ata.ata_dma=0" evaluate
85222417Sjulian		s" set hw.ata.atapi_dma=0" evaluate
86222417Sjulian		s" set hw.ata.wc=0" evaluate
87222417Sjulian		s" set hw.eisa_slots=0" evaluate
88233941Savg		s" set kern.eventtimer.periodic=1" evaluate
89233941Savg		s" set kern.geom.part.check_integrity=0" evaluate
90222417Sjulian	then
91222417Sjulian
92222417Sjulian	menu-redraw
93222417Sjulian
94222417Sjulian	TRUE \ loop menu again
95222417Sjulian;
96222417Sjulian
97241523Sdteske: init_singleuser ( N -- N )
98241523Sdteske	s" boot_single" getenv -1 <> if
99241523Sdteske		drop ( n c-addr -- n ) \ unused
100241523Sdteske		toggle_menuitem ( n -- n )
101241523Sdteske	then
102241523Sdteske;
103241523Sdteske
104222417Sjulian: toggle_singleuser ( N -- N TRUE )
105222417Sjulian	toggle_menuitem
106222417Sjulian	menu-redraw
107222417Sjulian
108222417Sjulian	\ Now we're going to make the change effective
109222417Sjulian
110222417Sjulian	s" toggle_stateN @"      \ base name of toggle state var
111222417Sjulian	-rot 2dup 12 + c! rot    \ replace 'N' with ASCII numeral
112222417Sjulian
113222417Sjulian	evaluate 0= if
114222417Sjulian		s" boot_single" unsetenv
115222417Sjulian	else
116222417Sjulian		s" set boot_single=YES" evaluate
117222417Sjulian	then
118222417Sjulian
119222417Sjulian	TRUE \ loop menu again
120222417Sjulian;
121222417Sjulian
122241523Sdteske: init_verbose ( N -- N )
123241523Sdteske	s" boot_verbose" getenv -1 <> if
124241523Sdteske		drop ( n c-addr -- n ) \ unused
125241523Sdteske		toggle_menuitem ( n -- n )
126241523Sdteske	then
127241523Sdteske;
128241523Sdteske
129222417Sjulian: toggle_verbose ( N -- N TRUE )
130222417Sjulian	toggle_menuitem
131222417Sjulian	menu-redraw
132222417Sjulian
133222417Sjulian	\ Now we're going to make the change effective
134222417Sjulian
135222417Sjulian	s" toggle_stateN @"      \ base name of toggle state var
136222417Sjulian	-rot 2dup 12 + c! rot    \ replace 'N' with ASCII numeral
137222417Sjulian
138222417Sjulian	evaluate 0= if
139222417Sjulian		s" boot_verbose" unsetenv
140222417Sjulian	else
141222417Sjulian		s" set boot_verbose=YES" evaluate
142222417Sjulian	then
143222417Sjulian
144222417Sjulian	TRUE \ loop menu again
145222417Sjulian;
146222417Sjulian
147222417Sjulian: goto_prompt ( N -- N FALSE )
148222417Sjulian
149222417Sjulian	s" set autoboot_delay=NO" evaluate
150222417Sjulian
151222417Sjulian	cr
152222417Sjulian	." To get back to the menu, type `menu' and press ENTER" cr
153222417Sjulian	." or type `boot' and press ENTER to start FreeBSD." cr
154222417Sjulian	cr
155222417Sjulian
156222417Sjulian	FALSE \ exit the menu
157222417Sjulian;
158222417Sjulian
159241523Sdteske: init_cyclestate ( N K -- N )
160241523Sdteske	over                   ( n k -- n k n )
161241523Sdteske	s" cycle_stateN"       ( n k n -- n k n c-addr u )
162241523Sdteske	-rot tuck 11 + c! swap ( n k n c-addr u -- n k c-addr u )
163241523Sdteske	evaluate               ( n k c-addr u -- n k addr )
164241523Sdteske	begin
165241523Sdteske		tuck @  ( n k addr -- n addr k c )
166241523Sdteske		over <> ( n addr k c -- n addr k 0|-1 )
167241523Sdteske	while
168241523Sdteske		rot ( n addr k -- addr k n )
169241523Sdteske		cycle_menuitem
170241523Sdteske		swap rot ( addr k n -- n k addr )
171241523Sdteske	repeat
172241523Sdteske	2drop ( n k addr -- n )
173241523Sdteske;
174241523Sdteske
175241523Sdteske: init_kernel ( N -- N )
176241523Sdteske	kernel_state @  ( n -- n k )
177241523Sdteske	init_cyclestate ( n k -- n )
178241523Sdteske;
179241523Sdteske
180222417Sjulian: cycle_kernel ( N -- N TRUE )
181222417Sjulian	cycle_menuitem
182222417Sjulian	menu-redraw
183222417Sjulian
184222417Sjulian	\ Now we're going to make the change effective
185222417Sjulian
186222417Sjulian	s" cycle_stateN"         \ base name of array state var
187222417Sjulian	-rot 2dup 11 + c! rot    \ replace 'N' with ASCII numeral
188222417Sjulian	evaluate                 \ translate name into address
189222417Sjulian	@                        \ dereference address into value
190241523Sdteske	dup kernel_state !       \ save a copy for re-initialization
191222417Sjulian	48 +                     \ convert to ASCII numeral
192222417Sjulian
193222417Sjulian	s" set kernel=${kernel_prefix}${kernel[N]}${kernel_suffix}"
194222417Sjulian	                          \ command to assemble full kernel-path
195222417Sjulian	-rot tuck 36 + c! swap    \ replace 'N' with array index value
196222417Sjulian	evaluate                  \ sets $kernel to full kernel-path
197222417Sjulian
198222417Sjulian	TRUE \ loop menu again
199222417Sjulian;
200222417Sjulian
201241523Sdteske: init_root ( N -- N )
202241523Sdteske	root_state @    ( n -- n k )
203241523Sdteske	init_cyclestate ( n k -- n )
204241523Sdteske;
205241523Sdteske
206222417Sjulian: cycle_root ( N -- N TRUE )
207222417Sjulian	cycle_menuitem
208222417Sjulian	menu-redraw
209222417Sjulian
210222417Sjulian	\ Now we're going to make the change effective
211222417Sjulian
212222417Sjulian	s" cycle_stateN"         \ base name of array state var
213222417Sjulian	-rot 2dup 11 + c! rot    \ replace 'N' with ASCII numeral
214222417Sjulian	evaluate                 \ translate name into address
215222417Sjulian	@                        \ dereference address into value
216241523Sdteske	dup root_state !         \ save a copy for re-initialization
217222417Sjulian	48 +                     \ convert to ASCII numeral
218222417Sjulian
219241367Sdteske	s" set root=${root_prefix}${root[N]}${root_suffix}"
220241367Sdteske	                          \ command to assemble root image-path
221222417Sjulian	-rot tuck 30 + c! swap    \ replace 'N' with array index value
222222417Sjulian	evaluate                  \ sets $kernel to full kernel-path
223222417Sjulian
224222417Sjulian	TRUE \ loop menu again
225222417Sjulian;
226