]> CyberLeo.Net >> Repos - FreeBSD/releng/9.3.git/blob - sys/boot/forth/menu-commands.4th
Copy stable/9 to releng/9.3 as part of the 9.3-RELEASE cycle.
[FreeBSD/releng/9.3.git] / sys / boot / forth / menu-commands.4th
1 \ Copyright (c) 2006-2013 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 0 kernel_state !
34 0 root_state !
35
36
37 \ Boot
38
39
40 : init_boot ( N -- N )
41         dup
42         s" boot_single" getenv -1 <> if
43                 drop ( n n c-addr -- n n ) \ unused
44                 toggle_menuitem ( n n -- n n )
45                 s" set menu_keycode[N]=115" \ base command to execute
46         else
47                 s" set menu_keycode[N]=98" \ base command to execute
48         then
49         17 +c! \ replace 'N' with ASCII numeral
50         evaluate
51 ;
52
53
54 \ Alternate Boot
55
56
57 : init_altboot ( N -- N )
58         dup
59         s" boot_single" getenv -1 <> if
60                 drop ( n c-addr -- n ) \ unused
61                 toggle_menuitem ( n -- n )
62                 s" set menu_keycode[N]=109" \ base command to execute
63         else
64                 s" set menu_keycode[N]=115" \ base command to execute
65         then
66         17 +c! \ replace 'N' with ASCII numeral
67         evaluate
68 ;
69
70 : altboot ( -- )
71         s" boot_single" 2dup getenv -1 <> if
72                 drop ( c-addr/u c-addr -- c-addr/u ) \ unused
73                 unsetenv ( c-addr/u -- )
74         else
75                 2drop ( c-addr/u -- ) \ unused
76                 s" set boot_single=YES" evaluate
77         then
78         0 boot ( state -- )
79 ;
80
81
82 \ ACPI
83
84
85 : acpi_enable ( -- )
86         s" set acpi_load=YES" evaluate \ XXX deprecated but harmless
87         s" set hint.acpi.0.disabled=0" evaluate
88         s" loader.acpi_disabled_by_user" unsetenv
89 ;
90
91 : acpi_disable ( -- )
92         s" acpi_load" unsetenv \ XXX deprecated but harmless
93         s" set hint.acpi.0.disabled=1" evaluate
94         s" set loader.acpi_disabled_by_user=1" evaluate
95 ;
96
97 : toggle_acpi ( N -- N TRUE )
98
99         \ Make changes effective _before_ calling menu-redraw
100
101         acpienabled? if
102                 acpi_disable
103         else
104                 acpi_enable
105         then
106
107         menu-redraw
108
109         TRUE \ loop menu again
110 ;
111
112
113 \ Safe Mode
114
115
116 : safemode_enabled? ( -- flag )
117         s" kern.smp.disabled" getenv -1 <> dup if
118                 swap drop ( c-addr flag -- flag )
119         then
120 ;
121
122 : safemode_enable ( -- )
123         s" set kern.smp.disabled=1" evaluate
124         s" set hw.ata.ata_dma=0" evaluate
125         s" set hw.ata.atapi_dma=0" evaluate
126         s" set hw.ata.wc=0" evaluate
127         s" set hw.eisa_slots=0" evaluate
128         s" set kern.eventtimer.periodic=1" evaluate
129         s" set kern.geom.part.check_integrity=0" evaluate
130 ;
131
132 : safemode_disable ( -- )
133         s" kern.smp.disabled" unsetenv
134         s" hw.ata.ata_dma" unsetenv
135         s" hw.ata.atapi_dma" unsetenv
136         s" hw.ata.wc" unsetenv
137         s" hw.eisa_slots" unsetenv
138         s" kern.eventtimer.periodic" unsetenv
139         s" kern.geom.part.check_integrity" unsetenv
140 ;
141
142 : init_safemode ( N -- N )
143         safemode_enabled? if
144                 toggle_menuitem ( n -- n )
145         then
146 ;
147
148 : toggle_safemode ( N -- N TRUE )
149         toggle_menuitem
150
151         \ Now we're going to make the change effective
152
153         dup toggle_stateN @ 0= if
154                 safemode_disable
155         else
156                 safemode_enable
157         then
158
159         menu-redraw
160
161         TRUE \ loop menu again
162 ;
163
164
165 \ Single User Mode
166
167
168 : singleuser_enabled? ( -- flag )
169         s" boot_single" getenv -1 <> dup if
170                 swap drop ( c-addr flag -- flag )
171         then
172 ;
173
174 : singleuser_enable ( -- )
175         s" set boot_single=YES" evaluate
176 ;
177
178 : singleuser_disable ( -- )
179         s" boot_single" unsetenv
180 ;
181
182 : init_singleuser ( N -- N )
183         singleuser_enabled? if
184                 toggle_menuitem ( n -- n )
185         then
186 ;
187
188 : toggle_singleuser ( N -- N TRUE )
189         toggle_menuitem
190         menu-redraw
191
192         \ Now we're going to make the change effective
193
194         dup toggle_stateN @ 0= if
195                 singleuser_disable
196         else
197                 singleuser_enable
198         then
199
200         TRUE \ loop menu again
201 ;
202
203
204 \ Verbose Boot
205
206
207 : verbose_enabled? ( -- flag )
208         s" boot_verbose" getenv -1 <> dup if
209                 swap drop ( c-addr flag -- flag )
210         then
211 ;
212
213 : verbose_enable ( -- )
214         s" set boot_verbose=YES" evaluate
215 ;
216
217 : verbose_disable ( -- )
218         s" boot_verbose" unsetenv
219 ;
220
221 : init_verbose ( N -- N )
222         verbose_enabled? if
223                 toggle_menuitem ( n -- n )
224         then
225 ;
226
227 : toggle_verbose ( N -- N TRUE )
228         toggle_menuitem
229         menu-redraw
230
231         \ Now we're going to make the change effective
232
233         dup toggle_stateN @ 0= if
234                 verbose_disable
235         else
236                 verbose_enable
237         then
238
239         TRUE \ loop menu again
240 ;
241
242
243 \ Escape to Prompt
244
245
246 : goto_prompt ( N -- N FALSE )
247
248         s" set autoboot_delay=NO" evaluate
249
250         cr
251         ." To get back to the menu, type `menu' and press ENTER" cr
252         ." or type `boot' and press ENTER to start FreeBSD." cr
253         cr
254
255         FALSE \ exit the menu
256 ;
257
258
259 \ Cyclestate (used by kernel/root below)
260
261
262 : init_cyclestate ( N K -- N )
263         over cycle_stateN ( n k -- n k addr )
264         begin
265                 tuck @  ( n k addr -- n addr k c )
266                 over <> ( n addr k c -- n addr k 0|-1 )
267         while
268                 rot ( n addr k -- addr k n )
269                 cycle_menuitem
270                 swap rot ( addr k n -- n k addr )
271         repeat
272         2drop ( n k addr -- n )
273 ;
274
275 \
276 \ Kernel
277
278
279 : init_kernel ( N -- N )
280         kernel_state @  ( n -- n k )
281         init_cyclestate ( n k -- n )
282 ;
283
284 : activate_kernel ( N -- N )
285         dup cycle_stateN @      ( n -- n n2 )
286         dup kernel_state !      ( n n2 -- n n2 )  \ copy for re-initialization
287         48 +                    ( n n2 -- n n2' ) \ kernel_state to ASCII num
288
289         s" set kernel=${kernel_prefix}${kernel[N]}${kernel_suffix}"
290         36 +c!          ( n n2 c-addr/u -- n c-addr/u ) \ 'N' to ASCII num
291         evaluate        ( n c-addr/u -- n ) \ sets $kernel to full kernel-path
292 ;
293
294 : cycle_kernel ( N -- N TRUE )
295         cycle_menuitem  \ cycle cycle_stateN to next value
296         activate_kernel \ apply current cycle_stateN
297         menu-redraw     \ redraw menu
298         TRUE            \ loop menu again
299 ;
300
301
302 \ Root
303
304
305 : init_root ( N -- N )
306         root_state @    ( n -- n k )
307         init_cyclestate ( n k -- n )
308 ;
309
310 : activate_root ( N -- N )
311         dup cycle_stateN @      ( n -- n n2 )
312         dup root_state !        ( n n2 -- n n2 )  \ copy for re-initialization
313         48 +                    ( n n2 -- n n2' ) \ root_state to ASCII num
314
315         s" set root=${root_prefix}${root[N]}${root_suffix}"
316         30 +c!          ( n n2 c-addr/u -- n c-addr/u ) \ 'N' to ASCII num
317         evaluate        ( n c-addr/u -- n ) \ sets $root to full kernel-path
318 ;
319
320 : cycle_root ( N -- N TRUE )
321         cycle_menuitem  \ cycle cycle_stateN to next value
322         activate_root   \ apply current cycle_stateN
323         menu-redraw     \ redraw menu
324         TRUE            \ loop menu again
325 ;
326
327
328 \ Menusets
329
330
331 : goto_menu ( N M -- N TRUE )
332         menu-unset
333         menuset-loadsetnum ( n m -- n )
334         menu-redraw
335         TRUE \ Loop menu again
336 ;
337
338
339 \ Defaults
340
341
342 : set_default_boot_options ( N -- N TRUE )
343         acpi_enable
344         safemode_disable
345         singleuser_disable
346         verbose_disable
347         2 goto_menu
348 ;