[syslinux] "isolinux.bin missing or corrupt" when booting USB flash drive in old PC

Thomas Schmitt scdbackup at gmx.net
Fri Mar 24 09:38:31 PDT 2017


Hi,

i now believe to see a difference between isohdpfd.S and isohdpfc.S
which explains why isohdpfc.bin works with isolinux.bin on our
virtual BIOSes:

isohdpfc pushes the CX value to the stack which it gets from INT 13 AH 41.
Quite surely bit 0 of that CX is not set. But bit 2 "Enhanced Disk Drive"
could be set.
  https://en.wikipedia.org/wiki/INT_13H

I understand on David's BIOS after

        andw    $1,%cx          /* Bit 0 = fixed disk subset */
        jz      1f

jz jumps because CX is 0. This gets pushed to the stack.
(So the code around the int 13 assumes that either int 13 fails and returns
 CX == 0, or the reply is good enough to reach "andw 1,%cx". Ewww ...)

Now in isolinux.asm we have this test, quite immediately after the
stack was exploited:

		mov si,bios_cbios
		jcxz _start_common
		mov si,bios_ebios
		jmp _start_common

If CX is 4 (= EDD) here, then we go to LBA addressing and the confused
geometry is not of interest on the first try. At least this would explain
why our modern virtual BIOSes let isolinux.bin work. (I.e. the "EBIOS"
flag is indeed effective in isolinux.bin.)


David's BIOS would have to announce in CX "EDD" (or "Drive Locking and
Ejecting" = bit 1) and would have to be able to do LBA addressing despite
no bit 0 "Device Access using the packet structure".
(Wikipedia gives the vague impression that bit 0 really shall indicate
 the availability of INT 13 AH 42 which does the LBA reading.)


Have a nice day :)

Thomas



More information about the Syslinux mailing list