]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* grub-core/loader/i386/bsd.c (freebsd_zfsguid): New variable.
authorNavdeep Parhar <nparhar@gmail.com>
Mon, 27 Feb 2012 01:02:16 +0000 (02:02 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Mon, 27 Feb 2012 01:02:16 +0000 (02:02 +0100)
(freebsd_get_zfs): New function.
(grub_freebsd_boot): Pass zfs UUID.
(grub_cmd_freebsd): Set zfs UUID.

ChangeLog
grub-core/loader/i386/bsd.c

index 352b5aecfc31070169e1613261c961726331bc61..963a93fb73a6a4376744db199304710df05d85d9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2012-02-27  Navdeep Parhar <nparhar@gmail.com>
+
+       * grub-core/loader/i386/bsd.c (freebsd_zfsguid): New variable.
+       (freebsd_get_zfs): New function.
+       (grub_freebsd_boot): Pass zfs UUID.
+       (grub_cmd_freebsd): Set zfs UUID.
+
 2012-02-27  Mike Gilbert  <floppym@gentoo.org>
 
        * conf/Makefile.common (platformdir): Base on pkglibdir and not
index 5626d36a19d7aac491d1d065aea6caeba7325151..dc05c67f5081e08dda6022dbc8d2f37c77ca7310 100644 (file)
@@ -537,6 +537,32 @@ grub_netbsd_list_modules (void)
 #include "bsd_pagetable.c"
 
 static grub_uint32_t freebsd_bootdev, freebsd_biosdev;
+static grub_uint64_t freebsd_zfsguid;
+
+static void
+freebsd_get_zfs (void)
+{
+  grub_device_t dev;
+  grub_fs_t fs;
+  char *uuid;
+  grub_err_t err;
+
+  dev = grub_device_open (0);
+  if (!dev)
+    return;
+  fs = grub_fs_probe (dev);
+  if (!fs)
+    return;
+  if (!fs->uuid || grub_strcmp (fs->name, "zfs") != 0)
+    return;
+  err = fs->uuid (dev, &uuid);
+  if (err)
+    return;
+  if (!uuid)
+    return;
+  freebsd_zfsguid = grub_strtoull (uuid, 0, 16);
+  grub_free (uuid);
+}
 
 static grub_err_t
 grub_freebsd_boot (void)
@@ -754,9 +780,9 @@ grub_freebsd_boot (void)
       stack[0] = entry; /* "Return" address.  */
       stack[1] = bootflags | FREEBSD_RB_BOOTINFO;
       stack[2] = freebsd_bootdev;
-      stack[3] = 0;
-      stack[4] = 0;
-      stack[5] = 0;
+      stack[3] = freebsd_zfsguid ? 4 : 0;
+      stack[4] = freebsd_zfsguid;
+      stack[5] = freebsd_zfsguid >> 32;
       stack[6] = stack_target + 9 * sizeof (grub_uint32_t);
       stack[7] = bi.tags;
       stack[8] = kern_end;
@@ -1526,6 +1552,10 @@ grub_cmd_freebsd (grub_extcmd_context_t ctxt, int argc, char *argv[])
            return err;
        }
       grub_bsd_get_device (&freebsd_biosdev, &unit, &slice, &part);
+      freebsd_zfsguid = 0;
+      if (!is_64bit)
+       freebsd_get_zfs ();
+      grub_print_error ();
       freebsd_bootdev = (FREEBSD_B_DEVMAGIC + ((slice + 1) << FREEBSD_B_SLICESHIFT) +
                         (unit << FREEBSD_B_UNITSHIFT) + (part << FREEBSD_B_PARTSHIFT));