]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
2008-03-05 Bean <bean123ch@gmail.com>
authorbean <bean@localhost>
Wed, 5 Mar 2008 05:09:35 +0000 (05:09 +0000)
committerbean <bean@localhost>
Wed, 5 Mar 2008 05:09:35 +0000 (05:09 +0000)
* loader/i386/pc/multiboot.c (grub_multiboot_get_bootdev): New function.
(grub_multiboot): Set boot device.

* boot/i386/pc/lnxboot.S (real_code_2): Set %dh to 0xFF.

ChangeLog
boot/i386/pc/lnxboot.S
loader/i386/pc/multiboot.c

index 07580f863544cfa7fbb7ee55fca51cdbb6db7cda..c50e5922401e1e7c0e4ccecd1c417548db98ac1e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2008-03-05  Bean  <bean123ch@gmail.com>
+
+       * loader/i386/pc/multiboot.c (grub_multiboot_get_bootdev): New function.
+       (grub_multiboot): Set boot device.
+
+       * boot/i386/pc/lnxboot.S (real_code_2): Set %dh to 0xFF.
+
 2008-03-02  Bean  <bean123ch@gmail.com>
 
        * fs/reiserfs.c (grub_reiserfs_read_symlink): Add 0 at the end of
index 2a913ba9c4e7021b4a1cf5595c0fd16d39064e3b..955cc419da202b04070cd365bd733f54878a92e5 100644 (file)
@@ -115,7 +115,7 @@ gdt_dst2:
        .long   0, 0, 0, 0              /* More space for the BIOS.  */
 
 reg_edx:
-       .byte   0x80, 0xFF, 0xFF, 0xFF
+       .byte   0x80, 0, 0xFF, 0xFF
 
 data_leng:
        .long   0
@@ -207,6 +207,8 @@ real_code_2:
        movsbl  (reg_edx + 2 - start), %eax
        movl    %eax, %ss:(DATA_ADDR + GRUB_KERNEL_MACHINE_INSTALL_BSD_PART)
 
+       movb    $0xFF, %dh
+
        ljmp    $(DATA_ADDR >> 4), $0
 
 /*
index 67959cfb2f55f2095e7973c3f003bdd08647f9fc..ac2cf2da81d39dfd34964fe8c4cc967d605b7329 100644 (file)
@@ -44,6 +44,7 @@
 #include <grub/mm.h>
 #include <grub/misc.h>
 #include <grub/gzio.h>
+#include <grub/env.h>
 
 extern grub_dl_t my_mod;
 static struct grub_multiboot_info *mbi;
@@ -261,6 +262,51 @@ grub_multiboot_load_elf (grub_file_t file, void *buffer)
   return grub_error (GRUB_ERR_UNKNOWN_OS, "unknown ELF class");
 }
 
+static int
+grub_multiboot_get_bootdev (grub_uint32_t *bootdev)
+{
+  char *p;
+
+  p = grub_env_get ("root");
+  if ((p) && ((p[0] == 'h') || (p[0] == 'f')) && (p[1] == 'd') &&
+      (p[2] >= '0') && (p[2] <= '9'))
+    {
+      grub_uint32_t bd;
+
+      bd = (p[0] == 'h') ? 0x80 : 0;
+      bd += grub_strtoul (p + 2, &p, 0);
+      bd <<= 24;
+
+      if ((p) && (p[0] == ','))
+       {
+         if ((p[1] >= '0') && (p[1] <= '9'))
+           {
+
+             bd += ((grub_strtoul (p + 1, &p, 0) - 1) & 0xFF) << 16;
+
+             if ((p) && (p[0] == ','))
+               p++;
+           }
+          else
+            bd += 0xFF0000;
+
+         if ((p[0] >= 'a') && (p[0] <= 'z'))
+            bd += (p[0] - 'a') << 8;
+          else
+            bd += 0xFF00;
+       }
+      else
+        bd += 0xFFFF00;
+
+      bd += 0xFF;
+
+      *bootdev = bd;
+      return 1;
+    }
+
+  return 0;
+}
+
 void
 grub_multiboot (int argc, char *argv[])
 {
@@ -368,6 +414,9 @@ grub_multiboot (int argc, char *argv[])
   mbi->flags |= MULTIBOOT_INFO_BOOT_LOADER_NAME;
   mbi->boot_loader_name = (grub_uint32_t) grub_strdup (PACKAGE_STRING);
 
+  if (grub_multiboot_get_bootdev (&mbi->boot_device))
+    mbi->flags |= MULTIBOOT_INFO_BOOTDEV;
+
   grub_loader_set (grub_multiboot_boot, grub_multiboot_unload, 1);
 
  fail: