summaryrefslogtreecommitdiffstats
path: root/contrib/syslinux/latest/core/adv.inc
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/syslinux/latest/core/adv.inc')
-rw-r--r--contrib/syslinux/latest/core/adv.inc509
1 files changed, 0 insertions, 509 deletions
diff --git a/contrib/syslinux/latest/core/adv.inc b/contrib/syslinux/latest/core/adv.inc
deleted file mode 100644
index 0b45a6c..0000000
--- a/contrib/syslinux/latest/core/adv.inc
+++ /dev/null
@@ -1,509 +0,0 @@
-;; -----------------------------------------------------------------------
-;;
-;; Copyright 2007-2008 H. Peter Anvin - All Rights Reserved
-;;
-;; 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., 51 Franklin St, Fifth Floor,
-;; Boston MA 02110-1301, USA; either version 2 of the License, or
-;; (at your option) any later version; incorporated herein by reference.
-;;
-;; -----------------------------------------------------------------------
-
-;;
-;; adv.inc
-;;
-;; The auxillary data vector and its routines
-;;
-;; The auxillary data vector is a 512-byte aligned block that on the
-;; disk-based derivatives can be part of the syslinux file itself. It
-;; exists in two copies; when written, both copies are written (with a
-;; sync in between, if from the operating system.) The first two
-;; dwords are magic number and inverse checksum, then follows the data
-;; area as a tagged array similar to BOOTP/DHCP, finally a tail
-;; signature.
-;;
-;; Note that unlike BOOTP/DHCP, zero terminates the chain, and FF
-;; has no special meaning.
-;;
-
-;;
-;; List of ADV tags...
-;;
-ADV_BOOTONCE equ 1
-
-;;
-;; Other ADV data...
-;;
-ADV_MAGIC1 equ 0x5a2d2fa5 ; Head signature
-ADV_MAGIC2 equ 0xa3041767 ; Total checksum
-ADV_MAGIC3 equ 0xdd28bf64 ; Tail signature
-
-ADV_LEN equ 500 ; Data bytes
-
-adv_retries equ 6 ; Disk retries
-
- section .adv
- ; Introduce the ADVs to valid but blank
-adv0:
-.head resd 1
-.csum resd 1
-.data resb ADV_LEN
-.tail resd 1
-.end equ $
-adv1:
-.head resd 1
-.csum resd 1
-.data resb ADV_LEN
-.tail resd 1
-.end equ $
- section .text16
-
- ;
- ; This is called after config file parsing, so we know
- ; the intended location of the ADV
- ;
-adv_init:
- cmp byte [ADVDrive],-1
- jne adv_read
-
-%if IS_SYSLINUX || IS_EXTLINUX
- cmp word [ADVSectors],2 ; Not present?
- jb adv_verify
-
- mov eax,[Hidden]
- mov edx,[Hidden+4]
- add [ADVSec0],eax
- adc [ADVSec0+4],edx
- add [ADVSec1],eax
- adc [ADVSec1+4],edx
- mov al,[DriveNumber]
- mov [ADVDrive],al
- jmp adv_read
-%endif
-
- ;
- ; Initialize the ADV data structure in memory
- ;
-adv_verify:
- cmp byte [ADVDrive],-1 ; No ADV configured, still?
- je .reset ; Then unconditionally reset
-
- mov si,adv0
- call .check_adv
- jz .ok ; Primary ADV okay
- mov si,adv1
- call .check_adv
- jz .adv1ok
-
- ; Neither ADV is usable; initialize to blank
-.reset:
- mov di,adv0
- mov eax,ADV_MAGIC1
- stosd
- mov eax,ADV_MAGIC2
- stosd
- xor eax,eax
- mov cx,ADV_LEN/4
- rep stosd
- mov eax,ADV_MAGIC3
- stosd
-
-.ok:
- ret
-
- ; The primary ADV is bad, but the backup is OK
-.adv1ok:
- mov di,adv0
- mov cx,512/4
- rep movsd
- ret
-
-
- ; SI points to the putative ADV; unchanged by routine
- ; ZF=1 on return if good
-.check_adv:
- push si
- lodsd
- cmp eax,ADV_MAGIC1
- jne .done ; ZF=0, i.e. bad
- xor edx,edx
- mov cx,ADV_LEN/4+1 ; Remaining dwords
-.csum:
- lodsd
- add edx,eax
- loop .csum
- cmp edx,ADV_MAGIC2
- jne .done
- lodsd
- cmp eax,ADV_MAGIC3
-.done:
- pop si
- ret
-
-;
-; adv_get: find an ADV string if present
-;
-; Input: DL = ADV ID
-; Output: CX = byte count (zero on not found)
-; SI = pointer to data
-; DL = unchanged
-;
-; Assumes CS == DS.
-;
-
-adv_get:
- push ax
- mov si,adv0.data
- xor ax,ax ; Keep AH=0 at all times
-.loop:
- lodsb ; Read ID
- cmp al,dl
- je .found
- and al,al
- jz .end
- lodsb ; Read length
- add si,ax
- cmp si,adv0.tail
- jb .loop
- jmp .end
-
-.found:
- lodsb
- mov cx,ax
- add ax,si ; Make sure it fits
- cmp ax,adv0.tail
- jbe .ok
-.end:
- xor cx,cx
-.ok:
- pop ax
- ret
-
-;
-; adv_set: insert a string into the ADV in memory
-;
-; Input: DL = ADV ID
-; FS:BX = input buffer
-; CX = byte count (max = 255!)
-; Output: CF=1 on error
-; CX clobbered
-;
-; Assumes CS == DS == ES.
-;
-adv_set:
- push ax
- push si
- push di
- and ch,ch
- jnz .overflow
-
- push cx
- mov si,adv0.data
- xor ax,ax
-.loop:
- lodsb
- cmp al,dl
- je .found
- and al,al
- jz .endz
- lodsb
- add si,ax
- cmp si,adv0.tail
- jb .loop
- jmp .end
-
-.found: ; Found, need to delete old copy
- lodsb
- lea di,[si-2]
- push di
- add si,ax
- mov cx,adv0.tail
- sub cx,si
- jb .nukeit
- rep movsb ; Remove the old one
- mov [di],ah ; Termination zero
- pop si
- jmp .loop
-.nukeit:
- pop si
- jmp .end
-.endz:
- dec si
-.end:
- ; Now SI points to where we want to put our data
- pop cx
- mov di,si
- jcxz .empty
- add si,cx
- cmp si,adv0.tail-2
- jae .overflow ; CF=0
-
- mov si,bx
- mov al,dl
- stosb
- mov al,cl
- stosb
- fs rep movsb
-
-.empty:
- mov cx,adv0.tail
- sub cx,di
- xor ax,ax
- rep stosb ; Zero-fill remainder
-
- clc
-.done:
- pop di
- pop si
- pop ax
- ret
-.overflow:
- stc
- jmp .done
-
-;
-; adv_cleanup: checksum adv0 and copy to adv1
-; Assumes CS == DS == ES.
-;
-adv_cleanup:
- pushad
- mov si,adv0.data
- mov cx,ADV_LEN/4
- xor edx,edx
-.loop:
- lodsd
- add edx,eax
- loop .loop
- mov eax,ADV_MAGIC2
- sub eax,edx
- lea di,[si+4] ; adv1
- mov si,adv0
- mov [si+4],eax ; Store checksum
- mov cx,(ADV_LEN+12)/4
- rep movsd
- popad
- ret
-
-;
-; adv_write: write the ADV to disk.
-;
-; Location is in memory variables.
-; Assumes CS == DS == ES.
-;
-; Returns CF=1 if the ADV cannot be written.
-;
-adv_write:
- push eax
- mov eax,[ADVSec0]
- or eax,[ADVSec0+4]
- je .bad
- mov eax,[ADVSec1]
- or eax,[ADVSec1+4]
- je .bad
- cmp byte [ADVDrive],-1
- je .bad
-
- call adv_cleanup
- mov ah,3 ; Write
- call adv_read_write
-
- clc
- pop eax
- ret
-.bad: ; No location for ADV set
- stc
- pop eax
- ret
-
-;
-; adv_read: read the ADV from disk
-;
-; Location is in memory variables.
-; Assumes CS == DS == ES.
-;
-adv_read:
- push ax
- mov ah,2 ; Read
- call adv_read_write
- call adv_verify
- pop ax
- ret
-
-;
-; adv_read_write: disk I/O for the ADV
-;
-; On input, AH=2 for read, AH=3 for write.
-; Assumes CS == DS == ES.
-;
-adv_read_write:
- mov [ADVOp],ah
- pushad
-
- ; Check for EDD
- mov bx,55AAh
- mov ah,41h ; EDD existence query
- mov dl,[ADVDrive]
- int 13h
- mov si,.cbios
- jc .noedd
- cmp bx,0AA55h
- jne .noedd
- test cl,1
- jz .noedd
- mov si,.ebios
-.noedd:
-
- mov eax,[ADVSec0]
- mov edx,[ADVSec0+4]
- mov bx,adv0
- call .doone
-
- mov eax,[ADVSec1]
- mov edx,[ADVSec1+4]
- mov bx,adv1
- call .doone
-
- popad
- ret
-
-.doone:
- push si
- jmp si
-
-.ebios:
- mov cx,adv_retries
-.eb_retry:
- ; Form DAPA on stack
- push edx
- push eax
- push es
- push bx
- push word 1 ; Sector count
- push word 16 ; DAPA size
- mov si,sp
- pushad
- mov dl,[ADVDrive]
- mov ax,4000h
- or ah,[ADVOp]
- push ds
- push ss
- pop ds
- int 13h
- pop ds
- popad
- lea sp,[si+16] ; Remove DAPA
- jc .eb_error
- pop si
- ret
-.eb_error:
- loop .eb_retry
- stc
- pop si
- ret
-
-.cbios:
- push edx
- push eax
- push bp
-
- and edx,edx ; > 2 TiB not possible
- jnz .cb_overflow
-
- mov dl,[ADVDrive]
- and dl,dl
- ; Floppies: can't trust INT 13h 08h, we better know
- ; the geometry a priori, which means it better be our
- ; boot device...
- jns .noparm ; Floppy drive... urk
-
- mov ah,08h ; Get disk parameters
- int 13h
- jc .noparm
- and ah,ah
- jnz .noparm
- shr dx,8
- inc dx
- movzx edi,dx ; EDI = heads
- and cx,3fh
- movzx esi,cx ; ESI = sectors/track
- jmp .parmok
-
-.noparm:
- ; No CHS info... this better be our boot drive, then
-%if IS_SYSLINUX || IS_EXTLINUX
- cmp dl,[DriveNumber]
- jne .cb_overflow ; Fatal error!
- movzx esi,word [bsSecPerTrack]
- movzx edi,word [bsHeads]
-%else
- ; Not a disk-based derivative... there is no hope
- jmp .cb_overflow
-%endif
-
-.parmok:
- ;
- ; Dividing by sectors to get (track,sector): we may have
- ; up to 2^18 tracks, so we need to use 32-bit arithmetric.
- ;
- xor edx,edx
- div esi
- xor cx,cx
- xchg cx,dx ; CX <- sector index (0-based)
- ; EDX <- 0
- ; eax = track #
- div edi ; Convert track to head/cyl
-
- ; Watch out for overflow, we might be writing!
- cmp eax,1023
- ja .cb_overflow
-
- ;
- ; Now we have AX = cyl, DX = head, CX = sector (0-based),
- ; BP = sectors to transfer, SI = bsSecPerTrack,
- ; ES:BX = data target
- ;
-
- shl ah,6 ; Because IBM was STOOPID
- ; and thought 8 bits were enough
- ; then thought 10 bits were enough...
- inc cx ; Sector numbers are 1-based, sigh
- or cl,ah
- mov ch,al
- mov dh,dl
- mov dl,[ADVDrive]
- mov al,01h ; Transfer one sector
- mov ah,[ADVOp] ; Operation
-
- mov bp,adv_retries
-.cb_retry:
- pushad
- int 13h
- popad
- jc .cb_error
-
-.cb_done:
- pop bp
- pop eax
- pop edx
- pop si
- ret
-
-.cb_error:
- dec bp
- jnz .cb_retry
-.cb_overflow:
- stc
- jmp .cb_done
-
- section .data16
- alignz 8
-ADVSec0 dq 0 ; Not specified
-ADVSec1 dq 0 ; Not specified
-ADVDrive db -1 ; No ADV defined
-ADVCHSInfo db -1 ; We have CHS info for this drive
-
- section .bss16
-ADVOp resb 1
-
- section .text16