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

Stefan Assmann sassmann at suse.de
Wed Feb 4 13:35:48 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,23 @@
             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 ( (partition = strchr(path, ':')) != NULL ) {
+        *partition = '\0';
+        partition++;
+        if ( (buf =  strstr(bootscript, (const char *) "&device;")) != NULL ) {
+            *buf = '\0';
+	    buf += strlen("&device;");
+            snprintf(bootscript, sizeof(bootscript), "%s%s%s", bootscript, path, buf);
+        }
+        if ( (buf = strstr(bootscript, (const char *) "&partition;")) != NULL ) {
+            *buf = '\0';
+            buf += strlen("&partition;");
+            snprintf(bootscript, sizeof(bootscript), "%s%s%s", bootscript, partition, buf);
+        }
+    }
     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