On Thu, Mar 17, 2011 at 05:29:51PM +0100, Vladimir 'φ-coder/phcoder' Serbinenko wrote: > On 17.03.2011 17:09, Lennart Sorensen wrote: > > 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. > > > > > Another wild guess: > @@ -506,6 +520,8 @@ get_safe_sectors (grub_disk_addr_t secto > grub_size_t size; > grub_uint32_t offset; > > + return 1; > + > /* OFFSET = SECTOR % SECTORS */ > grub_divmod64 (sector, sectors, &offset);
No go either. Here is what I see with some more debugging: [snip] int13_ext call: ah=42, drive=80, dap= 6fe00 (len=16 rsvd=0 blks=1 buf=1744830464 sec=2078) int13_ext call: ah=42, drive=80, dap= 6fe00 (len=16 rsvd=0 blks=1 buf=1744830464 sec=2079) int13_ext call: ah=42, drive=80, dap= 6fe00 (len=16 rsvd=0 blks=1 buf=1744830464 sec=72091664) failed int13_ext call: ah=42, drive=80, dap= 6fe00 returned eax=8000 error: hd0 out of disk. Entering rescue mode... grub rescue> Now it has no excuse for failing a call for sector 72091664 when the drive has 156000000 or so sectors. I imagine if I made a small boot partition (less than 8G), the stupid thing would boot fine, but that's not acceptable on a brand new design. I am going to try resizing the partition as a test. -- Len Sorensen _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel