Port-powerpc archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: PowerPC assembl question
Hi,
> Well, here is my piece of code:
>
> .globl _C_LABEL(linux_execcode_start)
> .globl _C_LABEL(linux_execcode_end)
> .globl _C_LABEL(linux_execcode_target)
> _C_LABEL(linux_execcode_start):
> addi 1,1,0x10
> lis 11, _C_LABEL(linux_execcode_target)@ha
> lwz 12, _C_LABEL(linux_execcode_target)@l(11)
> mtctr 12
> bctr
> _C_LABEL(linux_execcode_target):
> .long 0 /* Setup at run time by kernel */
> _C_LABEL(linux_execcode_end):
>
>
> When I try to run it, I get a SIGSEGV. Disassembling in gdb produces
> this:
> (gdb) x/10xi 0x7fffe930
> 0x7fffe930: addi r1,r1,16
> 0x7fffe934: lis r11,46
> 0x7fffe938: lwz r12,-1664(r11)
> 0x7fffe93c: mtctr r12
> 0x7fffe940: bctr
> 0x7fffe944: .long 0x1800514
Hmm, I'm not sure what you are trying to do here. However, from
the type of failure, I assume that this code fragment gets copied to
its final location from somewhere else (either by the kernel, or ld.so
or ...). How did you find the 0x7fffe930 anyway?
Your problem is that the code contains an absolute reference to the
linux_execcode_target label. Since this reference isn't relocated,
it points to the address where the code was linked at, not its final
destination. That's why it fails.
> It's the lwz instruction that causes the SIGSEGV. Obviously, I did not
> get what I expected at link time. I think I should have had something
> like this:
> addi r1,r1,16
> lis r11,16(pc)
> lwz r12,0(r11)
> mtctr r12
> bctr
> .long 0x1800514
The equivalent of this in PowerPC assembly is something like this
(note untested):
_C_LABEL(linux_execcode_start):
addi 1,1,0x10
mflr 12
bl 1f
1:
mflr 11
mtlr 12
lwz 12, _C_LABEL(linux_execcode_target)-1b(11)
mtctr 12
bctr
_C_LABEL(linux_execcode_target):
.long 0 /* Setup at run time by kernel */
_C_LABEL(linux_execcode_end):
Hope it helps.
Ciao,
Wolfgang
--
ws%TooLs.DE@localhost Wolfgang Solfrank, TooLs GmbH +49-228-985800
Home |
Main Index |
Thread Index |
Old Index