12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- /*
- * Copyright (C) 2017 Hangzhou C-SKY Microsystems co.,ltd.
- *
- * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB
- * in this tarball.
- */
- /*
- * This function is not called directly. It is jumped when attempting to use a
- * symbol that has not yet been resolved.
- *
- *.plt*:
- * subi r0, 32
- * stw r2, (r0, 0)
- * stw r3, (r0, 4)
- * lrw r3, #offset
- * ldw r2, (gb, 8)
- * jmp r2
- */
- .import _dl_linux_resolver
- .text
- .globl _dl_linux_resolve
- .type _dl_linux_resolve,@function
- _dl_linux_resolve:
- #ifdef __CSKYABIV1__
- stw r4, (r0, 8)
- stw r5, (r0, 12)
- stw r6, (r0, 16)
- stw r7, (r0, 20)
- stw r15,(r0, 24)
- # load the ID of this module
- ldw r2, (gb, 4)
- # r2 = id, r3 = offset(do it in plt*)
- #ifdef __PIC__
- # get global offset table address_
- bsr .L2
- .L2:
- lrw r7, .L2@GOTPC
- add r7, r15
- # get the address of function (_dl_linux_resolver) in got table
- lrw r6, _dl_linux_resolver@GOT
- add r6, r7
- ldw r5, (r6, 0)
- jsr r5
- #else /* no __PIC__ */
- jsri _dl_linux_resolver /* need modify */
- #endif
- # Return from _dl_linux_resolver, the address of function is in r2
- mov r1, r2
- # Restore the registers
- ldw r2, (r0, 0)
- ldw r3, (r0, 4)
- ldw r4, (r0, 8)
- ldw r5, (r0, 12)
- ldw r6, (r0, 16)
- ldw r7, (r0, 20)
- ldw r15,(r0, 24)
- # Restore the r0, because r0 is subtracted in PLT table
- addi r0, 32
- # The address of function is in r1, call the function without saving pc
- jmp r1
- #else /* __CSKYABIV1__ */
- subi sp, 20
- stm a0-a3, (sp)
- stw lr, (sp, 16)
- # a0 = id, a1 = offset(do it in plt*)
- ldw a0, (gb, 4)
- mov a1, t1
- bsr _dl_linux_resolver
- mov t0, a0
- ldw lr, (sp, 16)
- ldm a0-a3, (sp)
- addi sp, 20
- jmp t0
- #endif
|