Hi,

the following patch has been committed to SYSLINUX to fix the C/H/S
addressing problems in isohybrid MBR and isolinux.bin :

http://git.zytor.com/syslinux/syslinux.git/commit/?id=32c09027423f61c305e2423e52f5f69ecad8e2c0
diff --git a/mbr/isohdpfx.S b/mbr/isohdpfx.S
index 17e1efe..f9e9691 100644
--- a/mbr/isohdpfx.S
+++ b/mbr/isohdpfx.S
@@ -175,12 +175,12 @@ next:
        /* Get (C)HS geometry */
        movb    $0x08, %ah
        int     $0x13
-       andw    $0x3f, %cx      /* Sector count */
        popw    %bx             /* EBIOS flag */
-       pushw   %cx             /* -16: Save sectors on the stack */
        movzbw  %dh, %ax        /* dh = max head */
        incw    %ax             /* From 0-based max to count */
-       pushw   %ax             /* -18: Save heads on the stack */
+       pushw   %ax             /* -16: Save heads on the stack */
+       andw    $0x3f, %cx      /* Sector count */
+       pushw   %cx             /* -18: Save sectors on the stack */
        mulw    %cx             /* Heads*sectors -> sectors per cylinder */
        pushw   %bx             /* -20: EBIOS flag */


The other part of the changeset proposed on 25 Mar 2017 is now committed as
http://git.zytor.com/syslinux/syslinux.git/commit/?id=8739e2ff9ba3f92652c8df846924fd00e1ce2753
It fixes the problem that an early decision against LBA addressing after
INT 13 AH 41 could push a non-zero CX value to the stack, which
isolinux.bin would pop and interpret as instruction to use LBA addressing.
(isolinux.bin is wrong here. It should only use LBA if bit 0 of the
 popped CX is set. But even that could be wrongly sent from MBR if not
 the "Clear EBIOS flag" fix is applied.)


Have a nice day :)

Thomas

Reply via email to