[OpenBIOS] PPC: QEMU breaks static variables in OpenBIOS
Mark Cave-Ayland
mark.cave-ayland at ilande.co.uk
Sat Jan 5 13:05:29 CET 2013
On 02/01/13 21:58, Alexander Graf wrote:
> 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.
Okay, I spent some time looking at the PPC MMU code in detail last night
and my current thinking is that this might be a QEMU bug.
The initial physical memory map (before MMU is enabled on startup) looks
like this:
0x0000000 - 0x8000000 RAM
0xfff00000 - 0xffffffff OpenBIOS image
In setup_mmu(), just before the MMU is enabled, the entire image is
memcpy()'d from the OpenBIOS image area to the top area of RAM so we now
have this:
0x0000000 - 0x7efffff Free RAM
0x7f00000 - 0x7ffffff OpenBIOS RAM image
0xfff00000 - 0xffffffff OpenBIOS ROM image
Now the reason that OpenBIOS actually executes from RAM is because of
this section of code in the MMU fault handler code:
if (ea >= OF_CODE_START && ea <= 0xffffffffUL) {
/* ROM into RAM */
ea -= OF_CODE_START;
phys = get_rom_base() + ea;
*mode = 0x02;
return phys;
}
Given that OF_CODE_START is 0xfff00000 and get_rom_base() returns
0x7f00000, it's fairly easy to see that accesses to the virtual address
range from 0xfff00000 - 0xffffffff are mapped to the OpenBIOS RAM image
physical addresses 0x7f00000 - 0x7ffffff. Hence I would expect OpenBIOS
to be running from RAM.
I wonder if what is happening is that QEMU is not only marking the
*physical* range 0xfff00000 - 0xffffffff as read-only, but also the
*virtual* range 0xfff00000 - 0xffffffff when the MMU is enabled? If so,
I think this may be a QEMU bug since after these addresses have been
remapped into RAM then they should be writeable.
ATB,
Mark.
More information about the OpenBIOS
mailing list