mboot.c32:load ELF segments from the segment header
[syslinux.git] / parseconfig.inc
blob122a23089ddc537ed5cee25bae6c80f6e7518fad
1 ;; $Id$
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.
12 ;; -----------------------------------------------------------------------
15 ;; parseconfig.inc
17 ;; Configuration file operations
20                 section .text
22 ; "default" command
23
24 pc_default:     mov di,default_cmd
25                 call getline
26                 mov byte [di-1],0               ; null-terminate
27                 ret
30 ; "ontimeout" command
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
39 ; "onerror" command
41 pc_onerror:     mov di,Onerror
42                 call getline
43                 sub di,Onerror
44                 mov [OnerrorLen],di
45                 ret
48 ; "append" command
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
69 ; "ipappend" command (PXELINUX only)
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
83 ; "localboot" command (PXELINUX, ISOLINUX)
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
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
113 ; "timeout", "totaltimeout" command
115 ; N.B. 1/10 s ~ 1.D2162AABh clock ticks
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
129 ; "totaltimeout" command
131 pc_totaltimeout:
134 ; Generic integer variable setting commands:
135 ; "prompt", "implicit"
137 pc_setint16:
138                 push ax
139                 call getint
140                 pop si
141                 jc .err
142                 mov [si],bx
143 .err:           ret
146 ; Generic file-processing commands:
147 ; "display", "font", "kbdmap"
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
161 ; "serial" command
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
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
218                 pop ax                          ; Divisor
219                 mov dx,di                       ; DX -> LS
220                 call slow_out
222                 inc dx                          ; DX -> MS
223                 mov al,ah
224                 call slow_out
226                 mov al,03h                      ; Disable DLAB
227                 inc dx                          ; DX -> LCR
228                 inc dx
229                 call slow_out
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
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:
249                 inc dx
250                 inc dx                          ; DX -> MCR
251                 in al,dx
252                 or al,[FlowOutput]              ; Assert bits
253                 call slow_out
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
262 .serial_port_bad:
263                 mov [SerialPort], word 0
264                 ret
267 ; "F"-key command
269 pc_fkey:        push ax
270                 call pc_getline
271                 pop di
272                 call mangle_name                ; Mangle file name
273                 ret
276 ; "label" command
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
303 ; "say" command
305 pc_say:         call pc_getline                 ; "say" command
306                 call writestr
307                 jmp crlf                        ; tailcall
310 ; Comment line
312 pc_comment:     ; Fall into pc_getline
315 ; Common subroutine: load line into trackbuf; returns with SI -> trackbuf
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
326 ; Main loop for configuration file parsing
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                 ;
341 ; commit_vk: Store the current VKernelBuf into buffer segment
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
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
376                 section .data
377 vk_overflow_msg db 'Out of memory parsing config file', CR, LF, 0
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?
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
400 %include "rllpack.inc"