them.
Changes in 3.70:
+ * PXELINUX: Support enhanced capabilities when running on top
+ of gPXE (http://www.etherboot.org/). In particular, support
+ URL-style syntax for filenames, and any protocol that gPXE
+ supports (except, currently, iSCSI and AoE.) This feature
+ is currently highly experimental.
+ * Substantial infrastructure changes to support files whose
+ length aren't known at open time (typically network
+ connections.) Please note that the semantics of some of the
+ comboot APIs have changed slightly; please see doc/comboot.doc.
+ * PXELINUX: We no longer require a TFTP server which supports
+ the tsize option for all transfers.
+
+ Changes in 3.62:
+ * Clean up garbage after "aborted." message.
+ * Clean up memdump.com filenames.
+ * Support SHA256 and SHA512 encrypted passwords.
+ * The shuffle library now can generate chained descriptors,
+ thus allowing pretty much arbitrarily complex memory maps.
+ * Handle command lines up to 2047 characters, the current
+ Linux kernel limit.
+ * vesamenu: support systems without linear framebuffer support
+ (sigh, what is this, 1993?) and 15-bit RGB modes.
+ * Move the label storage (for the command-line interface) to
+ high memory, removing the size limit and freeing up 64K of
+ low memory.
+ * Get rid of 4096-entry limit in the simple menu system.
+ * New hierarchial submenu support: see MENU BEGIN, MENU END,
+ MENU GOTO in doc/menu.txt.
+ * MENU QUIT allows creating a menu entry for returning to the
+ command line.
+ * ISOLINUX: Work around bug in certain Adaptec BIOSes,
+ patch by Bruce Robson.
+ * pngtopnm dependency removed from samples/ directory.
+ * Text documentation files (in doc/) renamed *.doc -> *.txt.
+
+ Changes in 3.61:
+ * EXTLINUX: fix crash when accessing an empty file.
+ * elf.c32: If a PHDR segment is present, load it.
+ * Fix SHA-1 and MD5 passwords.
+ * ISOLINUX: fix booting when mastered without
+ mkisofs -boot-info-table (broken since 3.50, sigh...)
+ * Handle BIOSes which emit multiple contiguous valid
+ memory regions in the e820 map.
Changes in 3.60:
* Support for "auxilliary data vector", a small amount of
pop si ; We want the packet ptr in SI
mov eax,[si+tftp_filesize]
- cmp eax,-1
- jz .no_tsize
- pop bp ; Junk
- pop bp ; Junk (retry counter)
-
+.got_file: ; SI->socket structure, EAX = size
- mov edx,eax
- shr edx,16 ; DX:AX == EAX
-
and eax,eax ; Set ZF depending on file size
- pop bp ; Junk
- pop bp ; Junk (retry counter)
jz .error_si ; ZF = 1 need to free the socket
.ret:
pop bp
mov ax,ds
mov es,ax
- mov si,bx
+ ; Note: getting the EOF packet is not the same thing
+ ; as tftp_filepos == tftp_filesize; if the EOF packet
+ ; is empty the latter condition can be true without
+ ; having gotten the official EOF.
+ cmp byte [si+tftp_goteof],0
- jne .ret ; Alread EOF
++ jne .gotten ; Alread EOF
++
+%if GPXE
+ cmp word [si+tftp_localport], -1
+ jne .get_packet_tftp
+ call get_packet_gpxe
+ jmp .gotten
+.get_packet_tftp:
+%endif ; GPXE
+ call get_packet
+.gotten:
+ pop es
+ popad
-
- jmp .need_more
++ ret
+
+%if GPXE
+;
+; Get a fresh packet from a gPXE socket; expects fs -> pktbuf_seg
+; and ds:si -> socket structure
+;
+; Assumes CS == DS == ES.
+;
+get_packet_gpxe:
+ mov di,gpxe_file_read
+ mov ax,[si+tftp_remoteport] ; gPXE filehandle
+ mov [di+2],ax
+ mov word [di+4],PKTBUF_SIZE
+ mov ax,[si+tftp_pktbuf]
+ mov [di+6],ax
+ mov [si+tftp_dataptr],ax
+ mov [di+8],fs
+
+.again:
+ mov bx,PXENV_FILE_READ
+ call pxenv
+ ; XXX: FIX THIS: Need to be able to distinguish
+ ; error, EOF, and no data
+ jc .again
+
+ movzx eax,word [di+4] ; Bytes read
+ mov [si+tftp_bytesleft],ax ; Bytes in buffer
+ add [si+tftp_filepos],eax ; Position in file
+
+ and ax,ax
+ jnz .got_stuff
+
+ ; We got EOF here, make sure the upper layers know
++ mov byte [si+tftp_goteof],1
+ mov eax,[si+tftp_filepos]
+ mov [si+tftp_filesize],eax
+
+.got_stuff:
+ ; If we're done here, close the file
+ mov eax,[si+tftp_filepos]
+ cmp [si+tftp_filesize],eax
+ ja .done
+
+ ; Reuse the previous [es:di] structure since the
+ ; relevant fields are all the same
+ mov bx,PXENV_FILE_CLOSE
+ call pxenv
+ ; Ignore return...
+.done:
+ ret
+%endif ; GPXE
+;
+; Get a fresh packet; expects fs -> pktbuf_seg and ds:si -> socket structure
+;
+; Assumes CS == DS == ES.
+;
+get_packet:
.packet_loop:
; Start by ACKing the previous packet; this should cause the
; next packet to be sent.