mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-26 23:10:06 +00:00
431 lines
8.8 KiB
ArmAsm
431 lines
8.8 KiB
ArmAsm
/* PLT trampolines. SH version.
|
|
Copyright (C) 2005-2017 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
|