Merge commit 'origin/nolen' into gpxe-support
authorH. Peter Anvin <hpa@zytor.com>
Sun, 23 Mar 2008 00:25:31 +0000 (17:25 -0700)
committerH. Peter Anvin <hpa@zytor.com>
Sun, 23 Mar 2008 00:25:31 +0000 (17:25 -0700)
Conflicts:

NEWS
dnsresolv.inc
pxelinux.asm

1  2 
NEWS
pxelinux.asm

diff --cc NEWS
--- 1/NEWS
--- 2/NEWS
+++ b/NEWS
@@@ -3,11 -3,44 +3,49 @@@ apply to that specific program only; ot
  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
diff --cc pxelinux.asm
@@@ -1289,16 -1267,9 +1278,8 @@@ searchdir
                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
@@@ -1739,77 -1707,13 +1784,83 @@@ fill_buffer
                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.