===== arch/i386/boot/edd.S 1.2 vs edited ===== --- 1.2/arch/i386/boot/edd.S 2004-06-29 09:44:48 -05:00 +++ edited/arch/i386/boot/edd.S 2004-07-13 16:48:50 -05:00 @@ -12,13 +12,31 @@ #include #if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE) -# Read the first sector of each BIOS disk device and store the 4-byte signature edd_mbr_sig_start: + xor %ebx, %ebx + xor %edx, %edx movb $0, (EDD_MBR_SIG_NR_BUF) # zero value at EDD_MBR_SIG_NR_BUF + movw $EDD_MBR_SIG_BUF, %bx # store buffer ptr in bx movb $0x80, %dl # from device 80 - movw $EDD_MBR_SIG_BUF, %bx # store buffer ptr in bx + edd_mbr_sig_read: - movl $0xFFFFFFFF, %eax +# Do int13 fn15 first, as BIOS should know if a disk is present or not. +# This avoids long (>30s) delays waiting for the READ_SECTORS to a non-present disk. + xor %eax, %eax + xor %ecx, %ecx + movb $GETDISKTYPE, %ah # Function 15 + pushw %dx # which stomps on dx + stc # work around buggy BIOSes + int $0x13 # make the call + sti # work around buggy BIOSes + popw %dx # so get back dx + jc edd_mbr_sig_done # no more BIOS devices + cmpb $HARDDRIVEPRESENT, %ah # is hard drive present? + jne edd_mbr_sig_done # no more BIOS devices + +# Read the first sector of each BIOS disk device and store the 4-byte signature + xor %ecx, %ecx + movl $0xFFFFFFFF, %eax movl %eax, (%bx) # assume failure pushw %bx movb $READ_SECTORS, %ah ===== include/linux/edd.h 1.11 vs edited ===== --- 1.11/include/linux/edd.h 2004-06-29 09:44:48 -05:00 +++ edited/include/linux/edd.h 2004-07-13 16:05:14 -05:00 @@ -49,6 +49,9 @@ #define EDD_MBR_SIG_MAX 16 /* max number of signatures to store */ #define EDD_MBR_SIG_NR_BUF 0x1ea /* addr of number of MBR signtaures at EDD_MBR_SIG_BUF in boot_params - treat this as 1 byte */ +#define GETDISKTYPE 0x15 /* int13 AH=0x15 is Get Disk Type command */ +#define HARDDRIVEPRESENT 0x03 /* int13 AH=15 return code in AH */ + #ifndef __ASSEMBLY__ #define EDD_EXT_FIXED_DISK_ACCESS (1 << 0)