[syslinux] [PATCH] core: Fix 'trackbuf' descriptor list byte length
Ahmed S. Darwish
darwish.07 at gmail.com
Sun Mar 6 04:21:31 PST 2011
(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 at gmail.com>
--
core/bcopy32.inc | 2 ++
core/bcopyxx.inc | 2 ++
core/bootsect.inc | 8 +++++---
core/runkernel.inc | 2 +-
4 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/core/bcopy32.inc b/core/bcopy32.inc
index 6537546..ab60145 100644
--- a/core/bcopy32.inc
+++ b/core/bcopy32.inc
@@ -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
diff --git a/core/bcopyxx.inc b/core/bcopyxx.inc
index c669b7a..cfdda0b 100644
--- a/core/bcopyxx.inc
+++ b/core/bcopyxx.inc
@@ -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
diff --git a/core/bootsect.inc b/core/bootsect.inc
index b4402f1..6c20409 100644
--- a/core/bootsect.inc
+++ b/core/bootsect.inc
@@ -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]
diff --git a/core/runkernel.inc b/core/runkernel.inc
index 25b073f..2e94346 100644
--- a/core/runkernel.inc
+++ b/core/runkernel.inc
@@ -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.
thanks,
--
Darwish
http://darwish.07.googlepages.com
More information about the Syslinux
mailing list