| /* PLT trampolines. SH version. |
| Copyright (C) 2005-2014 Free Software Foundation, Inc. |
| This file is part of the GNU C Library. |
| |
| The GNU C Library is free software; you can redistribute it and/or |
| modify it under the terms of the GNU Lesser General Public |
| License as published by the Free Software Foundation; either |
| version 2.1 of the License, or (at your option) any later version. |
| |
| The GNU C Library is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| Lesser General Public License for more details. |
| |
| You should have received a copy of the GNU Lesser General Public |
| License along with the GNU C Library; if not, see |
| <http://www.gnu.org/licenses/>. */ |
| |
| #include <sysdep.h> |
| |
| .text |
| .globl _dl_runtime_resolve |
| .type _dl_runtime_resolve, @function |
| cfi_startproc |
| .align 5 |
| _dl_runtime_resolve: |
| mov.l r2,@-r15 |
| cfi_adjust_cfa_offset (4) |
| mov.l r3,@-r15 |
| cfi_adjust_cfa_offset (4) |
| mov.l r4,@-r15 |
| cfi_adjust_cfa_offset (4) |
| mov.l r5,@-r15 |
| cfi_adjust_cfa_offset (4) |
| mov.l r6,@-r15 |
| cfi_adjust_cfa_offset (4) |
| mov.l r7,@-r15 |
| cfi_adjust_cfa_offset (4) |
| mov.l r12,@-r15 |
| cfi_adjust_cfa_offset (4) |
| sts.l macl,@-r15 |
| cfi_adjust_cfa_offset (4) |
| sts.l mach,@-r15 |
| cfi_adjust_cfa_offset (4) |
| movt r3 ! Save T flag. |
| mov.l r3,@-r15 |
| cfi_adjust_cfa_offset (4) |
| #ifdef HAVE_FPU |
| sts.l fpscr,@-r15 |
| cfi_adjust_cfa_offset (4) |
| mov #8,r3 |
| swap.w r3,r3 |
| lds r3,fpscr |
| fmov.s fr11,@-r15 |
| cfi_adjust_cfa_offset (4) |
| fmov.s fr10,@-r15 |
| cfi_adjust_cfa_offset (4) |
| fmov.s fr9,@-r15 |
| cfi_adjust_cfa_offset (4) |
| fmov.s fr8,@-r15 |
| cfi_adjust_cfa_offset (4) |
| fmov.s fr7,@-r15 |
| cfi_adjust_cfa_offset (4) |
| fmov.s fr6,@-r15 |
| cfi_adjust_cfa_offset (4) |
| fmov.s fr5,@-r15 |
| cfi_adjust_cfa_offset (4) |
| fmov.s fr4,@-r15 |
| cfi_adjust_cfa_offset (4) |
| #endif |
| sts.l pr,@-r15 |
| cfi_adjust_cfa_offset (4) |
| tst r0,r0 |
| bt 1f |
| mov r0,r2 |
| 1: |
| mov r0,r4 ! PLT type |
| mov r2,r5 ! link map address |
| #ifdef SHARED |
| mov.l 2f,r2 |
| mova 2f,r0 |
| add r0,r2 ! Get GOT address in r2 |
| mov.l 3f,r0 |
| add r2,r0 |
| #else |
| mov.l 3f,r0 |
| #endif |
| jsr @r0 ! Call resolver. |
| mov r1,r6 ! reloc offset |
| lds.l @r15+,pr ! Get register content back. |
| cfi_adjust_cfa_offset (-4) |
| #ifdef HAVE_FPU |
| fmov.s @r15+,fr4 |
| cfi_adjust_cfa_offset (-4) |
| fmov.s @r15+,fr5 |
| cfi_adjust_cfa_offset (-4) |
| fmov.s @r15+,fr6 |
| cfi_adjust_cfa_offset (-4) |
| fmov.s @r15+,fr7 |
| cfi_adjust_cfa_offset (-4) |
| fmov.s @r15+,fr8 |
| cfi_adjust_cfa_offset (-4) |
| fmov.s @r15+,fr9 |
| cfi_adjust_cfa_offset (-4) |
| fmov.s @r15+,fr10 |
| cfi_adjust_cfa_offset (-4) |
| fmov.s @r15+,fr11 |
| cfi_adjust_cfa_offset (-4) |
| lds.l @r15+,fpscr |
| cfi_adjust_cfa_offset (-4) |
| #endif |
| mov.l @r15+,r3 |
| cfi_adjust_cfa_offset (-4) |
| shal r3 ! Lode T flag. |
| lds.l @r15+,mach |
| cfi_adjust_cfa_offset (-4) |
| lds.l @r15+,macl |
| cfi_adjust_cfa_offset (-4) |
| mov.l @r15+,r12 |
| cfi_adjust_cfa_offset (-4) |
| mov.l @r15+,r7 |
| cfi_adjust_cfa_offset (-4) |
| mov.l @r15+,r6 |
| cfi_adjust_cfa_offset (-4) |
| mov.l @r15+,r5 |
| cfi_adjust_cfa_offset (-4) |
| mov.l @r15+,r4 |
| cfi_adjust_cfa_offset (-4) |
| mov.l @r15+,r3 |
| cfi_adjust_cfa_offset (-4) |
| jmp @r0 ! Jump to function address. |
| mov.l @r15+,r2 |
| cfi_adjust_cfa_offset (-4) |
| .align 2 |
| #ifdef SHARED |
| 2: .long _GLOBAL_OFFSET_TABLE_ |
| 3: .long _dl_fixup@GOTOFF |
| #else |
| 3: .long _dl_fixup |
| #endif |
| cfi_endproc |
| .size _dl_runtime_resolve, .-_dl_runtime_resolve |
| |
| |
| .globl _dl_runtime_profile |
| .type _dl_runtime_profile,@function |
| cfi_startproc |
| .align 5 |
| _dl_runtime_profile: |
| mov.l r12,@-r15 |
| cfi_adjust_cfa_offset (4) |
| #ifdef HAVE_FPU |
| sts.l fpscr,@-r15 |
| cfi_adjust_cfa_offset (4) |
| mov #8,r12 |
| swap.w r12,r12 |
| lds r12,fpscr |
| fmov.s fr11,@-r15 |
| cfi_adjust_cfa_offset (4) |
| fmov.s fr10,@-r15 |
| cfi_adjust_cfa_offset (4) |
| fmov.s fr9,@-r15 |
| cfi_adjust_cfa_offset (4) |
| fmov.s fr8,@-r15 |
| cfi_adjust_cfa_offset (4) |
| fmov.s fr7,@-r15 |
| cfi_adjust_cfa_offset (4) |
| fmov.s fr6,@-r15 |
| cfi_adjust_cfa_offset (4) |
| fmov.s fr5,@-r15 |
| cfi_adjust_cfa_offset (4) |
| fmov.s fr4,@-r15 |
| cfi_adjust_cfa_offset (4) |
| #else |
| add #-36,r15 |
| cfi_adjust_cfa_offset (36) |
| #endif |
| mov.l r7,@-r15 |
| cfi_adjust_cfa_offset (4) |
| mov.l r6,@-r15 |
| cfi_adjust_cfa_offset (4) |
| mov.l r5,@-r15 |
| cfi_adjust_cfa_offset (4) |
| mov.l r4,@-r15 |
| cfi_adjust_cfa_offset (4) |
| mov.l r3,@-r15 |
| cfi_adjust_cfa_offset (4) |
| mov.l r2,@-r15 |
| cfi_adjust_cfa_offset (4) |
| sts.l macl,@-r15 |
| cfi_adjust_cfa_offset (4) |
| sts.l mach,@-r15 |
| cfi_adjust_cfa_offset (4) |
| movt r3 ! Save T flag. |
| mov.l r3,@-r15 |
| cfi_adjust_cfa_offset (4) |
| sts.l pr,@-r15 |
| cfi_adjust_cfa_offset (4) |
| tst r0,r0 |
| bt 1f |
| mov r0,r2 |
| 1: |
| mov r0,r4 ! PLT type |
| mov r2,r5 ! link map address |
| sts pr,r7 ! return address |
| add #-24,r15 |
| cfi_adjust_cfa_offset (24) |
| mov #40,r0 |
| add r15,r0 |
| mov.l r0,@r15 ! Address of the register structure |
| mov #-1,r0 |
| mov.l r0,@(8,r15) |
| mov #8,r0 |
| add r15,r0 |
| mov.l r0,@(4,r15) |
| mov.l r5,@(12,r15) |
| mov.l r1,@(16,r15) |
| #ifdef SHARED |
| mov.l 2f,r12 |
| mova 2f,r0 |
| add r0,r12 ! Get GOT address in r12 |
| mov.l 3f,r0 |
| add r12,r0 |
| #else |
| mov.l 3f,r0 |
| #endif |
| jsr @r0 ! Call resolver. |
| mov r1,r6 ! reloc offset |
| mov.l @(8,r15),r1 |
| cmp/pz r1 |
| bt 4f |
| add #24,r15 |
| cfi_adjust_cfa_offset (-24) |
| lds.l @r15+,pr ! Get register content back. |
| cfi_adjust_cfa_offset (-4) |
| mov.l @r15+,r3 |
| cfi_adjust_cfa_offset (-4) |
| shal r3 ! Lode T flag. |
| lds.l @r15+,mach |
| cfi_adjust_cfa_offset (-4) |
| lds.l @r15+,macl |
| cfi_adjust_cfa_offset (-4) |
| mov.l @r15+,r2 |
| cfi_adjust_cfa_offset (-4) |
| mov.l @r15+,r3 |
| cfi_adjust_cfa_offset (-4) |
| mov.l @r15+,r4 |
| cfi_adjust_cfa_offset (-4) |
| mov.l @r15+,r5 |
| cfi_adjust_cfa_offset (-4) |
| mov.l @r15+,r6 |
| cfi_adjust_cfa_offset (-4) |
| mov.l @r15+,r7 |
| cfi_adjust_cfa_offset (-4) |
| #ifdef HAVE_FPU |
| fmov.s @r15+,fr4 |
| cfi_adjust_cfa_offset (-4) |
| fmov.s @r15+,fr5 |
| cfi_adjust_cfa_offset (-4) |
| fmov.s @r15+,fr6 |
| cfi_adjust_cfa_offset (-4) |
| fmov.s @r15+,fr7 |
| cfi_adjust_cfa_offset (-4) |
| fmov.s @r15+,fr8 |
| cfi_adjust_cfa_offset (-4) |
| fmov.s @r15+,fr9 |
| cfi_adjust_cfa_offset (-4) |
| fmov.s @r15+,fr10 |
| cfi_adjust_cfa_offset (-4) |
| fmov.s @r15+,fr11 |
| cfi_adjust_cfa_offset (-4) |
| lds.l @r15+,fpscr |
| cfi_adjust_cfa_offset (-4) |
| #else |
| add #36,r15 |
| cfi_adjust_cfa_offset (-36) |
| #endif |
| jmp @r0 ! Jump to function address. |
| mov.l @r15+,r12 |
| cfi_adjust_cfa_offset (-4) |
| .align 2 |
| #ifdef SHARED |
| 2: .long _GLOBAL_OFFSET_TABLE_ |
| 3: .long _dl_profile_fixup@GOTOFF |
| #else |
| 3: .long _dl_profile_fixup |
| #endif |
| |
| cfi_adjust_cfa_offset (104) |
| 4: |
| mov #104,r3 |
| add r15,r3 ! Original stack |
| mov.l r8,@(20,r15) |
| cfi_rel_offset (r8, 20) |
| mov r15,r8 |
| sub r1,r15 |
| shlr2 r15 |
| shll2 r15 |
| mov r15,r4 |
| shlr2 r1 |
| tst r1,r1 |
| 5: |
| bt/s 6f |
| dt r1 |
| mov.l @r3+,r2 |
| mov.l r2,@r4 |
| bra 5b |
| add #4,r4 |
| 6: |
| mov.l @r8,r12 |
| mov.l @r12+,r2 |
| mov.l @r12+,r3 |
| mov.l @r12+,r4 |
| mov.l @r12+,r5 |
| mov.l @r12+,r6 |
| mov.l @r12+,r7 |
| #ifdef HAVE_FPU |
| fmov.s @r12+,fr4 |
| fmov.s @r12+,fr5 |
| fmov.s @r12+,fr6 |
| fmov.s @r12+,fr7 |
| fmov.s @r12+,fr8 |
| fmov.s @r12+,fr9 |
| fmov.s @r12+,fr10 |
| fmov.s @r12+,fr11 |
| lds.l @r12+,fpscr |
| #else |
| add #36,r2 |
| #endif |
| jsr @r0 ! Call function. |
| nop |
| mov r8,r15 |
| mov.l @(12,r15),r4 ! link map address |
| mov.l @(16,r15),r5 ! reloc offset |
| mov.l @r15,r6 ! input registers |
| #ifdef HAVE_FPU |
| mov #16,r8 |
| add r15,r8 |
| fmov.s fr1,@-r8 |
| fmov.s fr0,@-r8 |
| #else |
| mov #8,r8 |
| add r15,r8 |
| #endif |
| mov.l r1,@-r8 |
| mov.l r0,@-r8 |
| mov.l @(20,r15),r8 |
| cfi_restore (r8) |
| #ifdef SHARED |
| mov.l 7f,r12 |
| mova 7f,r0 |
| add r0,r12 ! Get GOT address in r12 |
| mov.l 8f,r0 |
| add r12,r0 |
| #else |
| mov.l 8f,r0 |
| #endif |
| jsr @r0 |
| mov r15,r7 ! output registers |
| mov.l @r15+,r0 |
| cfi_adjust_cfa_offset (-4) |
| mov.l @r15+,r1 |
| cfi_adjust_cfa_offset (-4) |
| #ifdef HAVE_FPU |
| fmov.s @r15+,fr0 |
| cfi_adjust_cfa_offset (-4) |
| fmov.s @r15+,fr1 |
| cfi_adjust_cfa_offset (-4) |
| add #8,r15 |
| cfi_adjust_cfa_offset (-8) |
| #else |
| add #16,r15 |
| cfi_adjust_cfa_offset (-16) |
| #endif |
| lds.l @r15+,pr ! Get register content back. |
| cfi_adjust_cfa_offset (-4) |
| mov.l @r15+,r3 |
| cfi_adjust_cfa_offset (-4) |
| shal r3 ! Lode T flag. |
| lds.l @r15+,mach |
| cfi_adjust_cfa_offset (-4) |
| lds.l @r15+,macl |
| cfi_adjust_cfa_offset (-4) |
| mov.l @r15+,r2 |
| cfi_adjust_cfa_offset (-4) |
| mov.l @r15+,r3 |
| cfi_adjust_cfa_offset (-4) |
| mov.l @r15+,r4 |
| cfi_adjust_cfa_offset (-4) |
| mov.l @r15+,r5 |
| cfi_adjust_cfa_offset (-4) |
| mov.l @r15+,r6 |
| cfi_adjust_cfa_offset (-4) |
| mov.l @r15+,r7 |
| cfi_adjust_cfa_offset (-4) |
| #ifdef HAVE_FPU |
| fmov.s @r15+,fr4 |
| cfi_adjust_cfa_offset (-4) |
| fmov.s @r15+,fr5 |
| cfi_adjust_cfa_offset (-4) |
| fmov.s @r15+,fr6 |
| cfi_adjust_cfa_offset (-4) |
| fmov.s @r15+,fr7 |
| cfi_adjust_cfa_offset (-4) |
| fmov.s @r15+,fr8 |
| cfi_adjust_cfa_offset (-4) |
| fmov.s @r15+,fr9 |
| cfi_adjust_cfa_offset (-4) |
| fmov.s @r15+,fr10 |
| cfi_adjust_cfa_offset (-4) |
| fmov.s @r15+,fr11 |
| cfi_adjust_cfa_offset (-4) |
| lds.l @r15+,fpscr |
| cfi_adjust_cfa_offset (-4) |
| #else |
| add #36,r15 |
| cfi_adjust_cfa_offset (-36) |
| #endif |
| rts ! Jump to function address. |
| mov.l @r15+,r12 |
| cfi_adjust_cfa_offset (-4) |
| cfi_endproc |
| .align 2 |
| #ifdef SHARED |
| 7: .long _GLOBAL_OFFSET_TABLE_ |
| 8: .long _dl_call_pltexit@GOTOFF |
| #else |
| 8: .long _dl_call_pltexit |
| #endif |
| .size _dl_runtime_profile, .-_dl_runtime_profile |