[OpenBIOS] PPC: QEMU breaks static variables in OpenBIOS

Alexander Graf agraf at suse.de
Wed Jan 2 22:58:17 CET 2013


On 02.01.2013, at 22:35, Mark Cave-Ayland wrote:

> On 02/01/13 21:07, Benjamin Herrenschmidt wrote:
> 
>> Just relocate .data, that's trivial.
>> 
>> Use the .lds to specify a different load address from link address, put
>> the link address in memory along with the bss and in your early startup
>> code, copy them from the load address to the link address.
>> 
>> No need to process ELF relocs or anything like that.
>> 
>> I'm sure you can find examples of how to do that all over the place
>> (uboot would be a place to look if you don't know the .lds syntax for
>> this, off the top of my head you look for the AT() directive).
>> 
>> Cheers,
>> Ben.
> 
> Hi Ben,
> 
> Thanks for the response. The existing comments in arch/ppc/qemu/start.S suggest that we have a 1MB space at the top of (physical) RAM which we could use for this:
> 
>        /* Memory map:
>         *
>         * Top +-------------------------+
>         *     |                         |
>         *     | ROM into RAM (1 MB)     |
>         *     |                         |
>         *     +-------------------------+
>         *     |                         |
>         *     | MMU Hash Table (64 kB)  |
>         *     |                         |
>         *     +-------------------------+
>         *     |                         |
>         *     | Exception Stack (32 kB) |
>         *     |                         |
>         *     +-------------------------+
>         *     |                         |
>         *     | Stack (64 kB)           |
>         *     |                         |
>         *     +-------------------------+
>         *     |                         |
>         *     | Client Stack (64 kB)    |
>         *     |                         |
>         *     +-------------------------+
>         *     |                         |
>         *     | Malloc Zone (2 MiB)     |
>         *     |                         |
>         *     +-------------------------+
>         *     :                         :
>         * Bottom
>         */
> 
> The comments in arch/ppc/ofmem.c suggest that virtual memory looks like this:
> 
> /****************************************************************
> * Memory usage (before of_quiesce is called)
> *
> *                      Physical
> *
> *      0x00000000      Exception vectors
> *      0x00004000      Free space
> *      0x01e00000      Open Firmware (us)
> *      0x01f00000      OF allocations
> *      0x01ff0000      PTE Hash
> *      0x02000000-     Free space
> *
> * Allocations grow downwards from 0x01e00000
> *
> ****************************************************************/
> 
> So could we stash .data somewhere beneath the Open Firmware virtual mapping, e.g. at 0x01d00000?
> 
> Ben: is this a suitable location for the data section? AFAICT the Open Firmware load base is set to 0x4000 so we shouldn't in theory clash with any boot loaders/kernels. (Disclaimer: I've mainly worked on the SPARC side of OpenBIOS to date, so a lot of the PPC stuff is new to me)
> 
> Alex/Andreas: is this something that you would be able to help with as PPC maintainers? In particular, I have no way to test PPC64. I could probably make an attempt at something for PPC32, with the minor caveat that I would have to learn PPC assembler first...

Well, .bss is easy as we can just move that down to a r/w memory location. .data is slightly more tricky, as we need to copy data early on. Do we need any global preassigned (.data) variables before we get into C? I highly doubt so :).

Thus, I'd be very inclined to believe that we don't need any asm code at all, making this an all-arch solution.


Alex




More information about the OpenBIOS mailing list