2005-02-15 Yoshinori K. Okuji <okuji@enbug.org>

* stage2/builtins.c (install_func): If DEST_DRIVE is a hard
  disk, enable the workaround in Stage 1 by replacing the jmp
  with double nop's.

  * stage1/stage1.h (STAGE1_BOOT_DRIVE_CHECK): New macro.
  (STAGE1_BOOT_DRIVE_MASK): Removed.

  * stage1/stage1.S (boot_drive_check): New label. This implements
  a different workaround for buggy BIOSes which don't pass boot
  drive correctly. This is effective for BIOSes which pass a value
  without the seventh bit (0x80).
  (boot_drive_mask): Removed.
This commit is contained in:
okuji 2005-02-15 22:05:07 +00:00
parent fb908db4ad
commit 041e243877
5 changed files with 41 additions and 12 deletions

View file

@ -1,3 +1,18 @@
2005-02-15 Yoshinori K. Okuji <okuji@enbug.org>
* stage2/builtins.c (install_func): If DEST_DRIVE is a hard
disk, enable the workaround in Stage 1 by replacing the jmp
with double nop's.
* stage1/stage1.h (STAGE1_BOOT_DRIVE_CHECK): New macro.
(STAGE1_BOOT_DRIVE_MASK): Removed.
* stage1/stage1.S (boot_drive_check): New label. This implements
a different workaround for buggy BIOSes which don't pass boot
drive correctly. This is effective for BIOSes which pass a value
without the seventh bit (0x80).
(boot_drive_mask): Removed.
2005-02-03 Yoshinori K. Okuji <okuji@enbug.org> 2005-02-03 Yoshinori K. Okuji <okuji@enbug.org>
* grub/asmstub.c (console_current_color): Make it global as * grub/asmstub.c (console_current_color): Make it global as

6
NEWS
View file

@ -1,5 +1,11 @@
NEWS - list of user-visible changes between releases of GRUB NEWS - list of user-visible changes between releases of GRUB
New:
* Fix the prototypes and the definitions of nested functions. This was
required for gcc-4.
* Implement a more robust workaround for buggy BIOSes which don't pass
boot drive correctly (notably for HP Vectra).
New in 0.96 - 2005-01-30: New in 0.96 - 2005-01-30:
* The command "fallback" supports mutiple fallback entries. * The command "fallback" supports mutiple fallback entries.
* The command "savedefault" supports an optional argument which * The command "savedefault" supports an optional argument which

View file

@ -108,12 +108,18 @@ after_BPB:
/* /*
* This is a workaround for buggy BIOSes which don't pass boot * This is a workaround for buggy BIOSes which don't pass boot
* drive correctly. If GRUB is installed into a HDD, do * drive correctly. If GRUB is installed into a HDD, check if
* "orb $0x80, %dl", otherwise "orb $0x00, %dl" (i.e. nop). * DL is masked correctly. If not, assume that the BIOS passed
* a bogus value and set DL to 0x80, since this is the only
* possible boot drive. If GRUB is installed into a floppy,
* this does nothing (only jump).
*/ */
.byte 0x80, 0xca boot_drive_check:
boot_drive_mask: jmp 1f
.byte 0x00 testb $0x80, %dl
jnz 1f
movb $0x80, %dl
1:
/* /*
* ljmp to the next instruction because some bogus BIOSes * ljmp to the next instruction because some bogus BIOSes

View file

@ -51,8 +51,8 @@
/* The offset of STAGE2_SEGMENT. */ /* The offset of STAGE2_SEGMENT. */
#define STAGE1_STAGE2_SEGMENT 0x48 #define STAGE1_STAGE2_SEGMENT 0x48
/* The offset of BOOT_DRIVE_MASK. */ /* The offset of BOOT_DRIVE_CHECK. */
#define STAGE1_BOOT_DRIVE_MASK 0x4d #define STAGE1_BOOT_DRIVE_CHECK 0x4b
/* The offset of a magic number used by Windows NT. */ /* The offset of a magic number used by Windows NT. */
#define STAGE1_WINDOWS_NT_MAGIC 0x1b8 #define STAGE1_WINDOWS_NT_MAGIC 0x1b8

View file

@ -1952,11 +1952,13 @@ install_func (char *arg, int flags)
/* Set the "force LBA" flag. */ /* Set the "force LBA" flag. */
*((unsigned char *) (stage1_buffer + STAGE1_FORCE_LBA)) = is_force_lba; *((unsigned char *) (stage1_buffer + STAGE1_FORCE_LBA)) = is_force_lba;
/* Set the boot drive mask. This is a workaround for buggy BIOSes which /* If DEST_DRIVE is a hard disk, enable the workaround, which is
don't pass boot drive correctly. Instead, they pass 0x00 even when for buggy BIOSes which don't pass boot drive correctly. Instead,
booted from 0x80. */ they pass 0x00 or 0x01 even when booted from 0x80. */
*((unsigned char *) (stage1_buffer + STAGE1_BOOT_DRIVE_MASK)) if (dest_drive & BIOS_FLAG_FIXED_DISK)
= (dest_drive & BIOS_FLAG_FIXED_DISK); /* Replace the jmp (2 bytes) with double nop's. */
*((unsigned short *) (stage1_buffer + STAGE1_BOOT_DRIVE_CHECK))
= 0x9090;
/* Read the first sector of Stage 2. */ /* Read the first sector of Stage 2. */
disk_read_hook = disk_read_savesect_func; disk_read_hook = disk_read_savesect_func;