Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1133 - (hide annotations) (download)
Thu Aug 19 09:50:43 2010 UTC (13 years, 8 months ago) by niro
File size: 10129 byte(s)
-updated to isolinux-3.86
1 niro 532 ;; -----------------------------------------------------------------------
2     ;;
3 niro 1133 ;; Copyright 1994-2009 H. Peter Anvin - All Rights Reserved
4     ;; Copyright 2009 Intel Corporation; author: H. Peter Anvin
5     ;;
6 niro 532 ;; 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 niro 1133 ; "default" or "ui" command, with level (1 = default, 2 = ui)
23     ;
24     pc_default: cmp ax,[DefaultLevel]
25     jb skipline ; == call skipline + ret
26     mov [DefaultLevel],ax
27     mov di,default_cmd
28 niro 532 call getline
29     mov byte [di-1],0 ; null-terminate
30     ret
31    
32     ;
33     ; "ontimeout" command
34     ;
35     pc_ontimeout: mov di,Ontimeout
36     call getline
37     sub di,Ontimeout+1 ; Don't need final space
38     mov [OntimeoutLen],di
39     ret
40    
41     ;
42     ; "onerror" command
43     ;
44     pc_onerror: mov di,Onerror
45     call getline
46     sub di,Onerror
47     mov [OnerrorLen],di
48     ret
49    
50     ;
51     ; "append" command
52     ;
53     pc_append: cmp byte [VKernel],0
54     ja .vk
55     mov di,AppendBuf
56     call getline
57     sub di,AppendBuf
58 niro 1133 .app1: mov [AppendLen],di
59 niro 532 ret
60     .vk: mov di,VKernelBuf+vk_append ; "append" command (vkernel)
61     call getline
62     sub di,VKernelBuf+vk_append
63     cmp di,byte 2
64     jne .app2
65     cmp byte [VKernelBuf+vk_append],'-'
66     jne .app2
67     xor di,di ; If "append -" -> null string
68     .app2: mov [VKernelBuf+vk_appendlen],di
69     ret
70    
71     ;
72     ; "ipappend" command (PXELINUX only)
73     ;
74     %if IS_PXELINUX
75     pc_ipappend: call getint
76     jc .err
77     cmp byte [VKernel],0
78     jne .vk
79     mov [IPAppend],bl
80     .err: ret
81     .vk: mov [VKernelBuf+vk_ipappend],bl
82     ret
83     %endif
84    
85     ;
86 niro 1133 ; "localboot" command
87 niro 532 ;
88 niro 1133 %if HAS_LOCALBOOT
89    
90 niro 532 pc_localboot: call getint
91     cmp byte [VKernel],0 ; ("label" section only)
92     je .err
93 niro 1133 mov [VKernelBuf+vk_rname],bx
94     mov byte [VKernelBuf+vk_type],VK_LOCALBOOT
95 niro 532 .err: ret
96    
97 niro 1133 %endif ; HAS_LOCALBOOT
98    
99 niro 532 ;
100 niro 1133 ; "kernel", "config", ... command
101     ;
102 niro 532 pc_kernel: cmp byte [VKernel],0
103     je .err ; ("label" section only)
104 niro 1133 mov [VKernelBuf+vk_type],al
105 niro 532 call pc_getline
106     mov di,VKernelBuf+vk_rname
107     call mangle_name
108     .err: ret
109    
110     ;
111     ; "timeout", "totaltimeout" command
112     ;
113     ; N.B. 1/10 s ~ 1.D2162AABh clock ticks
114     ;
115     pc_timeout: push ax
116     call getint
117     pop si
118     jc .err
119     mov eax,0D2162AABh
120     mul ebx ; clock ticks per 1/10 s
121     add ebx,edx
122     mov [si],ebx
123     .err: ret
124    
125    
126     ;
127     ; "totaltimeout" command
128     ;
129     pc_totaltimeout:
130    
131     ;
132     ; Generic integer variable setting commands:
133     ; "prompt", "implicit"
134     ;
135     pc_setint16:
136     push ax
137     call getint
138     pop si
139     jc .err
140     mov [si],bx
141     .err: ret
142    
143     ;
144     ; Generic file-processing commands:
145 niro 1133 ; "font", "kbdmap",
146 niro 532 ;
147     pc_filecmd: push ax ; Function to tailcall
148     call pc_getline
149     mov di,MNameBuf
150     call mangle_name
151 niro 1133 call searchdir
152 niro 532 jnz .ok
153     pop ax ; Drop the successor function
154     .ok: ret ; Tailcall if OK, error return
155    
156     ;
157 niro 1133 ; Commands that expect the file to be opened on top of the getc stack.
158     ; "display", "include"
159     ;
160     pc_opencmd: push ax ; Function to tailcall
161     call pc_getline
162     mov di,MNameBuf
163     call mangle_name
164     call open
165     jnz .ok
166     pop ax ; Drop the successor function
167     .ok: ret ; Tailcall if OK, error return
168    
169     ;
170     ; "include" command (invoked from pc_opencmd)
171     ;
172     pc_include: inc word [IncludeLevel]
173     .err: ret
174    
175     ;
176 niro 532 ; "serial" command
177     ;
178     pc_serial: call getint
179     jc .err
180     push bx ; Serial port #
181 niro 1133 xor eax,eax
182     mov [FlowControl],eax ; Default to no flow control
183 niro 532 call skipspace
184 niro 1133 jc .nobaud
185 niro 532 call ungetc
186     call getint
187     jc .nobaud
188 niro 1133 .valid_baud:
189 niro 532 push ebx
190     call skipspace
191     jc .no_flow
192     call ungetc
193     call getint ; Hardware flow control?
194     jnc .valid_flow
195     .no_flow:
196     xor bx,bx ; Default -> no flow control
197     .valid_flow:
198     and bh,0Fh ; FlowIgnore
199     shl bh,4
200     mov [FlowIgnore],bh
201     mov bh,bl
202 niro 1133 and bx,0F00Bh ; Valid bits
203 niro 532 mov [FlowControl],bx
204     pop ebx ; Baud rate
205     jmp short .parse_baud
206     .nobaud:
207     mov ebx,DEFAULT_BAUD ; No baud rate given
208     .parse_baud:
209     pop di ; Serial port #
210     cmp ebx,byte 75
211     jb .err ; < 75 baud == bogus
212     mov eax,BAUD_DIVISOR
213     cdq
214     div ebx
215     mov [BaudDivisor],ax
216     push ax ; Baud rate divisor
217     cmp di,3
218     ja .port_is_io ; If port > 3 then port is I/O addr
219     shl di,1
220     mov di,[di+serial_base] ; Get the I/O port from the BIOS
221     .port_is_io:
222     mov [SerialPort],di
223    
224     ;
225     ; Begin code to actually set up the serial port
226     ;
227 niro 1133 call sirq_cleanup_nowipe ; Cleanup existing IRQ handler
228    
229 niro 532 lea dx,[di+3] ; DX -> LCR
230     mov al,83h ; Enable DLAB
231 niro 1133 slow_out dx,al
232 niro 532
233     pop ax ; Divisor
234     mov dx,di ; DX -> LS
235 niro 1133 slow_out dx,al
236 niro 532
237     inc dx ; DX -> MS
238     mov al,ah
239 niro 1133 slow_out dx,al
240 niro 532
241     mov al,03h ; Disable DLAB
242     inc dx ; DX -> LCR
243     inc dx
244 niro 1133 slow_out dx,al
245 niro 532
246 niro 1133 in al,dx ; Read back LCR (detect missing hw)
247     cmp al,03h ; If nothing here we'll read 00 or FF
248     jne .err ; Assume serial port busted
249     dec dx ; DX -> IIR/FCR
250 niro 532 mov al,01h
251 niro 1133 slow_out dx,al ; Enable FIFOs if present
252 niro 532 in al,dx
253     cmp al,0C0h ; FIFOs enabled and usable?
254     jae .fifo_ok
255     xor ax,ax ; Disable FIFO if unusable
256 niro 1133 slow_out dx,al
257 niro 532 .fifo_ok:
258    
259     inc dx
260     inc dx ; DX -> MCR
261 niro 1133 mov al,[FlowOutput] ; Assert bits
262     slow_out dx,al
263 niro 532
264 niro 1133 ; Enable interrupts if requested
265     test al,8
266     jz .noirq
267     call sirq_install
268     .noirq:
269    
270 niro 532 ; Show some life
271 niro 1133 cmp byte [SerialNotice],0
272     je .notfirst
273     mov byte [SerialNotice],0
274    
275 niro 532 mov si,syslinux_banner
276     call write_serial_str
277     mov si,copyright_str
278     call write_serial_str
279 niro 1133 .notfirst:
280 niro 532 ret
281    
282 niro 1133 .err:
283 niro 532 mov [SerialPort], word 0
284     ret
285    
286     ;
287 niro 1133 ; Store mangled filename command (F-keys, "initrd")
288 niro 532 ;
289 niro 1133 pc_filename: push ax
290 niro 532 call pc_getline
291     pop di
292     call mangle_name ; Mangle file name
293     ret
294    
295     ;
296     ; "label" command
297     ;
298     pc_label: call commit_vk ; Commit any current vkernel
299 niro 1133 mov byte [InitRD+NULLOFFSET],NULLFILE ; No "initrd" statement
300 niro 532 mov di,VKernelBuf ; Erase the vkernelbuf for better compression
301     mov cx,(vk_size >> 1)
302     xor ax,ax
303     rep stosw
304     call pc_getline
305     mov di,VKernelBuf+vk_vname
306 niro 1133 mov cx,FILENAME_MAX-1
307     .loop:
308     lodsb
309     cmp al,' '
310     jna .done
311     stosb
312     loop .loop
313     .done:
314 niro 532 mov byte [VKernel],1 ; We've seen a "label" statement
315 niro 1133 mov si,VKernelBuf+vk_vname ; By default, rname == mangled vname
316 niro 532 mov di,VKernelBuf+vk_rname
317 niro 1133 call mangle_name
318     mov si,AppendBuf ; Default append==global append
319     mov di,VKernelBuf+vk_append
320     mov cx,[AppendLen]
321     mov [VKernelBuf+vk_appendlen],cx
322 niro 532 rep movsb
323     %if IS_PXELINUX ; PXELINUX only
324     mov al,[IPAppend] ; Default ipappend==global ipappend
325     mov [VKernelBuf+vk_ipappend],al
326     %endif
327     ret
328    
329     ;
330     ; "say" command
331     ;
332     pc_say: call pc_getline ; "say" command
333     call writestr
334     jmp crlf ; tailcall
335    
336     ;
337 niro 1133 ; "text" command; ignore everything until we get an "endtext" line
338     ;
339     pc_text: call skipline ; Ignore rest of line
340     .loop:
341     call pc_getline
342     jc .eof
343    
344     ; Leading spaces are already removed...
345     lodsd
346     and eax,0xdfdfdfdf ; Upper case
347     cmp eax,'ENDT'
348     jne .loop
349     lodsd
350     and eax,0x00dfdfdf ; Upper case and mask
351     cmp eax,'EXT'
352     jne .loop
353     ; If we get here we hit ENDTEXT
354     .eof:
355     ret
356    
357     ;
358 niro 532 ; Comment line
359     ;
360     pc_comment: ; Fall into pc_getline
361    
362     ;
363     ; Common subroutine: load line into trackbuf; returns with SI -> trackbuf
364 niro 1133 ; CF is set on EOF.
365 niro 532 ;
366     pc_getline: mov di,trackbuf
367     push di
368     call getline
369 niro 1133 mov byte [di],0 ; Null-terminate
370 niro 532 pop si
371     ret
372    
373     ;
374     ; Main loop for configuration file parsing
375     ;
376     parse_config:
377     mov di,VKernelBuf ; Clear VKernelBuf at start
378     xor ax,ax
379     mov cx,vk_size
380     rep stosb
381 niro 1133
382 niro 532 .again:
383 niro 1133 call getcommand ; Parse one command
384     jnc .again ; If not EOF...
385     call close
386     dec word [IncludeLevel] ; Still parsing?
387     jnz .again
388    
389 niro 532 ;
390     ; The fall through to commit_vk to commit any final
391     ; VKernel being read
392     ;
393     ;
394     ; commit_vk: Store the current VKernelBuf into buffer segment
395     ;
396     commit_vk:
397 niro 1133 cmp byte [VKernel],0
398     jz .nolabel ; Nothing to commit...
399    
400     mov di,VKernelBuf+vk_append
401     add di,[VKernelBuf+vk_appendlen]
402    
403     ; If we have an initrd statement, append it to the
404     ; append statement
405     cmp byte [InitRD+NULLOFFSET],NULLFILE
406     je .noinitrd
407    
408     mov si,str_initrd
409     mov cx,7 ; "initrd="
410     rep movsb
411     mov si,InitRD
412     call unmangle_name
413     mov al,' '
414     stosb
415    
416 niro 532 ; For better compression, clean up the append field
417 niro 1133 .noinitrd:
418     mov ax,di
419     sub ax,VKernelBuf+vk_append
420     mov [VKernelBuf+vk_appendlen],ax
421 niro 532 mov cx,max_cmd_len+1
422     sub cx,ax
423     xor ax,ax
424     rep stosb
425    
426 niro 1133 ; Pack into high memory
427     mov esi,VKernelBuf
428     mov edi,[VKernelEnd]
429     mov ecx,vk_size
430 niro 532 call rllpack
431 niro 1133 mov [VKernelEnd],edi
432     .nolabel:
433 niro 532 ret
434     .overflow:
435     mov si,vk_overflow_msg
436     call writestr
437     ret
438    
439     section .data
440     vk_overflow_msg db 'Out of memory parsing config file', CR, LF, 0
441 niro 1133 SerialNotice db 1 ; Only print this once
442 niro 532
443 niro 1133 section .bss
444     alignb 4
445     VKernelEnd resd 1 ; Lowest high memory address used
446    
447     ; This symbol should be used by loaders to indicate
448     ; the highest address *they* are allowed to use.
449     HighMemRsvd equ VKernelEnd
450     ; by vkernels
451     section .config
452     alignz 4
453 niro 532 KbdTimeout dd 0 ; Keyboard timeout (if any)
454     TotalTimeout dd 0 ; Total timeout (if any)
455     AppendLen dw 0 ; Bytes in append= command
456     OntimeoutLen dw 0 ; Bytes in ontimeout command
457     OnerrorLen dw 0 ; Bytes in onerror command
458     CmdLinePtr dw cmd_line_here ; Command line advancing pointer
459     ForcePrompt dw 0 ; Force prompt
460     NoEscape dw 0 ; No escape
461 niro 1133 NoComplete dw 0 ; No label completion on TAB key
462 niro 532 AllowImplicit dw 1 ; Allow implicit kernels
463     AllowOptions dw 1 ; User-specified options allowed
464 niro 1133 IncludeLevel dw 1 ; Nesting level
465     DefaultLevel dw 0 ; The current level of default
466 niro 532 VKernel db 0 ; Have we seen any "label" statements?
467    
468 niro 1133 %if IS_PXELINUX
469     IPAppend db 0 ; Default IPAPPEND option
470     %endif
471    
472     section .uibss
473 niro 532 alignb 4 ; For the good of REP MOVSD
474     command_line resb max_cmd_len+2 ; Command line buffer
475     alignb 4
476     default_cmd resb max_cmd_len+1 ; "default" command line
477    
478     %include "rllpack.inc"