Author: nwhitehorn
Date: Tue Aug 30 00:47:21 2016
New Revision: 305036
URL: https://svnweb.freebsd.org/changeset/base/305036

Log:
  Some versions of SLOF do not append the partition number to the boot
  device argument to the stage-1 bootloader. In such cases, boot1 would
  only try to read the entire device rather than checking for partitions.
  Instead of panic'ing, fall back to reading the partitions as normal in
  such situations. This was preventing boot of installed systems on some
  versions of PowerKVM.
  
  PR:           kern/211599
  MFC after:    2 days

Modified:
  head/sys/boot/powerpc/boot1.chrp/boot1.c

Modified: head/sys/boot/powerpc/boot1.chrp/boot1.c
==============================================================================
--- head/sys/boot/powerpc/boot1.chrp/boot1.c    Mon Aug 29 23:57:00 2016        
(r305035)
+++ head/sys/boot/powerpc/boot1.chrp/boot1.c    Tue Aug 30 00:47:21 2016        
(r305036)
@@ -137,7 +137,9 @@ ofw_init(void *vpd, int res, int (*openf
 
        p = bootpath;
        while (*p != '\0') {
+               /* Truncate partition ID */
                if (*p == ':') {
+                       ofw_close(bootdev);
                        *(++p) = '\0';
                        break;
                }
@@ -419,31 +421,40 @@ main(int ac, char **av)
 
        memcpy(bootpath_full,bootpath,len+1);
 
-       if (bootpath_full[len-1] == ':') {
-               for (i = 0; i < 16; i++) {
-                       if (i < 10) {
-                               bootpath_full[len] = i + '0';
-                               bootpath_full[len+1] = '\0';
-                       } else {
-                               bootpath_full[len] = '1';
-                               bootpath_full[len+1] = i - 10 + '0';
-                               bootpath_full[len+2] = '\0';
-                       }
-                               
-                       if (domount(bootpath_full,1) >= 0)
-                               break;
-
-                       if (bootdev > 0)
-                               ofw_close(bootdev);
+       if (bootpath_full[len-1] != ':') {
+               /* First try full volume */
+               if (domount(bootpath_full,1) == 0)
+                       goto out;
+
+               /* Add a : so that we try partitions if that fails */
+               if (bootdev > 0)
+                       ofw_close(bootdev);
+               bootpath_full[len] = ':';
+               len += 1;
+       }
+
+       /* Loop through first 16 partitions to find a UFS one */
+       for (i = 0; i < 16; i++) {
+               if (i < 10) {
+                       bootpath_full[len] = i + '0';
+                       bootpath_full[len+1] = '\0';
+               } else {
+                       bootpath_full[len] = '1';
+                       bootpath_full[len+1] = i - 10 + '0';
+                       bootpath_full[len+2] = '\0';
                }
+                       
+               if (domount(bootpath_full,1) >= 0)
+                       break;
 
-               if (i >= 16)
-                       panic("domount");
-       } else {
-               if (domount(bootpath_full,0) == -1)
-                       panic("domount");
+               if (bootdev > 0)
+                       ofw_close(bootdev);
        }
 
+       if (i >= 16)
+               panic("domount");
+
+out:
        printf("   Boot volume:   %s\n",bootpath_full);
        ofw_setprop(chosenh, "bootargs", bootpath_full, len+2);
        load(path);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to