[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