Blame sysdeps/powerpc/powerpc32/dl-trampoline.S

Packit 6c4009
/* PLT trampolines.  PPC32 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
	.section ".text"
Packit 6c4009
	.align 2
Packit 6c4009
	.globl _dl_runtime_resolve
Packit 6c4009
	.type _dl_runtime_resolve,@function
Packit 6c4009
_dl_runtime_resolve:
Packit 6c4009
	cfi_startproc
Packit 6c4009
 # We need to save the registers used to pass parameters, and register 0,
Packit 6c4009
 # which is used by _mcount; the registers are saved in a stack frame.
Packit 6c4009
	stwu r1,-64(r1)
Packit 6c4009
	cfi_adjust_cfa_offset (64)
Packit 6c4009
	stw r0,12(r1)
Packit 6c4009
	stw r3,16(r1)
Packit 6c4009
	stw r4,20(r1)
Packit 6c4009
 # The code that calls this has put parameters for `fixup' in r12 and r11.
Packit 6c4009
	mr r3,r12
Packit 6c4009
	stw r5,24(r1)
Packit 6c4009
	mr r4,r11
Packit 6c4009
	stw r6,28(r1)
Packit 6c4009
	mflr r0
Packit 6c4009
 # We also need to save some of the condition register fields
Packit 6c4009
	stw r7,32(r1)
Packit 6c4009
 # Don't clobber the caller's LRSAVE, it is needed by _mcount.
Packit 6c4009
	stw r0,48(r1)
Packit 6c4009
 	cfi_offset (lr, -16)
Packit 6c4009
	stw r8,36(r1)
Packit 6c4009
	mfcr r0
Packit 6c4009
	stw r9,40(r1)
Packit 6c4009
	stw r10,44(r1)
Packit 6c4009
	stw r0,8(r1)
Packit 6c4009
	bl _dl_fixup@local
Packit 6c4009
 # 'fixup' returns the address we want to branch to.
Packit 6c4009
	mtctr r3
Packit 6c4009
 # Put the registers back...
Packit 6c4009
	lwz r0,48(r1)
Packit 6c4009
	lwz r10,44(r1)
Packit 6c4009
	lwz r9,40(r1)
Packit 6c4009
	mtlr r0
Packit 6c4009
	lwz r8,36(r1)
Packit 6c4009
	lwz r0,8(r1)
Packit 6c4009
	lwz r7,32(r1)
Packit 6c4009
	lwz r6,28(r1)
Packit 6c4009
	mtcrf 0xFF,r0
Packit 6c4009
	lwz r5,24(r1)
Packit 6c4009
	lwz r4,20(r1)
Packit 6c4009
	lwz r3,16(r1)
Packit 6c4009
	lwz r0,12(r1)
Packit 6c4009
 # ...unwind the stack frame, and jump to the PLT entry we updated.
Packit 6c4009
	addi r1,r1,64
Packit 6c4009
	bctr
Packit 6c4009
	cfi_endproc
Packit 6c4009
	.size	 _dl_runtime_resolve,.-_dl_runtime_resolve
Packit 6c4009
Packit 6c4009
#ifndef PROF
Packit 6c4009
	.align 2
Packit 6c4009
	.globl _dl_prof_resolve
Packit 6c4009
	.type _dl_prof_resolve,@function
Packit 6c4009
_dl_prof_resolve:
Packit 6c4009
	cfi_startproc
Packit 6c4009
 # We need to save the registers used to pass parameters, and register 0,
Packit 6c4009
 # which is used by _mcount; the registers are saved in a stack frame.
Packit 6c4009
	stwu r1,-320(r1)
Packit 6c4009
	cfi_adjust_cfa_offset (320)
Packit 6c4009
	/* Stack layout:
Packit 6c4009
Packit 6c4009
	  +312   stackframe
Packit 6c4009
	  +308   lr
Packit 6c4009
	  +304   r1
Packit 6c4009
	  +288   v12
Packit 6c4009
	  +272   v11
Packit 6c4009
	  +256   v10
Packit 6c4009
	  +240   v9
Packit 6c4009
	  +224   v8
Packit 6c4009
	  +208   v7
Packit 6c4009
	  +192   v6
Packit 6c4009
	  +176   v5
Packit 6c4009
	  +160   v4
Packit 6c4009
	  +144   v3
Packit 6c4009
	  +128   v2
Packit 6c4009
	  +112   v1
Packit 6c4009
	  +104   fp8
Packit 6c4009
	  +96    fp7
Packit 6c4009
	  +88    fp6
Packit 6c4009
	  +80    fp5
Packit 6c4009
	  +72    fp4
Packit 6c4009
	  +64    fp3
Packit 6c4009
	  +56    fp2
Packit 6c4009
	  +48    fp1
Packit 6c4009
	  +44    r10
Packit 6c4009
	  +40    r9
Packit 6c4009
	  +36    r8
Packit 6c4009
	  +32    r7
Packit 6c4009
	  +28    r6
Packit 6c4009
	  +24    r5
Packit 6c4009
	  +20    r4
Packit 6c4009
	  +16    r3
Packit 6c4009
	  +12    r0
Packit 6c4009
	  +8     cr
Packit 6c4009
	   r1    link
Packit 6c4009
	*/
