summaryrefslogtreecommitdiffstats
path: root/contrib/syslinux/syslinux-4.03/core/pxelinux.asm
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/syslinux/syslinux-4.03/core/pxelinux.asm')
-rw-r--r--contrib/syslinux/syslinux-4.03/core/pxelinux.asm545
1 files changed, 0 insertions, 545 deletions
diff --git a/contrib/syslinux/syslinux-4.03/core/pxelinux.asm b/contrib/syslinux/syslinux-4.03/core/pxelinux.asm
deleted file mode 100644
index a46b3da..0000000
--- a/contrib/syslinux/syslinux-4.03/core/pxelinux.asm
+++ /dev/null
@@ -1,545 +0,0 @@
-; -*- fundamental -*- (asm-mode sucks)
-; ****************************************************************************
-;
-; pxelinux.asm
-;
-; A program to boot Linux kernels off a TFTP server using the Intel PXE
-; network booting API. It is based on the SYSLINUX boot loader for
-; MS-DOS floppies.
-;
-; Copyright 1994-2009 H. Peter Anvin - All Rights Reserved
-; Copyright 2009 Intel Corporation; author: 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 IS_PXELINUX 1
-%include "head.inc"
-%include "pxe.inc"
-
-; gPXE extensions support
-%define GPXE 1
-
-;
-; Some semi-configurable constants... change on your own risk.
-;
-my_id equ pxelinux_id
-NULLFILE equ 0 ; Zero byte == null file name
-NULLOFFSET equ 0 ; Position in which to look
-REBOOT_TIME equ 5*60 ; If failure, time until full reset
-%assign HIGHMEM_SLOP 128*1024 ; Avoid this much memory near the top
-TFTP_BLOCKSIZE_LG2 equ 9 ; log2(bytes/block)
-TFTP_BLOCKSIZE equ (1 << TFTP_BLOCKSIZE_LG2)
-
-SECTOR_SHIFT equ TFTP_BLOCKSIZE_LG2
-SECTOR_SIZE equ TFTP_BLOCKSIZE
-
-;
-; The following structure is used for "virtual kernels"; i.e. LILO-style
-; option labels. The options we permit here are `kernel' and `append
-; Since there is no room in the bottom 64K for all of these, we
-; stick them in high memory and copy them down before we need them.
-;
- struc vkernel
-vk_vname: resb FILENAME_MAX ; Virtual name **MUST BE FIRST!**
-vk_rname: resb FILENAME_MAX ; Real name
-vk_ipappend: resb 1 ; "IPAPPEND" flag
-vk_type: resb 1 ; Type of file
-vk_appendlen: resw 1
- alignb 4
-vk_append: resb max_cmd_len+1 ; Command line
- alignb 4
-vk_end: equ $ ; Should be <= vk_size
- endstruc
-
-
-; ---------------------------------------------------------------------------
-; BEGIN CODE
-; ---------------------------------------------------------------------------
-
-;
-; Memory below this point is reserved for the BIOS and the MBR
-;
- section .earlybss
- global trackbuf
-trackbufsize equ 8192
-trackbuf resb trackbufsize ; Track buffer goes here
- ; ends at 2800h
-
- ; These fields save information from before the time
- ; .bss is zeroed... must be in .earlybss
- global InitStack
-InitStack resd 1
-
- section .bss16
- alignb FILENAME_MAX
-PXEStack resd 1 ; Saved stack during PXE call
-
- alignb 4
- global DHCPMagic, RebootTime, APIVer
-RebootTime resd 1 ; Reboot timeout, if set by option
-StrucPtr resw 2 ; Pointer to PXENV+ or !PXE structure
-APIVer resw 1 ; PXE API version found
-LocalBootType resw 1 ; Local boot return code
-DHCPMagic resb 1 ; PXELINUX magic flags
-
- section .text16
-StackBuf equ STACK_TOP-44 ; Base of stack if we use our own
-StackHome equ StackBuf
-
- ; PXE loads the whole file, but assume it can't be more
- ; than (384-31)K in size.
-MaxLMA equ 384*1024
-
-;
-; Primary entry point.
-;
-bootsec equ $
-_start:
- jmp 0:_start1 ; Canonicalize the address and skip
- ; the patch header
-
-;
-; Patch area for adding hardwired DHCP options
-;
- align 4
-
-hcdhcp_magic dd 0x2983c8ac ; Magic number
-hcdhcp_len dd 7*4 ; Size of this structure
-hcdhcp_flags dd 0 ; Reserved for the future
- ; Parameters to be parsed before the ones from PXE
-bdhcp_offset dd 0 ; Offset (entered by patcher)
-bdhcp_len dd 0 ; Length (entered by patcher)
- ; Parameters to be parsed *after* the ones from PXE
-adhcp_offset dd 0 ; Offset (entered by patcher)
-adhcp_len dd 0 ; Length (entered by patcher)
-
-_start1:
- pushfd ; Paranoia... in case of return to PXE
- pushad ; ... save as much state as possible
- push ds
- push es
- push fs
- push gs
-
- cld ; Copy upwards
- xor ax,ax
- mov ds,ax
- mov es,ax
-
-%if 0 ; debugging code only... not intended for production use
- ; Clobber the stack segment, to test for specific pathologies
- mov di,STACK_BASE
- mov cx,STACK_LEN >> 1
- mov ax,0xf4f4
- rep stosw
-
- ; Clobber the tail of the 64K segment, too
- extern __bss1_end
- mov di,__bss1_end
- sub cx,di ; CX = 0 previously
- shr cx,1
- rep stosw
-%endif
-
- ; That is all pushed onto the PXE stack. Save the pointer
- ; to it and switch to an internal stack.
- mov [InitStack],sp
- mov [InitStack+2],ss
-
- lss esp,[BaseStack]
- sti ; Stack set up and ready
-;
-; Move the hardwired DHCP options (if present) to a safe place...
-;
-bdhcp_copy:
- mov cx,[bdhcp_len]
- mov ax,trackbufsize/2
- jcxz .none
- cmp cx,ax
- jbe .oksize
- mov cx,ax
- mov [bdhcp_len],ax
-.oksize:
- mov eax,[bdhcp_offset]
- add eax,_start
- mov si,ax
- and si,000Fh
- shr eax,4
- push ds
- mov ds,ax
- mov di,trackbuf
- add cx,3
- shr cx,2
- rep movsd
- pop ds
-.none:
-
-adhcp_copy:
- mov cx,[adhcp_len]
- mov ax,trackbufsize/2
- jcxz .none
- cmp cx,ax
- jbe .oksize
- mov cx,ax
- mov [adhcp_len],ax
-.oksize:
- mov eax,[adhcp_offset]
- add eax,_start
- mov si,ax
- and si,000Fh
- shr eax,4
- push ds
- mov ds,ax
- mov di,trackbuf+trackbufsize/2
- add cx,3
- shr cx,2
- rep movsd
- pop ds
-.none:
-
-;
-; Initialize screen (if we're using one)
-;
-%include "init.inc"
-
-;
-; Tell the user we got this far
-;
- mov si,syslinux_banner
- call writestr_early
-
- mov si,copyright_str
- call writestr_early
-
-;
-; do fs initialize
-;
- mov eax,ROOT_FS_OPS
- xor ebp,ebp
- pm_call fs_init
-
- section .rodata
- alignz 4
-ROOT_FS_OPS:
- extern pxe_fs_ops
- dd pxe_fs_ops
- dd 0
-
-
- section .text16
-;
-; Initialize the idle mechanism
-;
- call reset_idle
-
-;
-; Now we're all set to start with our *real* business. First load the
-; configuration file (if any) and parse it.
-;
-; In previous versions I avoided using 32-bit registers because of a
-; rumour some BIOSes clobbered the upper half of 32-bit registers at
-; random. I figure, though, that if there are any of those still left
-; they probably won't be trying to install Linux on them...
-;
-; The code is still ripe with 16-bitisms, though. Not worth the hassle
-; to take'm out. In fact, we may want to put them back if we're going
-; to boot ELKS at some point.
-;
-
-;
-; Linux kernel loading code is common. However, we need to define
-; a couple of helper macros...
-;
-
-; Unload PXE stack
-%define HAVE_UNLOAD_PREP
-%macro UNLOAD_PREP 0
- pm_call unload_pxe
-%endmacro
-
-;
-; Load configuration file
-;
- pm_call pm_load_config
- jz no_config_file
-
-;
-; Now we have the config file open. Parse the config file and
-; run the user interface.
-;
-%include "ui.inc"
-
-;
-; Boot to the local disk by returning the appropriate PXE magic.
-; AX contains the appropriate return code.
-;
-local_boot:
- push cs
- pop ds
- mov [LocalBootType],ax
- call vgaclearmode
- mov si,localboot_msg
- call writestr_early
- ; Restore the environment we were called with
- pm_call reset_pxe
- call cleanup_hardware
- lss sp,[InitStack]
- pop gs
- pop fs
- pop es
- pop ds
- popad
- mov ax,[cs:LocalBootType]
- cmp ax,-1 ; localboot -1 == INT 18h
- je .int18
- popfd
- retf ; Return to PXE
-.int18:
- popfd
- int 18h
- jmp 0F000h:0FFF0h
- hlt
-
-;
-; kaboom: write a message and bail out. Wait for quite a while,
-; or a user keypress, then do a hard reboot.
-;
-; Note: use BIOS_timer here; we may not have jiffies set up.
-;
- global kaboom
-kaboom:
- RESET_STACK_AND_SEGS AX
-.patch: mov si,bailmsg
- call writestr_early ; Returns with AL = 0
-.drain: call pollchar
- jz .drained
- call getchar
- jmp short .drain
-.drained:
- mov edi,[RebootTime]
- mov al,[DHCPMagic]
- and al,09h ; Magic+Timeout
- cmp al,09h
- je .time_set
- mov edi,REBOOT_TIME
-.time_set:
- mov cx,18
-.wait1: push cx
- mov ecx,edi
-.wait2: mov dx,[BIOS_timer]
-.wait3: call pollchar
- jnz .keypress
- call do_idle
- cmp dx,[BIOS_timer]
- je .wait3
- loop .wait2,ecx
- mov al,'.'
- call writechr
- pop cx
- loop .wait1
-.keypress:
- call crlf
- mov word [BIOS_magic],0 ; Cold reboot
- jmp 0F000h:0FFF0h ; Reset vector address
-
-
-;
-; pxenv
-;
-; This is the main PXENV+/!PXE entry point, using the PXENV+
-; calling convention. This is a separate local routine so
-; we can hook special things from it if necessary. In particular,
-; some PXE stacks seem to not like being invoked from anything but
-; the initial stack, so humour it.
-;
-; While we're at it, save and restore all registers.
-;
- global pxenv
-pxenv:
- pushfd
- pushad
-
- mov [cs:PXEStack],sp
- mov [cs:PXEStack+2],ss
- lss sp,[cs:InitStack]
-
- ; Pre-clear the Status field
- mov word [es:di],cs
-
- ; This works either for the PXENV+ or the !PXE calling
- ; convention, as long as we ignore CF (which is redundant
- ; with AX anyway.)
- push es
- push di
- push bx
-.jump: call 0:0
- add sp,6
- mov [cs:PXEStatus],ax
-
- lss sp,[cs:PXEStack]
-
- mov bp,sp
- and ax,ax
- setnz [bp+32] ; If AX != 0 set CF on return
-
- ; This clobbers the AX return, but we already saved it into
- ; the PXEStatus variable.
- popad
- popfd ; Restore flags (incl. IF, DF)
- ret
-
-; Must be after function def due to NASM bug
- global PXEEntry
-PXEEntry equ pxenv.jump+1
-
- section .bss16
- alignb 2
-PXEStatus resb 2
-
-
- section .text16
-;
-; Invoke INT 1Ah on the PXE stack. This is used by the "Plan C" method
-; for finding the PXE entry point.
-;
- global pxe_int1a
-pxe_int1a:
- mov [cs:PXEStack],sp
- mov [cs:PXEStack+2],ss
- lss sp,[cs:InitStack]
-
- int 1Ah ; May trash registers
-
- lss sp,[cs:PXEStack]
- ret
-
-;
-; Special unload for gPXE: this switches the InitStack from
-; gPXE to the ROM PXE stack.
-;
-%if GPXE
- global gpxe_unload
-gpxe_unload:
- mov bx,PXENV_FILE_EXIT_HOOK
- mov di,pxe_file_exit_hook
- call pxenv
- jc .plain
-
- ; Now we actually need to exit back to gPXE, which will
- ; give control back to us on the *new* "original stack"...
- pushfd
- push ds
- push es
- mov [PXEStack],sp
- mov [PXEStack+2],ss
- lss sp,[InitStack]
- pop gs
- pop fs
- pop es
- pop ds
- popad
- popfd
- xor ax,ax
- retf
-.resume:
- cli
-
- ; gPXE will have a stack frame looking much like our
- ; InitStack, except it has a magic cookie at the top,
- ; and the segment registers are in reverse order.
- pop eax
- pop ax
- pop bx
- pop cx
- pop dx
- push ax
- push bx
- push cx
- push dx
- mov [cs:InitStack],sp
- mov [cs:InitStack+2],ss
- lss sp,[cs:PXEStack]
- pop es
- pop ds
- popfd
-
-.plain:
- ret
-
- section .data16
- alignz 4
-pxe_file_exit_hook:
-.status: dw 0
-.offset: dw gpxe_unload.resume
-.seg: dw 0
-%endif
-
- section .text16
-
-; -----------------------------------------------------------------------------
-; Common modules
-; -----------------------------------------------------------------------------
-
-%include "common.inc" ; Universal modules
-%include "writestr.inc" ; String output
-writestr_early equ writestr
-%include "writehex.inc" ; Hexadecimal output
-%include "rawcon.inc" ; Console I/O w/o using the console functions
-
-; -----------------------------------------------------------------------------
-; Begin data section
-; -----------------------------------------------------------------------------
-
- section .data16
-
-copyright_str db ' Copyright (C) 1994-'
- asciidec YEAR
- db ' H. Peter Anvin et al', CR, LF, 0
-err_bootfailed db CR, LF, 'Boot failed: press a key to retry, or wait for reset...', CR, LF, 0
-bailmsg equ err_bootfailed
-localboot_msg db 'Booting from local disk...', CR, LF, 0
-syslinux_banner db CR, LF, MY_NAME, ' ', VERSION_STR, ' ', DATE_STR, ' ', 0
-
-;
-; Config file keyword table
-;
-%include "keywords.inc"
-
-;
-; Extensions to search for (in *forward* order).
-; (.bs and .bss16 are disabled for PXELINUX, since they are not supported)
-;
- alignz 4
-exten_table: db '.cbt' ; COMBOOT (specific)
- db '.0', 0, 0 ; PXE bootstrap program
- db '.com' ; COMBOOT (same as DOS)
- db '.c32' ; COM32
-exten_table_end:
- dd 0, 0 ; Need 8 null bytes here
-
-;
-; Misc initialized (data) variables
-;
- section .data16
- global KeepPXE
-KeepPXE db 0 ; Should PXE be kept around?
-
-;
-; IP information. Note that the field are in the same order as the
-; Linux kernel expects in the ip= option.
-;
- section .bss16
- alignb 4
- global IPInfo
-IPInfo:
-.IPv4 resd 1 ; IPv4 information
-.MyIP resd 1 ; My IP address
-.ServerIP resd 1
-.GatewayIP resd 1
-.Netmask resd 1