Magellan Linux

Contents of /trunk/mkinitrd-magellan/isolinux/parseconfig.inc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 532 - (show annotations) (download)
Sat Sep 1 22:45:15 2007 UTC (16 years, 8 months ago) by niro
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 ;; $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"