| /* PLT trampolines.  m68k 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> | 
 |  | 
 | #if !defined (__mcoldfire__) | 
 | # define FMOVE		fmove.x | 
 | # define FPSPACE	12 | 
 | #elif defined (__mcffpu__) | 
 | # define FMOVE		fmove.d | 
 | # define FPSPACE	8 | 
 | #else | 
 | # define FPSPACE	0 | 
 | #endif | 
 |  | 
 | 	.text | 
 | 	.globl _dl_runtime_resolve | 
 | 	.type _dl_runtime_resolve, @function | 
 | _dl_runtime_resolve: | 
 | 	cfi_startproc | 
 | 	cfi_adjust_cfa_offset (8) | 
 | 	| Save %a0 (struct return address) and %a1. | 
 | 	move.l %a0, -(%sp) | 
 | 	cfi_adjust_cfa_offset (4) | 
 | 	move.l %a1, -(%sp) | 
 | 	cfi_adjust_cfa_offset (4) | 
 | 	| Call the real address resolver. | 
 | 	jbsr _dl_fixup | 
 | 	| Restore register %a0 and %a1. | 
 | 	move.l (%sp)+, %a1 | 
 | 	cfi_adjust_cfa_offset (-4) | 
 | 	move.l (%sp)+, %a0 | 
 | 	cfi_adjust_cfa_offset (-4) | 
 | 	| Pop parameters | 
 | 	addq.l #8, %sp | 
 | 	cfi_adjust_cfa_offset (-8) | 
 | 	| Call real function. | 
 | #ifdef __mcoldfire__ | 
 | 	move.l %d0,-(%sp) | 
 | 	cfi_adjust_cfa_offset (4) | 
 | 	rts | 
 | #else | 
 | 	jmp (%d0) | 
 | #endif | 
 | 	cfi_endproc | 
 | 	.size _dl_runtime_resolve, . - _dl_runtime_resolve | 
 |  | 
 | 	.text | 
 | 	.globl _dl_runtime_profile | 
 | 	.type _dl_runtime_profile, @function | 
 | _dl_runtime_profile: | 
 | 	cfi_startproc | 
 | 	cfi_adjust_cfa_offset (8) | 
 | 	pea 8(%sp) | 
 | 	cfi_adjust_cfa_offset (4) | 
 | 	move.l %a1, -(%sp) | 
 | 	cfi_adjust_cfa_offset (4) | 
 | 	move.l %a0, -(%sp) | 
 | 	cfi_adjust_cfa_offset (4) | 
 | 	pea -1.w | 
 | 	cfi_adjust_cfa_offset (4) | 
 | 	| Push parameters for _dl_profile_fixup | 
 | 	pea (%sp) | 
 | 	cfi_adjust_cfa_offset (4) | 
 | 	pea 8(%sp) | 
 | 	cfi_adjust_cfa_offset (4) | 
 | 	move.l 32(%sp), -(%sp) | 
 | 	cfi_adjust_cfa_offset (4) | 
 | 	move.l 32(%sp), -(%sp) | 
 | 	cfi_adjust_cfa_offset (4) | 
 | 	move.l 32(%sp), -(%sp) | 
 | 	cfi_adjust_cfa_offset (4) | 
 | 	subq.l #8, %sp | 
 | 	cfi_adjust_cfa_offset (8) | 
 | 	| Call the real address resolver. | 
 | 	jbsr _dl_profile_fixup | 
 | 	| Pop parameters | 
 | 	lea 28(%sp), %sp | 
 | 	cfi_adjust_cfa_offset (-28) | 
 | 	move.l (%sp), %d1 | 
 | 	jpl 1f | 
 | 	addq.l #4, %sp | 
 | 	cfi_adjust_cfa_offset (-4) | 
 | 	| Restore register %a0 and %a1. | 
 | 	move.l (%sp)+, %a0 | 
 | 	cfi_adjust_cfa_offset (-4) | 
 | 	move.l (%sp)+, %a1 | 
 | 	cfi_adjust_cfa_offset (-4) | 
 | 	lea 12(%sp), %sp | 
 | 	cfi_adjust_cfa_offset (-12) | 
 | 	| Call real function. | 
 | #ifdef __mcoldfire__ | 
 | 	move.l %d0,-(%sp) | 
 | 	cfi_adjust_cfa_offset (4) | 
 | 	rts | 
 | #else | 
 | 	jmp (%d0) | 
 | #endif | 
 |  | 
 | 	/* | 
 | 	    +24     return address | 
 | 	    +20     PLT1 | 
 | 	    +16     PLT2 | 
 | 	    +12     %sp | 
 | 	    +8      %a1 | 
 | 	    +4      %a0 | 
 | 	   %sp      free | 
 | 	*/ | 
 | #ifdef __mcoldfire__ | 
 | 	cfi_adjust_cfa_offset (20) | 
 | #else | 
 | 	cfi_adjust_cfa_offset (24) | 
 | #endif | 
 | 1:	move.l %a2, (%sp) | 
 | 	cfi_rel_offset (%a2, 0) | 
 | 	move.l %sp, %a2 | 
 | 	move.l %sp, %a0 | 
 | 	lea 28(%sp), %a1 | 
 | 	| Round framesize up to longword alignment | 
 | 	addq.l #3, %d1 | 
 | 	and.l #-3, %d1 | 
 | 	sub.l %d1, %a0 | 
 | 	move.l %a0, %sp | 
 | 	cfi_def_cfa_register (%a2) | 
 | #ifdef __mcoldfire__ | 
 | 	tst.l %d1 | 
 | 	beq 2f | 
 | 1:	move.l (%a1)+, (%a0)+ | 
 | 	subq.l #4,%d1 | 
 | 	bne 1b | 
 | 2: | 
 | #else | 
 | 	lsr.l #2,%d1 | 
 | 	jra 2f | 
 | 1:	move.l (%a1)+, (%a0)+ | 
 | 2:	dbra %d1,1b | 
 | #endif | 
 | 	/* | 
 | 	   %a2+24  return address | 
 | 	   %a2+20  PLT1 | 
 | 	   %a2+16  PLT2 | 
 | 	   %a2+12  %sp | 
 | 	   %a2+8   %a1 | 
 | 	   %a2+4   %a0 | 
 | 	   %a2     %a2 | 
 | 	   %sp     copied stack frame | 
 | 	*/ | 
 |  | 
 | 	move.l 4(%a2), %a0 | 
 | 	move.l 8(%a2), %a1 | 
 | #ifdef __mcoldfire__ | 
 | 	pea 2f(%pc) | 
 | 	move.l %d0,-(%sp) | 
 | 	rts | 
 | 2: | 
 | #else | 
 | 	jsr (%d0) | 
 | #endif | 
 | 	move.l %a2, %sp | 
 | 	cfi_def_cfa_register (%sp) | 
 | 	move.l (%sp)+, %a2 | 
 | 	cfi_adjust_cfa_offset (4) | 
 | 	cfi_restore (%a2) | 
 | 	/* | 
 | 	    +20     return address | 
 | 	    +16     PLT1 | 
 | 	    +12     PLT2 | 
 | 	    +8      %sp | 
 | 	    +4      %a1 | 
 | 	   %sp      %a0 | 
 | 	*/ | 
 | #ifdef FMOVE | 
 | 	FMOVE %fp0, -(%sp) | 
 | 	cfi_adjust_cfa_offset (FPSPACE) | 
 | #endif | 
 | 	move.l %a0, -(%sp) | 
 | 	cfi_adjust_cfa_offset (4) | 
 | 	move.l %d1, -(%sp) | 
 | 	cfi_adjust_cfa_offset (4) | 
 | 	move.l %d0, -(%sp) | 
 | 	cfi_adjust_cfa_offset (4) | 
 | 	pea (%sp) | 
 | 	cfi_adjust_cfa_offset (4) | 
 | 	pea (16+FPSPACE)(%sp) | 
 | 	cfi_adjust_cfa_offset (4) | 
 | 	move.l (32+FPSPACE)(%sp), -(%sp) | 
 | 	cfi_adjust_cfa_offset (4) | 
 | 	move.l (32+FPSPACE)(%sp), -(%sp) | 
 | 	cfi_adjust_cfa_offset (4) | 
 | 	jbsr _dl_call_pltexit | 
 | 	lea 16(%sp), %sp | 
 | 	cfi_adjust_cfa_offset (-16) | 
 | 	move.l (%sp)+, %d0 | 
 | 	cfi_adjust_cfa_offset (-4) | 
 | 	move.l (%sp)+, %d1 | 
 | 	cfi_adjust_cfa_offset (-4) | 
 | 	move.l (%sp)+, %a0 | 
 | 	cfi_adjust_cfa_offset (-4) | 
 | #ifdef FMOVE | 
 | 	FMOVE (%sp)+, %fp0 | 
 | 	cfi_adjust_cfa_offset (-FPSPACE) | 
 | #endif | 
 | 	lea 20(%sp), %sp | 
 | 	cfi_adjust_cfa_offset (-20) | 
 | 	rts | 
 | 	cfi_endproc | 
 | 	.size _dl_runtime_profile, . - _dl_runtime_profile |