Fall back to source drive if BIOS doesn't pass useful boot drive

Bug #19754 reported by Matthew Garrett
4
Affects Status Importance Assigned to Milestone
grub (Debian)
Fix Released
Unknown
grub (Ubuntu)
Fix Released
Medium
Unassigned

Bug Description

On boot, the BIOS is supposed to pass the boot drive to the bootloader
in register dx. Not all BIOSes do this. Debian bug 323397 contains a patch that
works around this.

Revision history for this message
Matthew Garrett (mjg59) wrote :

On boot, the BIOS is supposed to pass the boot drive to the bootloader
in register dx. Not all BIOSes do this. Debian bug 323397 contains a patch that
works around this.

Revision history for this message
Debian Bug Importer (debzilla) wrote :
Download full text (3.7 KiB)

Message-Id: <email address hidden>
Date: Tue, 16 Aug 2005 14:20:14 +0100
From: Matthew Garrett <email address hidden>
To: Debian Bug Tracking System <email address hidden>
Subject: grub: Does not fall back to source drive if BIOS fails to pass boot drive

Package: grub
Version: 0.95+cvs20040624-12
Severity: normal
Tags: patch

On boot, the BIOS is supposed to pass the boot drive to the bootloader
in register dx. Not all BIOSes do this. The included patch causes grub
to attempt to boot off the boot drive passed by the BIOS. If this fails,
it then reverts to the drive that grub was originally installed to. It
should only trigger in cases that currently fail.

diff -ur -x 'Makefile*' -x 'config.*' grub-0.95+cvs20040624/stage1/stage1.h grubme/stage1/stage1.h
--- grub-0.95+cvs20040624/stage1/stage1.h 2004-03-27 17:02:53 +0000
+++ grubme/stage1/stage1.h 2005-08-16 13:54:01 +0100
@@ -54,6 +54,9 @@
 /* The offset of BOOT_DRIVE_MASK. */
 #define STAGE1_BOOT_DRIVE_MASK 0x4d

+/* The offset of STAGE1_SOURCE_DRIVE. */
+#define STAGE1_SOURCE_DRIVE 0x4e
+
 /* The offset of a magic number used by Windows NT. */
 #define STAGE1_WINDOWS_NT_MAGIC 0x1b8

diff -ur -x 'Makefile*' -x 'config.*' grub-0.95+cvs20040624/stage1/stage1.S grubme/stage1/stage1.S
--- grub-0.95+cvs20040624/stage1/stage1.S 2004-03-27 17:02:53 +0000
+++ grubme/stage1/stage1.S 2005-08-16 13:55:34 +0100
@@ -115,12 +115,16 @@
 boot_drive_mask:
  .byte 0x00

+
+source_drive:
+ .byte GRUB_INVALID_DRIVE
+
  /*
   * ljmp to the next instruction because some bogus BIOSes
   * jump to 07C0:0000 instead of 0000:7C00.
   */
  ljmp $0, $ABS(real_start)
-
+
 real_start:

  /* set up %ds and %ss as offset from 0 */
@@ -236,7 +240,18 @@
  testb $STAGE1_BIOS_HD_FLAG, %dl
  jz floppy_probe

- /* Nope, we definitely have a hard disk, and we're screwed. */
+ /* Nope, we definitely have a hard disk, and we're screwed.
+ Try as hard as we can to recover. */
+
+ MOV_MEM_TO_AL(ABS(source_drive)) /* movb ABS(source_drive), %al */
+ cmpb $GRUB_INVALID_DRIVE, %al
+ je 1f
+ cmpb %al, %dl /* We've been here before */
+ je 1f
+ movb %al, %dl
+ jmp 1b
+
+1:
  jmp hd_probe_error

 final_init:
diff -ur -x 'Makefile*' -x 'config.*' grub-0.95+cvs20040624/stage2/builtins.c grubme/stage2/builtins.c
--- grub-0.95+cvs20040624/stage2/builtins.c 2005-08-16 13:34:13 +0100
+++ grubme/stage2/builtins.c 2005-08-16 13:57:44 +0100
@@ -2063,12 +2063,19 @@
   src_part_start = part_start;
   src_geom = buf_geom;

- if (! new_drive)
+ if (! new_drive) {
     new_drive = src_drive;
- else if (src_drive != dest_drive)
- grub_printf ("Warning: the option `d' was not used, but the Stage 1 will"
- " be installed on a\ndifferent drive than the drive where"
- " the Stage 2 resides.\n");
+ *((unsigned char *) (stage1_buffer + STAGE1_SOURCE_DRIVE)) =
+ GRUB_INVALID_DRIVE;
+ } else {
+ if (src_drive != dest_drive)
+ grub_printf ("Warning: the option `d' was not used, but the"
+ " Stage 1 will be installed on a\ndifferent"
+ " drive than the drive where the Stage 2"
+ " resides.\n");
+ *((unsigned char *) (stage1_buffer + STAGE1_SOURCE_DRIVE)) =
+ src_...

Read more...

Revision history for this message
Tollef Fog Heen (tfheen) wrote :

Apparently, Matthew forgot to tell Matthew that Matthew should close Matthew's bug,
so I'm doing it for him.

grub (0.95+cvs20040624-17ubuntu5) breezy; urgency=low

  * Add support for falling back to the drive that grub was installed on
    when looking for stage 2 (Ubuntu #13511)

 -- Matthew Garrett <email address hidden> Sat, 20 Aug 2005 13:03:45 +0100

Revision history for this message
In , Otavio Salvador (otavio) wrote : Fixed by upstream in 0.97

Package: grub
Version: 0.97-1

Hello,

Current version has a better code for doing it. It also handle the
cases when bug BIOS do not provide the need information.

Try it out and if you feel it continue to be important, please reopen
the bug.

--
        O T A V I O S A L V A D O R
---------------------------------------------
 E-mail: <email address hidden> UIN: 5906116
 GNU/Linux User: 239058 GPG ID: 49A5F855
 Home Page: http://www.freedom.ind.br/otavio
---------------------------------------------
"Microsoft gives you Windows ... Linux gives
 you the whole house."

Revision history for this message
Debian Bug Importer (debzilla) wrote :

Message-ID: <email address hidden>
Date: Tue, 13 Dec 2005 23:10:25 -0200
From: Otavio Salvador <email address hidden>
To: <email address hidden>
Subject: Fixed by upstream in 0.97

Package: grub
Version: 0.97-1

Hello,

Current version has a better code for doing it. It also handle the
cases when bug BIOS do not provide the need information.

Try it out and if you feel it continue to be important, please reopen
the bug.

--
        O T A V I O S A L V A D O R
---------------------------------------------
 E-mail: <email address hidden> UIN: 5906116
 GNU/Linux User: 239058 GPG ID: 49A5F855
 Home Page: http://www.freedom.ind.br/otavio
---------------------------------------------
"Microsoft gives you Windows ... Linux gives
 you the whole house."

To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.