OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [uClibc/] [ldso/] [ldso/] [powerpc/] [resolve.S] - Rev 1765

Compare with Previous | Blame | View Log

/*
 * Stolen from glibc-2.2.2 by David Schleef <ds@schleef.org>
 */

.text
.align 4

.globl _dl_linux_resolver

.globl _dl_linux_resolve
.type   _dl_linux_resolve,@function

_dl_linux_resolve:
// We need to save the registers used to pass parameters, and register 0,
// which is used by _mcount; the registers are saved in a stack frame.
        stwu 1,-64(1)
        stw 0,12(1)
        stw 3,16(1)
        stw 4,20(1)
// The code that calls this has put parameters for 'fixup' in r12 and r11.
        mr 3,12
        stw 5,24(1)
        mr 4,11
        stw 6,28(1)
        mflr 0
// We also need to save some of the condition register fields.
        stw 7,32(1)
        stw 0,48(1)
        stw 8,36(1)
        mfcr 0
        stw 9,40(1)
        stw 10,44(1)
        stw 0,8(1)
        bl _dl_linux_resolver@local
// 'fixup' returns the address we want to branch to.
        mtctr 3
// Put the registers back...
        lwz 0,48(1)
        lwz 10,44(1)
        lwz 9,40(1)
        mtlr 0
        lwz 8,36(1)
        lwz 0,8(1)
        lwz 7,32(1)
        lwz 6,28(1)
        mtcrf 0xFF,0
        lwz 5,24(1)
        lwz 4,20(1)
        lwz 3,16(1)
        lwz 0,12(1)
// ...unwind the stack frame, and jump to the PLT entry we updated.
        addi 1,1,64
        bctr

.LFE2:
        .size _dl_linux_resolve,.LFE2-_dl_linux_resolve

#if 0

        pusha                           /* preserve all regs */
        lea     0x20(%esp),%eax         /* eax = tpnt and reloc_entry params */
        pushl   4(%eax)                 /* push copy of reloc_entry param */
        pushl   (%eax)                  /* push copy of tpnt param */
                                         
#ifdef __PIC__
        call    .L24
.L24:
        popl    %ebx
        addl    $_GLOBAL_OFFSET_TABLE_+[.-.L24],%ebx
        movl _dl_linux_resolver@GOT(%ebx),%ebx  /* eax = resolved func */
        call *%ebx
#else
        call _dl_linux_resolver
#endif
        movl    %eax,0x28(%esp)         /* store func addr over original
                                         * tpnt param */
        addl    $0x8,%esp               /* remove copy parameters */
        popa                            /* restore regs */
        ret     $4                      /* jump to func removing original
                                         * reloc_entry param from stack */
#endif

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.