[OpenBIOS] [commit] r969 - in trunk/openbios-devel/arch: ppc/qemu ppc64/qemu
Blue Swirl
blauwirbel at gmail.com
Sat Nov 27 20:02:22 CET 2010
On Sat, Nov 27, 2010 at 6:42 PM, Andreas Färber <andreas.faerber at web.de> wrote:
> 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)
But then there are strange errors:
../arch/ppc/qemu/start.S: Assembler messages:
../arch/ppc/qemu/start.S:293: Error: invalid segment ".opd"
>> 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.
But then there would be a link time conflict with entry() in
arch/ppc/qemu/init.c.
>> 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?
I think that's also the approach Linux uses. I don't have preference.
More information about the OpenBIOS
mailing list