summaryrefslogtreecommitdiffstats
path: root/contrib/syslinux/syslinux-4.03/modules/pxechain.asm
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/syslinux/syslinux-4.03/modules/pxechain.asm')
-rw-r--r--contrib/syslinux/syslinux-4.03/modules/pxechain.asm558
1 files changed, 0 insertions, 558 deletions
diff --git a/contrib/syslinux/syslinux-4.03/modules/pxechain.asm b/contrib/syslinux/syslinux-4.03/modules/pxechain.asm
deleted file mode 100644
index 35c1969..0000000
--- a/contrib/syslinux/syslinux-4.03/modules/pxechain.asm
+++ /dev/null
@@ -1,558 +0,0 @@
-; "$Id: pxechain.asm,v 1.2 2007/12/16 08:15:39 jhutz Exp $"
-; -*- fundamental -*- (asm-mode sucks) vim:noet:com=\:;
-; ****************************************************************************
-;
-; pxechain.asm
-;
-; A comboot program to chain from PXELINUX to another PXE network
-; bootstrap program (NBP). This improves on PXELINUX's built-in PXE
-; chaining support by arranging for the server address and boot filename
-; reported by the PXE stack to be those from which the new NBP was
-; loaded, allowing PXELINUX to be used to select from multiple NBP's,
-; such as gPXE, another PXELINUX(*), Windows RIS, and so on.
-;
-; (*) This seems unnecessary at first, but it is very helpful when
-; selecting from among self-contained network boot images.
-;
-; Copyright (c) 2007 Carnegie Mellon University
-; Copyright (C) 1994-2007 H. Peter Anvin
-;
-; This program is free software; you can redistribute it and/or modify
-; it under the terms of the GNU General Public License as published by
-; the Free Software Foundation, Inc., 53 Temple Place Ste 330,
-; Boston MA 02111-1307, USA; either version 2 of the License, or
-; (at your option) any later version; incorporated herein by reference.
-;
-; ****************************************************************************
-
-;%define DEBUG
-;%define NO_RUN
-
- absolute 0
-pspInt20: resw 1
-pspNextP: resw 1
- resb 124
-pspCmdLen: resb 1
-pspCmdArg: resb 127
-
- section .text
- org 0x100
-
-%ifdef DEBUG
-%macro MARK 1.nolist
- mov ah,0x02
- mov dl,%1&0xff
- int 0x21
-%if (%1 >> 8) & 0xff
- mov dl,(%1 >> 8) & 0xff
- int 0x21
-%if (%1 >> 16) & 0xff
- mov dl,(%1 >> 16) & 0xff
- int 0x21
-%if (%1 >> 24) & 0xff
- mov dl,(%1 >> 24) & 0xff
- int 0x21
-%endif
-%endif
-%endif
- mov dl,' '
- int 0x21
-%endmacro
-%macro SHOWD 1.nolist
- mov al,%1
- call print_dec
- mov ah,0x02
- mov dl,' '
- int 0x21
-%endmacro
-%macro SHOWX 1.nolist
- mov bx,%1
- call print_hex
- mov ah,0x02
- mov dl,' '
- int 0x21
-%endmacro
-%else
-%macro MARK 1.nolist
-%endmacro
-%macro SHOWD 1.nolist
-%endmacro
-%macro SHOWX 1.nolist
-%endmacro
-%endif
-
-_start:
- MARK 'INIT'
-
-; There should be exactly one command-line argument, which is of the form
-; [[ipaddress]::]tftp_filename, just like filenames given to PXELINUX.
-; Too few or too many arguments is an error.
-;
-; This code is based on mangle_name in pxelinux.asm
-parse_args:
- cld
- xor cx,cx
- mov cl,[pspCmdLen]
- dec cx
- mov si,pspCmdArg+1
- and cx,cx
- je near usage ; no args is bad
- add si,cx
- dec si
- std
-.chomp: lodsb
- cmp al,' '
- loopz .chomp
- inc cx
- cld
- mov [pspCmdLen],cl
- mov si,pspCmdArg+1
- cmp word [si],'::' ; Leading ::?
- je near gotprefix
- dec cx
- jz noip
- MARK 'SCAN'
-
-.more:
- inc si
- cmp byte [si],' '
- je near usage
- cmp word [si],'::'
- je near parse_ip
- loop .more
-
-noip:
- MARK 'NOIP'
- mov ax,0x0e ; get config file name
- int 0x22
- mov si,bx
-%ifdef DEBUG
- mov ah,0x02
- mov dl,'['
- int 0x21
- mov ax,0x02
- int 0x22
- mov ah,0x02
- mov dl,']'
- int 0x21
- mov dl,' '
- int 0x21
-%endif
- push ds
- push es
- pop ds
- pop es
- push es
-.find_prefix:
- lodsb
- and al,al
- jnz .find_prefix
- dec si
-
- mov cx,si
- sub cx,bx
- MARK 'LEN'
- SHOWD cl ; assume it's <256 for debugging
- dec si
- std
-.find_slash:
- lodsb
- cmp al,'/'
- je .slash
- loop .find_slash
-.slash:
- cmp cx,127
- cld
- jna .copy_prefix
- pop ds
- jmp too_long
-
-.copy_prefix:
- SHOWD cl
- MARK 'PFX'
- mov si,bx
- mov di,tftp_filename
- mov bx,128
- sub bx,cx
- rep movsb
- pop ds
-
- mov cl,[pspCmdLen]
- mov si,pspCmdArg+1
- jmp prefix_done
-
-usage:
- xor cx,cx
- mov si,msg_usage
- jmp fail
-
-too_long:
- xor cx,cx
- mov si,msg_too_long
- jmp fail
-
-parse_ip:
- MARK 'PIP'
- mov di,si
- mov si,pspCmdArg+1
- call parse_dotquad
- jc .notdq
- cmp si,di ; is it the same place?
- jne .notdq
- mov [tftp_siaddr],eax
- jmp gotprefix
-.notdq:
- MARK 'NDQ'
- mov si,di
- mov bx,pspCmdArg+1
- mov ax,0x0010 ; DNS resolve
- int 0x22
- and eax,eax
- jz noip
- mov [tftp_siaddr],eax
-gotprefix:
- MARK 'GOTP'
- dec cx ; skip the ::
- dec cx
- inc si
- inc si
- mov di,tftp_filename
- mov bx,128
-
-prefix_done:
- SHOWD bl
- MARK 'LEFT'
-
-; SI points at the filename, plus remaining arguments,
-; CX contains their combined length.
-; DI points to where the filename should be stored
-; BX says how much space is left for the filename and NUL
-
- and cx,cx
- jz usage ; no args is bad
-.copy_filename:
- lodsb
-%ifdef DEBUG
- mov dl,al
- mov ah,0x2
- int 0x21
-%endif
- cmp al,' '
- je usage
- dec bx
- jz too_long
- stosb
- loop .copy_filename
- xor eax,eax
- stosb
-
-; get PXE cached data
- MARK 'GCI'
- mov ax,0x0009 ; call PXE stack
- mov bx,0x0071 ; PXENV_GET_CACHED_INFO
- mov di,PXECacheParms
- int 0x22
- and eax,eax
- jz .fix_siaddr
- mov cx,[gci_status]
- mov si,msg_get_cache
- jmp fail
-
-.fix_siaddr:
- mov bx,[gci_bufferseg]
- mov es,bx
- mov bx,[gci_buffer]
- mov eax,[es:bx+12] ; save our address (ciaddr)
- mov [open_ciaddr],eax ; ... in case we have to do UDP open
- mov eax,[tftp_siaddr]
- and eax,eax
- jnz .replace_addr
- MARK 'ADDR'
- mov eax,[es:bx+20] ; siaddr
- mov [tftp_siaddr],eax
- jmp .addr_done
-.replace_addr:
- mov [es:bx+20],eax
-.addr_done:
- mov si,tftp_filename ; copy the new filename...
- lea di,[es:bx+108] ; to the "cached DHCP response"
- mov cx,128
- rep movsb
- mov bx,ds ; restore es before proceeding
- mov es,bx
-
-; print out what we are doing
-%ifdef DEBUG
- mov ah,0x02 ; write character
- mov dl,0x0d ; print a CRLF first
- int 0x21
- mov dl,0x0a
- int 0x21
-%endif
- mov ax,0x0002 ; write string
- mov bx,msg_booting
- int 0x22
- mov ebx,[tftp_siaddr]
- call print_dotquad
- mov ah,0x02 ; write character
- mov dl,' '
- int 0x21
- mov ax,0x0002 ; write string
- mov bx,tftp_filename
- int 0x22
- mov ah,0x02 ; write character
- mov dl,0x0d
- int 0x21
- mov dl,0x0a
- int 0x21
-
-%ifndef NO_RUN
- mov ax,0x0009 ; call PXE stack
- mov bx,0x0031 ; PXENV_UDP_CLOSE
- mov di,PXECloseParms
- int 0x22
- mov cx,[close_status]
- mov si,msg_udp_close
- and ax,ax
- jnz fail
-
- mov ax,0x0009 ; call PXE stack
- mov bx,0x0073 ; PXENV_RESTART_TFTP
- mov di,PXERestartTFTPParms
- int 0x22
- mov cx,[tftp_status]
- mov si,msg_rst_tftp
- call fail
-
- mov ax,0x0009 ; call PXE stack
- mov bx,0x0030 ; PXENV_UDP_OPEN
- mov di,PXEOpenParms
- int 0x22
- mov cx,[open_status]
- mov si,msg_udp_open
- and ax,ax
- jnz fail
- ret
-%endif
-
-fail:
- MARK 'FAIL'
- SHOWX cs
- SHOWX ds
- SHOWX es
- SHOWX si
-%ifdef DEBUG
- mov ah,0x02 ; write character
- mov dl,0x0d ; print a CRLF first
- int 0x21
- mov dl,0x0a
- int 0x21
-%endif
- mov ax,0x0002 ; write string
- mov bx,msg_progname ; print our name
- int 0x22
- mov bx,si ; ... the error message
- int 0x22
- mov ah,0x02 ; write character
- jcxz .done
- mov dl,' ' ; ... and the error code, in []
- int 0x21
- mov dl,'['
- int 0x21
- mov bx,cx
- call print_hex
- mov ah,0x02 ; write character
- mov dl,']'
- int 0x21
-.done:
- mov dl,0x0d ; and finally a CRLF
- int 0x21
- mov dl,0x0a
- int 0x21
- ret
-
-
-; print_hex
-;
-; Take a 16-bit integer in BX and print it as 2 hex digits.
-; Destroys AX and DL.
-;
-print_hex:
- mov al,bh
- aam 16
- cmp ah,10
- jb .lt_a000
- add ah,'A'-'0'-10
-.lt_a000: add ah,'0'
- mov dl,ah
- mov ah,0x02 ; write character
- int 0x21
-
- cmp al,10
- jb .lt_a00
- add al,'A'-'0'-10
-.lt_a00: add al,'0'
- mov dl,al
- mov ah,0x02 ; write character
- int 0x21
-
- mov al,bl
- aam 16
- cmp ah,10
- jb .lt_a0
- add ah,'A'-'0'-10
-.lt_a0: add ah,'0'
- mov dl,ah
- mov ah,0x02 ; write character
- int 0x21
-
- cmp al,10
- jb .lt_a
- add al,'A'-'0'-10
-.lt_a: add al,'0'
- mov dl,al
- mov ah,0x02 ; write character
- int 0x21
- ret
-
-
-; print_dec
-;
-; Take an 8-bit integer in AL and print it in decimal.
-; Destroys AX and DL.
-;
-print_dec:
- cmp al,10 ; < 10?
- jb .lt10 ; If so, skip first 2 digits
-
- cmp al,100 ; < 100
- jb .lt100 ; If so, skip first digit
-
- aam 100
- ; Now AH = 100-digit; AL = remainder
- add ah,'0'
- mov dl,ah
- mov ah,0x02
- int 0x21
-
-.lt100:
- aam 10
- ; Now AH = 10-digit; AL = remainder
- add ah,'0'
- mov dl,ah
- mov ah,0x02
- int 0x21
-
-.lt10:
- add al,'0'
- mov dl,al
- mov ah,0x02
- int 0x21
- ret
-
-
-; print_dotquad
-;
-; Take an IP address (in network byte order) in EBX and print it
-; as a dotted quad.
-; Destroys EAX, EBX, ECX, EDX
-;
-print_dotquad:
- mov cx,3
-.octet:
- mov al,bl
- call print_dec
- jcxz .done
- mov ah,0x02
- mov dl,'.'
- int 0x21
- ror ebx,8 ; Move next char into LSB
- dec cx
- jmp .octet
-.done:
- ret
-
-
-; parse_dotquad:
-; Read a dot-quad pathname in DS:SI and output an IP
-; address in EAX, with SI pointing to the first
-; nonmatching character.
-;
-; Return CF=1 on error.
-;
-; No segment assumptions permitted.
-;
-parse_dotquad:
- push cx
- mov cx,4
- xor eax,eax
-.parseloop:
- mov ch,ah
- mov ah,al
- lodsb
- sub al,'0'
- jb .notnumeric
- cmp al,9
- ja .notnumeric
- aad ; AL += 10 * AH; AH = 0;
- xchg ah,ch
- jmp .parseloop
-.notnumeric:
- cmp al,'.'-'0'
- pushf
- mov al,ah
- mov ah,ch
- xor ch,ch
- ror eax,8
- popf
- jne .error
- loop .parseloop
- jmp .done
-.error:
- loop .realerror ; If CX := 1 then we're done
- clc
- jmp .done
-.realerror:
- stc
-.done:
- dec si ; CF unchanged!
- pop cx
- ret
-
- section .data
-msg_booting: db 'TFTP boot: ',0
-msg_progname: db 'pxechain: ',0
-msg_usage: db 'usage: pxechain.cbt [[ipaddress]::]filename',0dh,0ah,0
-msg_too_long: db 'pxechain: filename is too long (max 127)',0dh,0ah,0
-msg_get_cache: db 'PXENV_GET_CACHED_INFO',0
-msg_rst_tftp: db 'PXENV_RESTART_TFTP',0
-msg_udp_close: db 'PXENV_UDP_CLOSE',0
-msg_udp_open: db 'PXENV_UDP_OPEN',0
-
-PXECacheParms:
-gci_status: dw 0
-gci_packettype: dw 3 ; PXENV_PACKET_TYPE_CACHED_REPLY
-gci_buffersize: dw 0
-gci_buffer: dw 0
-gci_bufferseg: dw 0
-gci_bufferlim: dw 0
-
-PXERestartTFTPParms:
-tftp_status: dw 0
-tftp_filename: times 128 db 0
-tftp_bufsize: dd 0x00090000 ; available memory for NBP
-tftp_bufaddr: dd 0x00007c00 ; PXE NBP load address
-tftp_siaddr: dd 0
-tftp_giaddr: dd 0
-tftp_mcaddr: dd 0
-tftp_mcport: dw 0
-tftp_msport: dw 0
-tftp_timeout: dw 0
-tftp_reopendly: dw 0
-
-PXECloseParms:
-close_status: dw 0
-
-PXEOpenParms:
-open_status: dw 0
-open_ciaddr: dd 0