GSoC2009 Liu Notes
Contents |
Notes: Yuanhan Liu, Add EXT4 Support in EXTLINUX and Convert the Filesystem Part Code to C
Code reading notes
Here takes some notes while reading the Syslinux source code.
The js instruction problem
After seeing the following code in diskstart.inc make me reminds of the interview of Syslinux GSoC2009 in the IRC.
mov [DriveNumber],dl ; Save drive number in DL
and dl,dl ; If floppy disk (00-7F), assume no partition table
js harddisk
It's quite same as the following code asked by hpa in the interview:
and eax, eax
js .foo
call edx
.foo:
yeah, it's a simple question, but at that moment I'm not good at the flags so a wrong answer answered. In fact, the fisrt code explains it well. As we know, the hard disk drive number counts from 0x80 that means the most significant bit is always 1 make the js be true to jump the destination. while in C, we can simply implement it in the following way:
if ( drive_num >= 0x80 ) {
/* harddisk */
} else {
/* floppy */
}
The chosen of CBIOS or EBIOS by getlinsec
hpa made a trick here. It's not done in function getlinsec but in the EDD check program in a patch way; that's the trick. In the diskstart.inc, there's a EDD check program. If EDD checked, then:
;
; We have EDD support...
;
mov byte [getlinsec.jmp+1],(getlinsec_ebios-(getlinsec.jmp+2))
getlinsec function will jump to getlinsec_cbios by default; after this, it will jump to getlinsec_ebios instead.
getlinsec:
add eax,[bsHidden] ; Add partition offset
xor edx,edx ; Zero-extend LBA (eventually allow 64 bits)
.jmp: jmp strict short getlinsec_cbios