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

Stefan Assmann sassmann at suse.de
Wed Feb 4 13:01:03 CET 2009


Laurent Vivier wrote:
>> 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) )

Nice! I'll try that and post an updated patch.

> 
> 
> 
> ------------------------------------------------------------------------
> 
> --
> OpenBIOS                 http://openbios.org/
> Mailinglist:  http://lists.openbios.org/mailman/listinfo
> Free your System - May the Forth be with you

  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