Packit 6c4009
        stw r0,12(r1)
Packit 6c4009
	stw r3,16(r1)
Packit 6c4009
	stw r4,20(r1)
Packit 6c4009
 # The code that calls this has put parameters for `fixup' in r12 and r11.
Packit 6c4009
	mr r3,r12
Packit 6c4009
	stw r5,24(r1)
Packit 6c4009
	mr r4,r11
Packit 6c4009
	stw r6,28(r1)
Packit 6c4009
	mflr r5
Packit 6c4009
 # We also need to save some of the condition register fields.
Packit 6c4009
	stw r7,32(r1)
Packit 6c4009
 # Don't clobber the caller's LRSAVE, it is needed by _mcount.
Packit 6c4009
	stw r5,308(r1)
Packit 6c4009
	cfi_offset (lr, -12)
Packit 6c4009
	stw r8,36(r1)
Packit 6c4009
	mfcr r0
Packit 6c4009
	stw r9,40(r1)
Packit 6c4009
	stw r10,44(r1)
Packit 6c4009
	stw r0,8(r1)
Packit 6c4009
#ifndef __NO_FPRS__
Packit 6c4009
 # Save the floating point registers
Packit 6c4009
	stfd fp1,48(r1)
Packit 6c4009
	stfd fp2,56(r1)
Packit 6c4009
	stfd fp3,64(r1)
Packit 6c4009
	stfd fp4,72(r1)
Packit 6c4009
	stfd fp5,80(r1)
Packit 6c4009
	stfd fp6,88(r1)
Packit 6c4009
	stfd fp7,96(r1)
Packit 6c4009
	stfd fp8,104(r1)
Packit 6c4009
#endif
Packit 6c4009
 # XXX TODO: store vmx registers
Packit 6c4009
 # Load the extra parameters.
Packit 6c4009
	addi r6,r1,16
Packit 6c4009
	addi r7,r1,312
Packit 6c4009
	li r0,-1
Packit 6c4009
	stw r0,0(r7)
Packit 6c4009
	bl _dl_profile_fixup@local
Packit 6c4009
 # 'fixup' returns the address we want to branch to.
Packit 6c4009
	mtctr r3
Packit 6c4009
 # Put the registers back...
Packit 6c4009
	lwz r0,308(r1)
Packit 6c4009
	lwz r10,44(r1)
Packit 6c4009
	lwz r9,40(r1)
Packit 6c4009
	mtlr r0
Packit 6c4009
	lwz r8,36(r1)
Packit 6c4009
	lwz r0,8(r1)
Packit 6c4009
	lwz r7,32(r1)
Packit 6c4009
	lwz r6,28(r1)
Packit 6c4009
	mtcrf 0xFF,r0
Packit 6c4009
	lwz r5,24(r1)
Packit 6c4009
	lwz r4,20(r1)
Packit 6c4009
	lwz r3,16(r1)
Packit 6c4009
        lwz r0,12(r1)
Packit 6c4009
#ifndef __NO_FPRS__
Packit 6c4009
 # Load the floating point registers.
Packit 6c4009
	lfd fp1,48(r1)
Packit 6c4009
	lfd fp2,56(r1)
Packit 6c4009
	lfd fp3,64(r1)
Packit 6c4009
	lfd fp4,72(r1)
Packit 6c4009
	lfd fp5,80(r1)
Packit 6c4009
	lfd fp6,88(r1)
Packit 6c4009
	lfd fp7,96(r1)
Packit 6c4009
	lfd fp8,104(r1)
Packit 6c4009
#endif
Packit 6c4009
 # ...unwind the stack frame, and jump to the PLT entry we updated.
Packit 6c4009
	addi r1,r1,320
Packit 6c4009
	bctr
Packit 6c4009
	cfi_endproc
Packit 6c4009
	.size	 _dl_prof_resolve,.-_dl_prof_resolve
Packit 6c4009
#endif