Subject: PowerPC assembl question
To: None <port-powerpc@netbsd.org>
From: Emmanuel Dreyfus <p99dreyf@criens.u-psud.fr>
List: port-powerpc
Date: 01/17/2001 16:30:34
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

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

What went wrong?

-- 
Emmanuel Dreyfus.   
Il ne suffit pas de crier l'iMac, l'iMac! en sautant comme un cabri...
p99dreyf@criens.u-psud.fr