Support chaining shuffle descriptors when buffer is too small syslinux-3.50-pre1
authorH. Peter Anvin <hpa@zytor.com>
Fri, 30 Mar 2007 20:33:47 +0000 (13:33 -0700)
committerH. Peter Anvin <hpa@zytor.com>
Fri, 30 Mar 2007 20:33:47 +0000 (13:33 -0700)
Provide a method for re-loading shuffle descriptors from a buffer in
high memory when the shuffle descriptors are too many to fit in the
buffer.  This can happen when trying to stitch an initramfs together
from parts.  Still need library support for this, however.

bcopy32.inc
comboot.doc
layout.inc

index b8e1a5b..a7b6d6b 100644 (file)
@@ -442,18 +442,26 @@ try_wbinvd:
 ; SS register.  That is the responsibility of the caller.
 ;
 ; Inputs:
-;      DS:BX           -> Pointer to list of (dst, src, len) pairs
+;      DS:BX           -> Pointer to list of (dst, src, len) pairs(*)
 ;      AX              -> Number of list entries
 ;      [CS:EntryPoint] -> CS:IP to jump to
 ;      On stack        - initial state (fd, ad, ds, es, fs, gs)
 ;
+; (*) If dst == -1, then (src, len) entry refers to a set of new
+;                  descriptors to load.
+;     If src == -1, then the memory pointed to by (dst, len) is bzeroed;
+;                  this is handled inside the bcopy routine.
+;
 shuffle_and_boot:
+.restart:
                and ax,ax
                jz .done
 .loop:
                mov edi,[bx]
                mov esi,[bx+4]
                mov ecx,[bx+8]
+               cmp edi, -1
+               je .reload
                call bcopy
                add bx,12
                dec ax
@@ -468,6 +476,17 @@ shuffle_and_boot:
                popfd
                jmp far [cs:EntryPoint]
 
+.reload:
+               mov bx, trackbuf        ; Next descriptor
+               movzx edi,bx
+               push ecx                ; Save byte count
+               call bcopy
+               pop eax                 ; Byte count
+               xor edx,edx
+               mov ecx,12
+               div ecx                 ; Convert to descriptor count
+               jmp .restart
+
 ;
 ; trampoline_to_pm:
 ;
index 66b8bf2..f5133e1 100644 (file)
@@ -580,6 +580,15 @@ AX=0012h [3.50] Cleanup, shuffle and boot
        (FFFFFFFFh) then the block specified by the destination
        address and the length is set to all zero.
 
+       Starting in version 3.50, if the destination address is -1
+       (FFFFFFFFh) then the data block is loaded as a new set of
+       descriptors, and processing is continued (and unprocessed
+       descriptors are lost, this is thus typically only used as the
+       last descriptor in a block.)  The block must still fit in the
+       internal descriptor buffer (see function 0011h), but can, of
+       course, itself chain another block.
+
+
        Normal boot sectors expect DL to contain the drive number,
        and, for hard drives (DL >= 80h) DS:SI to contain a pointer to
        the 16-byte partition table entry.  The memory between
index 7b122d7..1a9115b 100644 (file)
@@ -26,7 +26,7 @@ TEXT_START    equ 7C00h
 ; The secondary BSS section, above the text; we really wish we could
 ; just make it follow .bcopy32 or hang off the end,
 ; but it doesn't seem to work that way.
-LATEBSS_START  equ 0B200h
+LATEBSS_START  equ 0B300h
 
 ; Reserve memory for the stack.  This causes checkov to abort the
 ; compile if we violate this space.