I've recently obtained a Toshiba Libretto U100. It appears that the BIOS
does not pass the boot drive correctly, and so grub only works if the
"d" argument is given to grub's install command.
The attached patch does the following:
a) If the "d" argument is not given, saves the source drive in a new
field in the stage1 header
b) If stage1 is unable to find the boot drive, check whether the source
drive was saved. If so, set that as the boot drive and try to boot
again
c) If booting still fails, error out
The only time that this code should run is in the case of the BIOS
failing to provide the boot drive. It will not be executed if the "d"
command is given to install.
--
Matthew Garrett | [EMAIL PROTECTED]
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_drive;
+ }
/* Set the boot drive. */
*((unsigned char *) (stage1_buffer + STAGE1_BOOT_DRIVE)) = new_drive;
_______________________________________________
Bug-grub mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/bug-grub