core: Fix 'trackbuf' descriptor list byte length syslinux-4.04-pre12
authorAhmed S. Darwish <darwish.07@gmail.com>
Sun, 6 Mar 2011 12:21:31 +0000 (14:21 +0200)
committerH. Peter Anvin <hpa@linux.intel.com>
Mon, 7 Mar 2011 20:02:35 +0000 (12:02 -0800)
(Tested using a Linux bzImage, with and without an initrd.)

Per shuffle_and_boot documentation, %ecx must contain the descriptor
list byte length, but it's set with such list end address instead.  Fix.

Signed-off-by: Ahmed S. Darwish <darwish.07@gmail.com>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
core/bcopy32.inc
core/bcopyxx.inc
core/bootsect.inc
core/runkernel.inc

index 6537546..ab60145 100644 (file)
@@ -65,6 +65,8 @@ bcopy:                jecxz .ret
 ;     If len == 0:  this marks the end of the list; dst indicates
 ;                  the entry point and src the mode (0 = pm, 1 = rm)
 ;
+;     (*) dst, src, and len are four bytes each
+;
 shuffle_and_boot_raw:
                mov bx,pm_shuffle
                jmp enter_pm
index c669b7a..cfdda0b 100644 (file)
@@ -205,6 +205,8 @@ pm_bcopy:
 ;     If len == 0:  this marks the end of the list; dst indicates
 ;                  the entry point and src the mode (0 = pm, 1 = rm)
 ;
+;     (*) dst, src, and len are four bytes each
+;
 pm_shuffle:
                cli                     ; End interrupt service (for good)
                mov ebx,edi             ; EBX <- descriptor list
index b4402f1..6c20409 100644 (file)
@@ -169,7 +169,7 @@ replace_bootstrap_noclearmode:
                mov [es:di+8],ax        ; New DI
                mov [es:di+4],bx        ; New ES
 %endif
-               pop ax                  ; List length
+               pop ax                  ; descriptor list entries count
 
                push di
                push es
@@ -179,8 +179,8 @@ replace_bootstrap_noclearmode:
 
                mov ebx,trackbuf
                imul di,ax,12
+               push di                 ; length of list
                add di,bx               ; DI <- end of list
-               push di
 
                ; Terminating entry...
                lea eax,[replace_stub]  ; Entrypoint
@@ -196,8 +196,10 @@ replace_bootstrap_noclearmode:
                mov cx,__replacestub_dwords
                rep movsd
 
+               ; ECX <- final list length
                xor ecx,ecx
-               pop cx                  ; ECX <- length of list
+               pop cx                  ; original length in bytes
+               add cx, 12              ; + termination entry size
 
                pop word [replace_stub.ss]
                pop word [replace_stub.esp]
index 25b073f..2e94346 100644 (file)
@@ -453,7 +453,7 @@ setup_move:
 
 .no_initrd:
                push dword run_linux_kernel
-               push cx                         ; Length of descriptor list
+               push cx                         ; descriptor list entries count
 
                ; BX points to the final real mode segment, and will be loaded
                ; into DS.