]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/boot/forth/menu-commands.4th
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sys / boot / forth / menu-commands.4th
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$
26
27 marker task-menu-commands.4th
28
29 include /boot/menusets.4th
30
31 variable kernel_state
32 variable root_state
33
34
35 \ Boot
36
37
38 : init_boot ( N -- N )
39         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 ;