Annotation of /tags/mkinitrd-6_3_4/isolinux/parseconfig.inc
Parent Directory | Revision Log
Revision 532 -
(hide annotations)
(download)
Sat Sep 1 22:45:15 2007 UTC (17 years ago) by niro
Original Path: trunk/mkinitrd-magellan/isolinux/parseconfig.inc
File size: 8588 byte(s)
Sat Sep 1 22:45:15 2007 UTC (17 years ago) by niro
Original Path: trunk/mkinitrd-magellan/isolinux/parseconfig.inc
File size: 8588 byte(s)
-import if magellan mkinitrd; it is a fork of redhats mkinitrd-5.0.8 with all magellan patches and features; deprecates magellan-src/mkinitrd
1 | niro | 532 | ;; $Id: parseconfig.inc,v 1.1 2007-09-01 22:44:05 niro Exp $ |
2 | ;; ----------------------------------------------------------------------- | ||
3 | ;; | ||
4 | ;; Copyright 1994-2004 H. Peter Anvin - All Rights Reserved | ||
5 | ;; | ||
6 | ;; This program is free software; you can redistribute it and/or modify | ||
7 | ;; it under the terms of the GNU General Public License as published by | ||
8 | ;; the Free Software Foundation, Inc., 53 Temple Place Ste 330, | ||
9 | ;; Boston MA 02111-1307, USA; either version 2 of the License, or | ||
10 | ;; (at your option) any later version; incorporated herein by reference. | ||
11 | ;; | ||
12 | ;; ----------------------------------------------------------------------- | ||
13 | |||
14 | ;; | ||
15 | ;; parseconfig.inc | ||
16 | ;; | ||
17 | ;; Configuration file operations | ||
18 | ;; | ||
19 | |||
20 | section .text | ||
21 | ; | ||
22 | ; "default" command | ||
23 | ; | ||
24 | pc_default: mov di,default_cmd | ||
25 | call getline | ||
26 | mov byte [di-1],0 ; null-terminate | ||
27 | ret | ||
28 | |||
29 | ; | ||
30 | ; "ontimeout" command | ||
31 | ; | ||
32 | pc_ontimeout: mov di,Ontimeout | ||
33 | call getline | ||
34 | sub di,Ontimeout+1 ; Don't need final space | ||
35 | mov [OntimeoutLen],di | ||
36 | ret | ||
37 | |||
38 | ; | ||
39 | ; "onerror" command | ||
40 | ; | ||
41 | pc_onerror: mov di,Onerror | ||
42 | call getline | ||
43 | sub di,Onerror | ||
44 | mov [OnerrorLen],di | ||
45 | ret | ||
46 | |||
47 | ; | ||
48 | ; "append" command | ||
49 | ; | ||
50 | pc_append: cmp byte [VKernel],0 | ||
51 | ja .vk | ||
52 | mov di,AppendBuf | ||
53 | call getline | ||
54 | sub di,AppendBuf | ||
55 | .app1: mov [AppendLen],di | ||
56 | ret | ||
57 | .vk: mov di,VKernelBuf+vk_append ; "append" command (vkernel) | ||
58 | call getline | ||
59 | sub di,VKernelBuf+vk_append | ||
60 | cmp di,byte 2 | ||
61 | jne .app2 | ||
62 | cmp byte [VKernelBuf+vk_append],'-' | ||
63 | jne .app2 | ||
64 | xor di,di ; If "append -" -> null string | ||
65 | .app2: mov [VKernelBuf+vk_appendlen],di | ||
66 | ret | ||
67 | |||
68 | ; | ||
69 | ; "ipappend" command (PXELINUX only) | ||
70 | ; | ||
71 | %if IS_PXELINUX | ||
72 | pc_ipappend: call getint | ||
73 | jc .err | ||
74 | cmp byte [VKernel],0 | ||
75 | jne .vk | ||
76 | mov [IPAppend],bl | ||
77 | .err: ret | ||
78 | .vk: mov [VKernelBuf+vk_ipappend],bl | ||
79 | ret | ||
80 | %endif | ||
81 | |||
82 | ; | ||
83 | ; "localboot" command (PXELINUX, ISOLINUX) | ||
84 | ; | ||
85 | %if IS_PXELINUX || IS_ISOLINUX | ||
86 | pc_localboot: call getint | ||
87 | cmp byte [VKernel],0 ; ("label" section only) | ||
88 | je .err | ||
89 | mov di,VKernelBuf+vk_rname | ||
90 | xor ax,ax | ||
91 | mov cx,FILENAME_MAX | ||
92 | rep stosb ; Null kernel name | ||
93 | %if IS_PXELINUX | ||
94 | ; PXELINUX uses the first 4 bytes of vk_rname for the | ||
95 | ; mangled IP address | ||
96 | mov [VKernelBuf+vk_rname+5], bx ; Return type | ||
97 | %else | ||
98 | mov [VKernelBuf+vk_rname+1], bx ; Return type | ||
99 | %endif | ||
100 | .err: ret | ||
101 | %endif | ||
102 | |||
103 | ; | ||
104 | ; "kernel" command | ||
105 | pc_kernel: cmp byte [VKernel],0 | ||
106 | je .err ; ("label" section only) | ||
107 | call pc_getline | ||
108 | mov di,VKernelBuf+vk_rname | ||
109 | call mangle_name | ||
110 | .err: ret | ||
111 | |||
112 | ; | ||
113 | ; "timeout", "totaltimeout" command | ||
114 | ; | ||
115 | ; N.B. 1/10 s ~ 1.D2162AABh clock ticks | ||
116 | ; | ||
117 | pc_timeout: push ax | ||
118 | call getint | ||
119 | pop si | ||
120 | jc .err | ||
121 | mov eax,0D2162AABh | ||
122 | mul ebx ; clock ticks per 1/10 s | ||
123 | add ebx,edx | ||
124 | mov [si],ebx | ||
125 | .err: ret | ||
126 | |||
127 | |||
128 | ; | ||
129 | ; "totaltimeout" command | ||
130 | ; | ||
131 | pc_totaltimeout: | ||
132 | |||
133 | ; | ||
134 | ; Generic integer variable setting commands: | ||
135 | ; "prompt", "implicit" | ||
136 | ; | ||
137 | pc_setint16: | ||
138 | push ax | ||
139 | call getint | ||
140 | pop si | ||
141 | jc .err | ||
142 | mov [si],bx | ||
143 | .err: ret | ||
144 | |||
145 | ; | ||
146 | ; Generic file-processing commands: | ||
147 | ; "display", "font", "kbdmap" | ||
148 | ; | ||
149 | pc_filecmd: push ax ; Function to tailcall | ||
150 | call pc_getline | ||
151 | mov di,MNameBuf | ||
152 | push di | ||
153 | call mangle_name | ||
154 | pop di | ||
155 | call searchdir ; tailcall | ||
156 | jnz .ok | ||
157 | pop ax ; Drop the successor function | ||
158 | .ok: ret ; Tailcall if OK, error return | ||
159 | |||
160 | ; | ||
161 | ; "serial" command | ||
162 | ; | ||
163 | pc_serial: call getint | ||
164 | jc .err | ||
165 | push bx ; Serial port # | ||
166 | call skipspace | ||
167 | jnc .ok | ||
168 | pop bx | ||
169 | .err: ret | ||
170 | .ok: | ||
171 | call ungetc | ||
172 | call getint | ||
173 | mov [FlowControl], word 0 ; Default to no flow control | ||
174 | jc .nobaud | ||
175 | .valid_baud: | ||
176 | push ebx | ||
177 | call skipspace | ||
178 | jc .no_flow | ||
179 | call ungetc | ||
180 | call getint ; Hardware flow control? | ||
181 | jnc .valid_flow | ||
182 | .no_flow: | ||
183 | xor bx,bx ; Default -> no flow control | ||
184 | .valid_flow: | ||
185 | and bh,0Fh ; FlowIgnore | ||
186 | shl bh,4 | ||
187 | mov [FlowIgnore],bh | ||
188 | mov bh,bl | ||
189 | and bx,0F003h ; Valid bits | ||
190 | mov [FlowControl],bx | ||
191 | pop ebx ; Baud rate | ||
192 | jmp short .parse_baud | ||
193 | .nobaud: | ||
194 | mov ebx,DEFAULT_BAUD ; No baud rate given | ||
195 | .parse_baud: | ||
196 | pop di ; Serial port # | ||
197 | cmp ebx,byte 75 | ||
198 | jb .err ; < 75 baud == bogus | ||
199 | mov eax,BAUD_DIVISOR | ||
200 | cdq | ||
201 | div ebx | ||
202 | mov [BaudDivisor],ax | ||
203 | push ax ; Baud rate divisor | ||
204 | cmp di,3 | ||
205 | ja .port_is_io ; If port > 3 then port is I/O addr | ||
206 | shl di,1 | ||
207 | mov di,[di+serial_base] ; Get the I/O port from the BIOS | ||
208 | .port_is_io: | ||
209 | mov [SerialPort],di | ||
210 | |||
211 | ; | ||
212 | ; Begin code to actually set up the serial port | ||
213 | ; | ||
214 | lea dx,[di+3] ; DX -> LCR | ||
215 | mov al,83h ; Enable DLAB | ||
216 | call slow_out | ||
217 | |||
218 | pop ax ; Divisor | ||
219 | mov dx,di ; DX -> LS | ||
220 | call slow_out | ||
221 | |||
222 | inc dx ; DX -> MS | ||
223 | mov al,ah | ||
224 | call slow_out | ||
225 | |||
226 | mov al,03h ; Disable DLAB | ||
227 | inc dx ; DX -> LCR | ||
228 | inc dx | ||
229 | call slow_out | ||
230 | |||
231 | in al,dx ; Read back LCR (detect missing hw) | ||
232 | cmp al,03h ; If nothing here we'll read 00 or FF | ||
233 | jne .serial_port_bad ; Assume serial port busted | ||
234 | dec dx | ||
235 | dec dx ; DX -> IER | ||
236 | xor al,al ; IRQ disable | ||
237 | call slow_out | ||
238 | |||
239 | inc dx ; DX -> FCR/IIR | ||
240 | mov al,01h | ||
241 | call slow_out ; Enable FIFOs if present | ||
242 | in al,dx | ||
243 | cmp al,0C0h ; FIFOs enabled and usable? | ||
244 | jae .fifo_ok | ||
245 | xor ax,ax ; Disable FIFO if unusable | ||
246 | call slow_out | ||
247 | .fifo_ok: | ||
248 | |||
249 | inc dx | ||
250 | inc dx ; DX -> MCR | ||
251 | in al,dx | ||
252 | or al,[FlowOutput] ; Assert bits | ||
253 | call slow_out | ||
254 | |||
255 | ; Show some life | ||
256 | mov si,syslinux_banner | ||
257 | call write_serial_str | ||
258 | mov si,copyright_str | ||
259 | call write_serial_str | ||
260 | ret | ||
261 | |||
262 | .serial_port_bad: | ||
263 | mov [SerialPort], word 0 | ||
264 | ret | ||
265 | |||
266 | ; | ||
267 | ; "F"-key command | ||
268 | ; | ||
269 | pc_fkey: push ax | ||
270 | call pc_getline | ||
271 | pop di | ||
272 | call mangle_name ; Mangle file name | ||
273 | ret | ||
274 | |||
275 | ; | ||
276 | ; "label" command | ||
277 | ; | ||
278 | pc_label: call commit_vk ; Commit any current vkernel | ||
279 | mov di,VKernelBuf ; Erase the vkernelbuf for better compression | ||
280 | mov cx,(vk_size >> 1) | ||
281 | xor ax,ax | ||
282 | rep stosw | ||
283 | call pc_getline | ||
284 | mov di,VKernelBuf+vk_vname | ||
285 | call mangle_name ; Mangle virtual name | ||
286 | mov byte [VKernel],1 ; We've seen a "label" statement | ||
287 | mov si,VKernelBuf+vk_vname ; By default, rname == vname | ||
288 | mov di,VKernelBuf+vk_rname | ||
289 | mov cx,FILENAME_MAX | ||
290 | rep movsb | ||
291 | mov si,AppendBuf ; Default append==global append | ||
292 | mov di,VKernelBuf+vk_append | ||
293 | mov cx,[AppendLen] | ||
294 | mov [VKernelBuf+vk_appendlen],cx | ||
295 | rep movsb | ||
296 | %if IS_PXELINUX ; PXELINUX only | ||
297 | mov al,[IPAppend] ; Default ipappend==global ipappend | ||
298 | mov [VKernelBuf+vk_ipappend],al | ||
299 | %endif | ||
300 | ret | ||
301 | |||
302 | ; | ||
303 | ; "say" command | ||
304 | ; | ||
305 | pc_say: call pc_getline ; "say" command | ||
306 | call writestr | ||
307 | jmp crlf ; tailcall | ||
308 | |||
309 | ; | ||
310 | ; Comment line | ||
311 | ; | ||
312 | pc_comment: ; Fall into pc_getline | ||
313 | |||
314 | ; | ||
315 | ; Common subroutine: load line into trackbuf; returns with SI -> trackbuf | ||
316 | ; | ||
317 | pc_getline: mov di,trackbuf | ||
318 | push di | ||
319 | call getline | ||
320 | xor al,al | ||
321 | stosb ; Null-terminate | ||
322 | pop si | ||
323 | ret | ||
324 | |||
325 | ; | ||
326 | ; Main loop for configuration file parsing | ||
327 | ; | ||
328 | parse_config: | ||
329 | mov di,VKernelBuf ; Clear VKernelBuf at start | ||
330 | xor ax,ax | ||
331 | mov cx,vk_size | ||
332 | rep stosb | ||
333 | .again: | ||
334 | call getcommand | ||
335 | jnc .again ; If not EOF do it again | ||
336 | ; | ||
337 | ; The fall through to commit_vk to commit any final | ||
338 | ; VKernel being read | ||
339 | ; | ||
340 | ; | ||
341 | ; commit_vk: Store the current VKernelBuf into buffer segment | ||
342 | ; | ||
343 | commit_vk: | ||
344 | ; For better compression, clean up the append field | ||
345 | mov ax,[VKernelBuf+vk_appendlen] | ||
346 | mov di,VKernelBuf+vk_append | ||
347 | add di,ax | ||
348 | mov cx,max_cmd_len+1 | ||
349 | sub cx,ax | ||
350 | xor ax,ax | ||
351 | rep stosb | ||
352 | |||
353 | ; Pack temporarily into trackbuf | ||
354 | mov si,VKernelBuf | ||
355 | mov di,trackbuf | ||
356 | mov cx,vk_size | ||
357 | call rllpack | ||
358 | ; Now DX = number of bytes | ||
359 | mov di,[VKernelBytes] | ||
360 | mov cx,dx | ||
361 | add dx,di | ||
362 | jc .overflow ; If > 1 segment | ||
363 | mov [VKernelBytes],dx | ||
364 | mov si,trackbuf | ||
365 | push es | ||
366 | push word vk_seg | ||
367 | pop es | ||
368 | rep movsb | ||
369 | pop es | ||
370 | ret | ||
371 | .overflow: | ||
372 | mov si,vk_overflow_msg | ||
373 | call writestr | ||
374 | ret | ||
375 | |||
376 | section .data | ||
377 | vk_overflow_msg db 'Out of memory parsing config file', CR, LF, 0 | ||
378 | |||
379 | align 4, db 0 | ||
380 | KbdTimeout dd 0 ; Keyboard timeout (if any) | ||
381 | TotalTimeout dd 0 ; Total timeout (if any) | ||
382 | AppendLen dw 0 ; Bytes in append= command | ||
383 | OntimeoutLen dw 0 ; Bytes in ontimeout command | ||
384 | OnerrorLen dw 0 ; Bytes in onerror command | ||
385 | CmdLinePtr dw cmd_line_here ; Command line advancing pointer | ||
386 | ForcePrompt dw 0 ; Force prompt | ||
387 | NoEscape dw 0 ; No escape | ||
388 | AllowImplicit dw 1 ; Allow implicit kernels | ||
389 | AllowOptions dw 1 ; User-specified options allowed | ||
390 | SerialPort dw 0 ; Serial port base (or 0 for no serial port) | ||
391 | VKernelBytes dw 0 ; Number of bytes used by vkernels | ||
392 | VKernel db 0 ; Have we seen any "label" statements? | ||
393 | |||
394 | section .latebss | ||
395 | alignb 4 ; For the good of REP MOVSD | ||
396 | command_line resb max_cmd_len+2 ; Command line buffer | ||
397 | alignb 4 | ||
398 | default_cmd resb max_cmd_len+1 ; "default" command line | ||
399 | |||
400 | %include "rllpack.inc" |