On 17.03.2011 19:40, Lennart Sorensen wrote: > 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. > > Can you dump complete drp before and after every call?
(19:52:44) phcoder: cjwatson: may the Lennart's last message be caused by 4K sectors?(idk if he has 512B or 4K sectors) (19:56:14) cjwatson: possible; he can find out by printing drp->bytes_per_sector after the call to grub_biosdisk_get_diskinfo_int13_extensions in grub-core/disk/i386/pc/biosdisk.c (19:56:25) cjwatson: at least find out what the BIOS thinks > 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. > > -- Regards Vladimir 'φ-coder/phcoder' Serbinenko
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel