[OpenBIOS] [commit] r969 - in trunk/openbios-devel/arch: ppc/qemu ppc64/qemu

Andreas Färber andreas.faerber at web.de
Sat Nov 27 19:42:49 CET 2010


Am 27.11.2010 um 16:03 schrieb Blue Swirl:

> On Sat, Nov 27, 2010 at 10:36 AM, Andreas Färber <andreas.faerber at web.de 
> > wrote:
>> Am 27.11.2010 um 11:22 schrieb Blue Swirl:
>>
>>> On Sat, Nov 27, 2010 at 1:16 AM, Andreas Färber <andreas.faerber at web.de 
>>> >
>>> wrote:
>>>> Am 26.11.2010 um 20:52 schrieb Blue Swirl:
>>>>
>>>>> On Thu, Nov 25, 2010 at 10:04 PM, Andreas Färber
>>>>> <andreas.faerber at web.de>
>>>>> wrote:
>>>>>>
>>>>>> Starting with [r969],
>>>>>>
>>>>>> qemu-system-ppc64 -bios .../obj-ppc64/openbios-qemu.elf -prom-env
>>>>>> 'auto-boot?=false'
>>>>>>
>>>>>> should take you to the Forth prompt.
>>>>>
>>>>> I built forthstrap on a 32 bit host to get further, but then I  
>>>>> got:
>>>>>  LINK  openbios-qemu.elf
>>>>> libqemu.a(init.o): In function `go':
>>>>> /src/openbios-devel/obj-ppc64/../arch/ppc/qemu/init.c:533:  
>>>>> undefined
>>>>> reference to `.call_elf'
>>>>
>>>> [snip]
>>>>
>>>> Sounds as if -m32 or the like is being passed to powerpc64-linux- 
>>>> ld?
>>>> Dotted
>>>> symbols only get generated for ppc64 target.
>>>
>>> No, LINK equals to (with V=1):
>>>
>>> powerpc64-linux-ld --warn-common -N -T ../arch/ppc64/qemu/ldscript  
>>> -o
>>> openbios-qemu.elf.nostrip --whole-archive target/arch/ppc/qemu/ 
>>> start.o
>>> target/arch/ppc/timebase.o libqemu.a libbootstrap.a libopenbios.a
>>> libpackages.a libdrivers.a libfs.a liblibc.a libgcc.a
>>
>> Ah, right, it would've warned about architecture mismatch then.  
>> What about
>> CC for start.o?
>> And could you try 4.5.1 to rule out your 4.6 snapshot? I'll try if
>> Darwin/ppc64 works.
>
> It looks like GLOBL macro is not correct.

Yeah, I stumbled across that for call_elf(), too.

> With this patch (using Linux
> arch/powerpc/include/asm/ppc_asm.h except for the .sections which
> don't work for some reason),

(the Linux macros force .text while we use .text.vectors for  
placement; .opd should be right though)

> the link succeeds:
> diff --git a/arch/ppc/qemu/start.S b/arch/ppc/qemu/start.S
> index 4b6df3f..8439542 100644
> --- a/arch/ppc/qemu/start.S
> +++ b/arch/ppc/qemu/start.S
> @@ -285,14 +285,13 @@ call_isi_exception:
> exception_return:
>        EXCEPTION_EPILOGUE
>
> -       .globl  __divide_error
> -__divide_error:
> +GLOBL(__divide_error):

Acked.

> trap_error:
>        mflr    r3
>        b       BRANCH_LABEL(unexpected_excep)
>
> VECTOR( 0x100, "SRE" ):
> -        b       _entry
> +        b       BRANCH_LABEL(_entry)
>
> ILLEGAL_VECTOR( 0x200 )
>
> @@ -358,7 +357,7 @@ VECTOR( 0x2200, "ISI_64" ):
> GLOBL(__vectors_end):
>
> / 
> ************************************************************************/
> -/*      
> entry                                                           */
> +/*      
> _entry                                                          */
> / 
> ************************************************************************/
>
> GLOBL(_entry):
> @@ -453,7 +452,7 @@ GLOBL(_entry):
> #endif
>
>        bl      BRANCH_LABEL(setup_mmu)
> -       bl      BRANCH_LABEL(entry)
> +        bl      BRANCH_LABEL(_entry)

Nack, infinite recursion. Original code is right, unless .entry gets  
hidden by the compiler somehow. If the latter, we need to dereference  
the function descriptor instead and do a bctrl.

> 1:     nop
>        b       1b
>
> @@ -678,4 +677,4 @@ compute_ramsize:
>
>         /* Hard reset vector */
>        .section .romentry,"ax"
> -       bl      _entry
> +        bl      BRANCH_LABEL(_entry)
> diff --git a/include/arch/ppc/asmdefs.h b/include/arch/ppc/asmdefs.h
> index 9c85ea5..b2cfa48 100644
> --- a/include/arch/ppc/asmdefs.h
> +++ b/include/arch/ppc/asmdefs.h
> @@ -110,8 +110,25 @@
> #endif
>
> #ifndef __darwin__
> +#ifdef __powerpc64__
> +#define XGLUE(a,b) a##b
> +#define GLUE(a,b) XGLUE(a,b)
> +
> +#define GLOBL(name) \
> +        .align 2 ; \
> +        .globl name; \
> +        .globl GLUE(.,name); \
> +name: \
> +        .quad GLUE(.,name); \
> +        .quad .TOC. at tocbase; \
> +        .quad 0; \
> +        .type GLUE(.,name), at function; \
> +GLUE(.,name)

Doesn't look right without the sections... or at least strange.

> +#define EXTERN(name)            _##name
> +#else
> #define GLOBL( name )          .globl name ; name
> #define EXTERN( name )         name
> +#endif
> #else
> /* an underscore is needed on Darwin */
> #define GLOBL( name )          .globl _##name ; name: ; _##name

I was rather considering to add a new macro for externally called  
functions like call_elf() and the ciface, i.e. leave GLOBL() as it is  
with compatibility stuff and add a new GLOBAL() macro for instance  
that does the ppc64 .opd, using our GLOBL() internally. The advantage  
would be that we don't need to clutter start.S with unneeded  
BRANCH_LABEL() calls. What do you think?

Andreas


More information about the OpenBIOS mailing list