]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
2007-09-07 Robert Millan <rmh@aybabtu.com>
authorrobertmh <robertmh@localhost>
Fri, 7 Sep 2007 21:59:03 +0000 (21:59 +0000)
committerrobertmh <robertmh@localhost>
Fri, 7 Sep 2007 21:59:03 +0000 (21:59 +0000)
* kern/powerpc/ieee1275/cmain.c (grub_ieee1275_test_flag): Detect
SmartFirmware version updates (as released by Sven Luther), and avoid
setting GRUB_IEEE1275_FLAG_NO_PARTITION_0 or
GRUB_IEEE1275_FLAG_0_BASED_PARTITIONS unless the running version is
known broken.

ChangeLog
kern/powerpc/ieee1275/cmain.c

index eae17a6b3d9155713e4b6c6b47c800180197946f..c102a47d0acb344b3b5ddb53929be565782a8885 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2007-09-07  Robert Millan  <rmh@aybabtu.com>
+
+       * kern/powerpc/ieee1275/cmain.c (grub_ieee1275_test_flag): Detect
+       SmartFirmware version updates (as released by Sven Luther), and avoid
+       setting GRUB_IEEE1275_FLAG_NO_PARTITION_0 or
+       GRUB_IEEE1275_FLAG_0_BASED_PARTITIONS unless the running version is
+       known broken.
+
 2007-09-03  Yoshinori K. Okuji  <okuji@enbug.org>
 
        From Hitoshi Ozeki:
index 9b531f0ae833d2e1255dcd492f7cc47306200b8f..ab7ae660f2c26c4a13aa089d3a7bdb38b38cd601 100644 (file)
@@ -30,9 +30,9 @@ int (*grub_ieee1275_entry_fn) (void *);
 grub_ieee1275_phandle_t grub_ieee1275_chosen;
 
 static grub_uint32_t grub_ieee1275_flags;
-
 \f
 
+
 int
 grub_ieee1275_test_flag (enum grub_ieee1275_flag flag)
 {
@@ -52,6 +52,8 @@ grub_ieee1275_find_options (void)
   grub_ieee1275_phandle_t openprom;
   int rc;
   int realmode = 0;
+  char tmp[32];
+  int is_smartfirmware = 0;
 
   grub_ieee1275_finddevice ("/options", &options);
   rc = grub_ieee1275_get_property (options, "real-mode?", &realmode,
@@ -60,12 +62,43 @@ grub_ieee1275_find_options (void)
     grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_REAL_MODE);
 
   grub_ieee1275_finddevice ("/openprom", &openprom);
-  rc = grub_ieee1275_get_property (openprom, "SmartFirmware-version", 0, 0, 0);
-  if (rc >= 0)
+
+  rc = grub_ieee1275_get_property (openprom, "CodeGen-copyright",
+                                  tmp, sizeof (tmp), 0);
+#define SF "SmartFirmware(tm)"
+  if (rc >= 0 && !grub_strncmp (tmp, SF, sizeof (SF) - 1))
+    is_smartfirmware = 1;
+
+  if (is_smartfirmware)
     {
-      grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_NO_PARTITION_0);
-      grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_0_BASED_PARTITIONS);
+      /* Broken in all versions */
       grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_BROKEN_OUTPUT);
+
+      /* There are two incompatible ways of checking the version number.  Try
+         both. */
+      rc = grub_ieee1275_get_property (openprom, "SmartFirmware-version",
+                                      tmp, sizeof (tmp), 0);
+      if (rc < 0)
+       rc = grub_ieee1275_get_property (openprom, "firmware-version",
+                                        tmp, sizeof (tmp), 0);
+      if (rc >= 0)
+       {
+         /* It is tempting to implement a version parser to set the flags for
+            e.g. 1.3 and below.  However, there's a special situation here.
+            3rd party updates which fix the partition bugs are common, and for
+            some reason their fixes aren't being merged into trunk.  So for
+            example we know that 1.2 and 1.3 are broken, but there's 1.2.99
+            and 1.3.99 which are known good (and appliing this workaround
+            would cause breakage). */
+         if (!grub_strcmp (tmp, "1.0")
+             || !grub_strcmp (tmp, "1.1")
+             || !grub_strcmp (tmp, "1.2")
+             || !grub_strcmp (tmp, "1.3"))
+           {
+             grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_NO_PARTITION_0);
+             grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_0_BASED_PARTITIONS);
+           }
+       }
     }
 }