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

Laurent Vivier laurent at vivier.eu
Wed Feb 4 12:58:12 CET 2009


>
>Le 3 févr. 09 à 14:27, Stefan Assmann a écrit :
>
>> 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);
>
>what happens if strlen(path) > strlen("&device;") ?
>moreover device is not path, but path is "device:partition"
>>
>> +    }
>> +    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);
>
>what happens if strlen(partition) > strlen("&partition;") ?
>
>>
>> +        } 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 ) {
>
>what it is wrong here is we try to read a file from partition 1 which  
>is the partition map...
>I guess we should write a "modules/iso9660-parts.c" to override this  
>(as macintosh CD are hybrid: ISO9660 and HFS).

Something like that seems to work:

Index: openbios-devel/modules/disk-label.c
===================================================================
--- openbios-devel.orig/modules/disk-label.c	2009-02-04 12:51:53.000000000 +0100
+++ openbios-devel/modules/disk-label.c	2009-02-04 12:56:51.000000000 +0100
@@ -78,6 +78,19 @@
 		}
 	}
 
+        /* try to see if there is a filesystem without partition */
+
+	PUSH_ih( my_self() );
+	selfword("find-filesystem");
+	ph = POP_ph();
+	if( ph ) {
+		push_str( filename );
+		PUSH_ph( ph );
+		fword("interpose");
+	        success = 1;
+                goto out;
+	}
+
 	/* find partition handler */
 	seek_io( fd, 0 );
 	if( read_io(fd, block0, sizeof(block0)) != sizeof(block0) )

-- 
--------------------- Laurent at vivier.eu  ---------------------
"Tout ce qui est impossible reste à accomplir"    Jules Verne
"Things are only impossible until they're not" Jean-Luc Picard
-------------- next part --------------
A non-text attachment was scrubbed...
Name: no_partition.patch
Type: application/octet-stream
Size: 771 bytes
Desc: not available
URL: <http://lists.openbios.org/pipermail/openbios/attachments/20090204/d0e39a3f/attachment.dmg>


More information about the OpenBIOS mailing list