On 16.11.2010, at 00:11, Andreas Färber wrote:
Am 16.11.2010 um 00:02 schrieb Segher Boessenkool:
Who's responsible for r2 setup - GCC-generated code or QEMU?
r2 contains the GOT IIRC. But for ABI questions, it's probably best to consult Segher :). Unless I'm completely mistaken, usually the loader initializes r2, so in this case the asm code needs to set it up properly.
Depends what you call "loader". Usually your crt1 equivalent sets GPR2. It is probably a good idea to set it in all exception handlers as well (if they want to call C code, or need it otherwise).
But set it to what value? :)
This is what Linux does:
arch/powerpc/kernel/head_64.S:
/* * This puts the TOC pointer into r2, offset by 0x8000 (as expected * by the toolchain). It computes the correct value for wherever we * are running at the moment, using position-independent code. */ _GLOBAL(relative_toc) mflr r0 bcl 20,31,$+4 0: mflr r9 ld r2,(p_toc - 0b)(r9) add r2,r2,r9 mtlr r0 blr
p_toc: .llong __toc_start + 0x8000 - 0b
arch/powerpc/kernel/vmlinux.lds:
.got : AT(ADDR(.got) - (0xc000000000000000 -0x00000000)) { __toc_start = .; *(.got) *(.toc)
Maybe you can get away with default names somehow, not sure :).
Alex