[OpenBIOS] [RFC PATCH] ppc correctly replace &device; and &partition;

Stefan Assmann sassmann at suse.de
Tue Feb 3 14:27:04 CET 2009


Subject: ppc correctly replace &device; and &partition;

This patch correctly replaces the variables &device; and &partition;
with firmware values thus allowing to boot from different partitions.

Signed-off-by: Stefan Assmann <sassmann at suse.de>

Index: arch/ppc/qemu/main.c
===================================================================
--- arch/ppc/qemu/main.c	(revision 439)
+++ arch/ppc/qemu/main.c	(working copy)
@@ -154,9 +154,9 @@
 static void
 try_bootinfo(const char *path)
 {
-    int fd;
-    char tagbuf[256], bootscript[256], c, *left, *right;
-    int len, tag, taglen, script, scriptlen;
+    int fd, len, tag, taglen, script, scriptlen;
+    char tagbuf[256], bootscript[256], c;
+    char *buf, *partition;

     snprintf(bootscript, sizeof(bootscript), "%s,ppc\\bootinfo.txt", path);
     ELF_DPRINTF("Trying %s\n", bootscript);
@@ -195,22 +195,33 @@
             bootscript[scriptlen++] = c;
         }
     } while (1);
-
     ELF_DPRINTF("got bootscript %s\n", bootscript);

-    // Replace &device;: with original path
-    push_str(bootscript);
-    PUSH('&');
-    fword("left-split");
-    fword("2swap");
-    PUSH(':');
-    fword("left-split");
-    fword("2drop");
-    right = pop_fstr_copy();
-    left = pop_fstr_copy();
-    while (right[0] != '\\' && right[0] != '\0')
-    right++;
-    snprintf(bootscript, sizeof(bootscript), "%s%s,%s", left, path, right);
+    /* replace &device; and &partition; */
+    if ( (buf =  strstr(bootscript, (const char *) "&device;")) != NULL ) {
+            buf[0] = '\0';
+	    buf += strlen("&device;");
+            snprintf(bootscript, sizeof(bootscript), "%s%s%s", bootscript, path, buf);
+    }
+    if ( (partition = strchr(path, ':')) != NULL ) {
+        *partition = '\0';
+        partition++;
+        if ( (buf = strstr(bootscript, (const char *) "&partition;")) != NULL ) {
+            *buf = '\0';
+            buf += strlen("&partition;");
+            snprintf(bootscript, sizeof(bootscript), "%s%s%s", bootscript, partition, buf);
+        } else {
+            /* FIXME: allow booting of SUSE media with following layout (fails without this workaround)
+             * Number  Start  End     Size    File system  Name        Flags
+             * 1      512B   1535B   1024B                Apple       , , , , , , , , , , , , type=Apple_partition_map
+             * 2      8192B  4126MB  4126MB               SU1110.001  , , , , , , , , , , , , type=Apple_HFS
+             */
+            if ( (buf = strstr(bootscript, (const char *) "1,\\suseboot\\yaboot.ibm")) != NULL ) {
+                *buf = *partition;
+                ELF_DPRINTF("SUSE bootscript hack %s\n", bootscript);
+            }
+	}
+    }
     ELF_DPRINTF("fixed bootscript %s\n", bootscript);

     feval(bootscript);

  Stefan

-- 
Stefan Assmann          | SUSE LINUX Products GmbH
Software Engineer       | Maxfeldstr. 5, D-90409 Nuernberg
Mail: sassmann at suse.de  | GF: Markus Rex, HRB 16746 (AG Nuernberg)



More information about the OpenBIOS mailing list