|  | /* PLT trampolines.  SH version. | 
|  | Copyright (C) 2005-2016 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 |