On Wed, Mar 16, 2011 at 11:16:05PM +0100, Vladimir 'φ-coder/phcoder' Serbinenko wrote: > It's not really a fixup. Correct return on no error is CF=0 AH=0. Some > BIOSes in some other functions returned CF=0, AH!= 0 on no error so it > was a wild guess. > > Failed int13_ext call: ah=42, drive=80, dap= 6fe00 returned eax=8000 > > > Error 0x80 according to > http://www.delorie.com/djgpp/doc/rbinter/it/34/2.html means timeout. > Following code would retry on timeout: > === modified file 'grub-core/disk/i386/pc/biosdisk.c' > --- grub-core/disk/i386/pc/biosdisk.c 2011-01-04 14:42:47 +0000 > +++ grub-core/disk/i386/pc/biosdisk.c 2011-03-16 22:13:12 +0000 > @@ -72,6 +72,8 @@ > grub_biosdisk_rw_int13_extensions (int ah, int drive, void *dap) > { > struct grub_bios_int_registers regs; > + int tries = 4; > + retry: > regs.eax = ah << 8; > /* compute the address of disk_address_packet */ > regs.ds = (((grub_addr_t) dap) & 0xffff0000) >> 4; > @@ -80,6 +82,16 @@ > regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT; > > grub_bios_interrupt (0x13, ®s); > + if (!(regs.flags & GRUB_CPU_INT_FLAGS_CARRY)) > + return 0; > + > + if (((regs.eax >> 8) & 0xff) == 0x80 && tries) > + { > + grub_millisleep (10); > + tries--; > + goto retry; > + } > + > return (regs.eax >> 8) & 0xff; > }
So that didn't make any difference to it. It just keeps returning 0x8000 in eax on every retry. I really want to find out what this BIOS is doing wrong so I can tell the system maker what to fix. I am going to add some debuging to find out what is in the dap being passed to the BIOS. -- Len Sorensen _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel