On Mon, Sep 11, 2006 at 06:26:37PM +0200, Mats Erik Andersson wrote: > Venerable Maintainers of Grub, > > I offer you a patch that should close bug report > #345931. > > The patch has been built on top of grub-0.97-13 with > success and it repaired with honours mbr-installs of > > grub-0.97-1ubuntu1 on kubuntu 6.0.6 > and > grub-0.95+cvs20040624-17sarge1 on Debian > Sarge.
Does your patch work with grub from debian sid? Does GRUB 2 also exhibit this problem? > As you will see the coding is independent of any > Debian patches and contains a few lines of code for > the source file > > grub-0.97/stage2/builtins.c > > and thus would easily integrate in the upstream > version 0.97. I leave to you to decide whether the > author ought to be informed, since I am still a > novice in these matters. > > Best regards > > Mats Erik Andersson > [EMAIL PROTECTED] Content-Description: 526972506-drive_correction.diff > diff -Naur grub-0.97.orig/stage2/builtins.c grub-0.97/stage2/builtins.c > --- grub-0.97.orig/stage2/builtins.c 2006-09-11 16:08:32.261227280 +0200 > +++ grub-0.97/stage2/builtins.c 2006-09-11 16:15:54.035067448 +0200 > @@ -1953,13 +1953,30 @@ > *((unsigned char *) (stage1_buffer + STAGE1_FORCE_LBA)) = is_force_lba; > > /* If DEST_DRIVE is a hard disk, enable the workaround, which is > - for buggy BIOSes which don't pass boot drive correctly. Instead, > - they pass 0x00 or 0x01 even when booted from 0x80. */ > + * for buggy BIOSes which don't pass boot drive correctly. Instead, > + * they pass 0x00 or 0x01 even when booted from 0x80. */ > if (dest_drive & BIOS_FLAG_FIXED_DISK) > - /* Replace the jmp (2 bytes) with double nop's. */ > - *((unsigned short *) (stage1_buffer + STAGE1_BOOT_DRIVE_CHECK)) > - = 0x9090; > - > + { > + if ( *((unsigned char *) (stage1_buffer + STAGE1_BOOT_DRIVE_CHECK)) == > 0xeb ) > + /* For version 0.97: > + * Replace the jmp (2 bytes) with double nop's. */ > + *((unsigned short *) (stage1_buffer + STAGE1_BOOT_DRIVE_CHECK)) > + = 0x9090; > + else if ( *((unsigned char *) (stage1_buffer + STAGE1_BOOT_DRIVE_CHECK)) > == 0x80 ) > + { > + /* For versions 0.94-96: > + * Set the boot drive mask. This is a workaround for buggy BIOSes > which > + * don't pass boot drive correctly. Instead, they pass 0x00 even > when > + * booted from 0x80. > + * Rem: the old STAGE1_BOOT_DRIVE_MASK equals > STAGE1_BOOT_DRIVE_CHECK + 2 */ > + *((unsigned char *) (stage1_buffer + STAGE1_BOOT_DRIVE_CHECK + 2 )) > + = (dest_drive & BIOS_FLAG_FIXED_DISK); > + } > + else > + /* The boot sector is older than version 0.94. > + * Changing to a "nop" could make 0.92 and 0.93 acceptable. */ > + goto fail; > + } > /* Read the first sector of Stage 2. */ > disk_read_hook = disk_read_savesect_func; > if (grub_read (stage2_first_buffer, SECTOR_SIZE) != SECTOR_SIZE) -- Robert Millan My spam trap is [EMAIL PROTECTED] Note: this address is only intended for spam harvesters. Writing to it will get you added to my black list. -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]