Blame sysdeps/sh/dl-trampoline.S

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