mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 20:40:05 +00:00
* sysdeps/alpha/dl-trampoline.S: New file. * sysdeps/alpha/dl-machine.h: Move PLT trampolines there. Use RESOLVE_MAP instead of RESOLVE to protect relocation code. (elf_machine_runtime_setup): Test for dl_profile non-null. (ARCH_LA_PLTENTER, ARCH_LA_PLTEXIT): New. * sysdeps/alpha/bits/link.h: New file. * sysdeps/generic/ldsodefs.h (La_alpha_regs, La_alpha_retval): New. (struct audit_ifaces): Add alpha entries. * elf/tst-auditmod1.c: Add alpha entries.
2005-01-22 Richard Henderson <rth@redhat.com> * sysdeps/alpha/dl-trampoline.S: New file. * sysdeps/alpha/dl-machine.h: Move PLT trampolines there. Use RESOLVE_MAP instead of RESOLVE to protect relocation code. (elf_machine_runtime_setup): Test for dl_profile non-null. (ARCH_LA_PLTENTER, ARCH_LA_PLTEXIT): New. * sysdeps/alpha/bits/link.h: New file. * sysdeps/generic/ldsodefs.h (La_alpha_regs, La_alpha_retval): New. (struct audit_ifaces): Add alpha entries. * elf/tst-auditmod1.c: Add alpha entries.
This commit is contained in:
parent
4bf1073d85
commit
57c6c64a3b
12
ChangeLog
12
ChangeLog
@ -1,3 +1,15 @@
|
||||
2005-01-22 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* sysdeps/alpha/dl-trampoline.S: New file.
|
||||
* sysdeps/alpha/dl-machine.h: Move PLT trampolines there.
|
||||
Use RESOLVE_MAP instead of RESOLVE to protect relocation code.
|
||||
(elf_machine_runtime_setup): Test for dl_profile non-null.
|
||||
(ARCH_LA_PLTENTER, ARCH_LA_PLTEXIT): New.
|
||||
* sysdeps/alpha/bits/link.h: New file.
|
||||
* sysdeps/generic/ldsodefs.h (La_alpha_regs, La_alpha_retval): New.
|
||||
(struct audit_ifaces): Add alpha entries.
|
||||
* elf/tst-auditmod1.c: Add alpha entries.
|
||||
|
||||
2005-01-22 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* sysdeps/ia64/dl-machine.h: Remove PLT trampolines here.
|
||||
|
@ -138,6 +138,12 @@ la_symbind64 (Elf64_Sym *sym, unsigned int ndx, uintptr_t *refcook,
|
||||
# define La_regs La_m68k_regs
|
||||
# define La_retval La_m68k_retval
|
||||
# define int_retval lrv_d0
|
||||
#elif defined __alpha__
|
||||
# define pltenter la_alpha_gnu_pltenter
|
||||
# define pltexit la_alpha_gnu_pltexit
|
||||
# define La_regs La_alpha_regs
|
||||
# define La_retval La_alpha_retval
|
||||
# define int_retval lrv_r0
|
||||
#else
|
||||
# error "architecture specific code needed"
|
||||
#endif
|
||||
|
69
sysdeps/alpha/bits/link.h
Normal file
69
sysdeps/alpha/bits/link.h
Normal file
@ -0,0 +1,69 @@
|
||||
/* Copyright (C) 2005 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#ifndef _LINK_H
|
||||
# error "Never include <bits/link.h> directly; use <link.h> instead."
|
||||
#endif
|
||||
|
||||
|
||||
/* Registers for entry into PLT on Alpha. */
|
||||
typedef struct La_alpha_regs
|
||||
{
|
||||
uint64_t lr_r26;
|
||||
uint64_t lr_sp;
|
||||
uint64_t lr_r16;
|
||||
uint64_t lr_r17;
|
||||
uint64_t lr_r18;
|
||||
uint64_t lr_r19;
|
||||
uint64_t lr_r20;
|
||||
uint64_t lr_r21;
|
||||
double lr_f16;
|
||||
double lr_f17;
|
||||
double lr_f18;
|
||||
double lr_f19;
|
||||
double lr_f20;
|
||||
double lr_f21;
|
||||
} La_alpha_regs;
|
||||
|
||||
/* Return values for calls from PLT on Alpha. */
|
||||
typedef struct La_alpha_retval
|
||||
{
|
||||
uint64_t lrv_r0;
|
||||
uint64_t lrv_r1;
|
||||
double lrv_f0;
|
||||
double lrv_f1;
|
||||
} La_alpha_retval;
|
||||
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
extern Elf64_Addr la_alpha_gnu_pltenter (Elf64_Sym *__sym, unsigned int __ndx,
|
||||
uintptr_t *__refcook,
|
||||
uintptr_t *__defcook,
|
||||
La_alpha_regs *__regs,
|
||||
unsigned int *__flags,
|
||||
const char *__symname,
|
||||
long int *__framesizep);
|
||||
extern unsigned int la_alpha_gnu_pltexit (Elf64_Sym *__sym, unsigned int __ndx,
|
||||
uintptr_t *__refcook,
|
||||
uintptr_t *__defcook,
|
||||
const La_alpha_regs *__inregs,
|
||||
La_alpha_retval *__outregs,
|
||||
const char *symname);
|
||||
|
||||
__END_DECLS
|
@ -108,19 +108,20 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
||||
plt = D_PTR (l, l_info[DT_PLTGOT]);
|
||||
|
||||
/* This function will be called to perform the relocation. */
|
||||
if (!profile)
|
||||
*(Elf64_Addr *)(plt + 16) = (Elf64_Addr) &_dl_runtime_resolve;
|
||||
else
|
||||
if (__builtin_expect (profile, 0))
|
||||
{
|
||||
*(Elf64_Addr *)(plt + 16) = (Elf64_Addr) &_dl_runtime_profile;
|
||||
|
||||
if (_dl_name_match_p (GLRO(dl_profile), l))
|
||||
if (GLRO(dl_profile) != NULL
|
||||
&& _dl_name_match_p (GLRO(dl_profile), l))
|
||||
{
|
||||
/* This is the object we are looking for. Say that we really
|
||||
want profiling and the timers are started. */
|
||||
GL(dl_profile_map) = l;
|
||||
}
|
||||
}
|
||||
else
|
||||
*(Elf64_Addr *)(plt + 16) = (Elf64_Addr) &_dl_runtime_resolve;
|
||||
|
||||
/* Identify this shared object */
|
||||
*(Elf64_Addr *)(plt + 24) = (Elf64_Addr) l;
|
||||
@ -156,143 +157,6 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
||||
return lazy;
|
||||
}
|
||||
|
||||
/* This code is used in dl-runtime.c to call the `fixup' function
|
||||
and then redirect to the address it returns. */
|
||||
#define TRAMPOLINE_TEMPLATE(tramp_name, fixup_name, IMB) \
|
||||
extern void tramp_name (void); \
|
||||
asm ( "\
|
||||
.globl " #tramp_name " \n\
|
||||
.ent " #tramp_name " \n\
|
||||
" #tramp_name ": \n\
|
||||
lda $sp, -44*8($sp) \n\
|
||||
.frame $sp, 44*8, $26 \n\
|
||||
/* Preserve all integer registers that C normally \n\
|
||||
doesn't. */ \n\
|
||||
stq $26, 0*8($sp) \n\
|
||||
stq $0, 1*8($sp) \n\
|
||||
stq $1, 2*8($sp) \n\
|
||||
stq $2, 3*8($sp) \n\
|
||||
stq $3, 4*8($sp) \n\
|
||||
stq $4, 5*8($sp) \n\
|
||||
stq $5, 6*8($sp) \n\
|
||||
stq $6, 7*8($sp) \n\
|
||||
stq $7, 8*8($sp) \n\
|
||||
stq $8, 9*8($sp) \n\
|
||||
stq $16, 10*8($sp) \n\
|
||||
stq $17, 11*8($sp) \n\
|
||||
stq $18, 12*8($sp) \n\
|
||||
stq $19, 13*8($sp) \n\
|
||||
stq $20, 14*8($sp) \n\
|
||||
stq $21, 15*8($sp) \n\
|
||||
stq $22, 16*8($sp) \n\
|
||||
stq $23, 17*8($sp) \n\
|
||||
stq $24, 18*8($sp) \n\
|
||||
stq $25, 19*8($sp) \n\
|
||||
stq $29, 20*8($sp) \n\
|
||||
stt $f0, 21*8($sp) \n\
|
||||
stt $f1, 22*8($sp) \n\
|
||||
stt $f10, 23*8($sp) \n\
|
||||
stt $f11, 24*8($sp) \n\
|
||||
stt $f12, 25*8($sp) \n\
|
||||
stt $f13, 26*8($sp) \n\
|
||||
stt $f14, 27*8($sp) \n\
|
||||
stt $f15, 28*8($sp) \n\
|
||||
stt $f16, 29*8($sp) \n\
|
||||
stt $f17, 30*8($sp) \n\
|
||||
stt $f18, 31*8($sp) \n\
|
||||
stt $f19, 32*8($sp) \n\
|
||||
stt $f20, 33*8($sp) \n\
|
||||
stt $f21, 34*8($sp) \n\
|
||||
stt $f22, 35*8($sp) \n\
|
||||
stt $f23, 36*8($sp) \n\
|
||||
stt $f24, 37*8($sp) \n\
|
||||
stt $f25, 38*8($sp) \n\
|
||||
stt $f26, 39*8($sp) \n\
|
||||
stt $f27, 40*8($sp) \n\
|
||||
stt $f28, 41*8($sp) \n\
|
||||
stt $f29, 42*8($sp) \n\
|
||||
stt $f30, 43*8($sp) \n\
|
||||
.mask 0x27ff01ff, -44*8 \n\
|
||||
.fmask 0xfffffc03, -(44-21)*8 \n\
|
||||
/* Set up our $gp */ \n\
|
||||
br $gp, .+4 \n\
|
||||
ldgp $gp, 0($gp) \n\
|
||||
.prologue 0 \n\
|
||||
/* Set up the arguments for fixup: */ \n\
|
||||
/* $16 = link_map out of plt0 */ \n\
|
||||
/* $17 = offset of reloc entry = ($28 - $27 - 20) /12 * 24 */\n\
|
||||
/* $18 = return address */ \n\
|
||||
subq $28, $27, $17 \n\
|
||||
ldq $16, 8($27) \n\
|
||||
subq $17, 20, $17 \n\
|
||||
mov $26, $18 \n\
|
||||
addq $17, $17, $17 \n\
|
||||
/* Do the fixup */ \n\
|
||||
bsr $26, " #fixup_name " !samegp \n\
|
||||
/* Move the destination address into position. */ \n\
|
||||
mov $0, $27 \n\
|
||||
/* Restore program registers. */ \n\
|
||||
ldq $26, 0*8($sp) \n\
|
||||
ldq $0, 1*8($sp) \n\
|
||||
ldq $1, 2*8($sp) \n\
|
||||
ldq $2, 3*8($sp) \n\
|
||||
ldq $3, 4*8($sp) \n\
|
||||
ldq $4, 5*8($sp) \n\
|
||||
ldq $5, 6*8($sp) \n\
|
||||
ldq $6, 7*8($sp) \n\
|
||||
ldq $7, 8*8($sp) \n\
|
||||
ldq $8, 9*8($sp) \n\
|
||||
ldq $16, 10*8($sp) \n\
|
||||
ldq $17, 11*8($sp) \n\
|
||||
ldq $18, 12*8($sp) \n\
|
||||
ldq $19, 13*8($sp) \n\
|
||||
ldq $20, 14*8($sp) \n\
|
||||
ldq $21, 15*8($sp) \n\
|
||||
ldq $22, 16*8($sp) \n\
|
||||
ldq $23, 17*8($sp) \n\
|
||||
ldq $24, 18*8($sp) \n\
|
||||
ldq $25, 19*8($sp) \n\
|
||||
ldq $29, 20*8($sp) \n\
|
||||
ldt $f0, 21*8($sp) \n\
|
||||
ldt $f1, 22*8($sp) \n\
|
||||
ldt $f10, 23*8($sp) \n\
|
||||
ldt $f11, 24*8($sp) \n\
|
||||
ldt $f12, 25*8($sp) \n\
|
||||
ldt $f13, 26*8($sp) \n\
|
||||
ldt $f14, 27*8($sp) \n\
|
||||
ldt $f15, 28*8($sp) \n\
|
||||
ldt $f16, 29*8($sp) \n\
|
||||
ldt $f17, 30*8($sp) \n\
|
||||
ldt $f18, 31*8($sp) \n\
|
||||
ldt $f19, 32*8($sp) \n\
|
||||
ldt $f20, 33*8($sp) \n\
|
||||
ldt $f21, 34*8($sp) \n\
|
||||
ldt $f22, 35*8($sp) \n\
|
||||
ldt $f23, 36*8($sp) \n\
|
||||
ldt $f24, 37*8($sp) \n\
|
||||
ldt $f25, 38*8($sp) \n\
|
||||
ldt $f26, 39*8($sp) \n\
|
||||
ldt $f27, 40*8($sp) \n\
|
||||
ldt $f28, 41*8($sp) \n\
|
||||
ldt $f29, 42*8($sp) \n\
|
||||
ldt $f30, 43*8($sp) \n\
|
||||
/* Flush the Icache after having modified the .plt code. */\n\
|
||||
" #IMB " \n\
|
||||
/* Clean up and turn control to the destination */ \n\
|
||||
lda $sp, 44*8($sp) \n\
|
||||
jmp $31, ($27) \n\
|
||||
.end " #tramp_name)
|
||||
|
||||
#ifndef PROF
|
||||
#define ELF_MACHINE_RUNTIME_TRAMPOLINE \
|
||||
TRAMPOLINE_TEMPLATE (_dl_runtime_resolve, fixup, imb); \
|
||||
TRAMPOLINE_TEMPLATE (_dl_runtime_profile, profile_fixup, /* nop */);
|
||||
#else
|
||||
#define ELF_MACHINE_RUNTIME_TRAMPOLINE \
|
||||
TRAMPOLINE_TEMPLATE (_dl_runtime_resolve, fixup, imb); \
|
||||
strong_alias (_dl_runtime_resolve, _dl_runtime_profile);
|
||||
#endif
|
||||
|
||||
/* Initial entry point code for the dynamic linker.
|
||||
The C function `_dl_start' is the real entry point;
|
||||
its return value is the user program's entry point. */
|
||||
@ -501,9 +365,13 @@ elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc,
|
||||
return value + reloc->r_addend;
|
||||
}
|
||||
|
||||
/* Names of the architecture-specific auditing callback functions. */
|
||||
#define ARCH_LA_PLTENTER alpha_gnu_pltenter
|
||||
#define ARCH_LA_PLTEXIT alpha_gnu_pltexit
|
||||
|
||||
#endif /* !dl_machine_h */
|
||||
|
||||
#ifdef RESOLVE
|
||||
#ifdef RESOLVE_MAP
|
||||
|
||||
/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
|
||||
MAP is the object containing the reloc. */
|
||||
@ -680,4 +548,4 @@ elf_machine_lazy_rel (struct link_map *map,
|
||||
_dl_reloc_bad_type (map, r_type, 1);
|
||||
}
|
||||
|
||||
#endif /* RESOLVE */
|
||||
#endif /* RESOLVE_MAP */
|
||||
|
361
sysdeps/alpha/dl-trampoline.S
Normal file
361
sysdeps/alpha/dl-trampoline.S
Normal file
@ -0,0 +1,361 @@
|
||||
/* PLT trampolines. Alpha version.
|
||||
Copyright (C) 2005 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
.set noat
|
||||
|
||||
.globl _dl_runtime_resolve
|
||||
.ent _dl_runtime_resolve
|
||||
|
||||
#undef FRAMESIZE
|
||||
#define FRAMESIZE 44*8
|
||||
|
||||
_dl_runtime_resolve:
|
||||
lda $30, -FRAMESIZE($30)
|
||||
.frame $30, FRAMESIZE, $26
|
||||
/* Preserve all registers that C normally doesn't. */
|
||||
stq $26, 0*8($30)
|
||||
stq $0, 1*8($30)
|
||||
stq $1, 2*8($30)
|
||||
stq $2, 3*8($30)
|
||||
stq $3, 4*8($30)
|
||||
stq $4, 5*8($30)
|
||||
stq $5, 6*8($30)
|
||||
stq $6, 7*8($30)
|
||||
stq $7, 8*8($30)
|
||||
stq $8, 9*8($30)
|
||||
stq $16, 10*8($30)
|
||||
stq $17, 11*8($30)
|
||||
stq $18, 12*8($30)
|
||||
stq $19, 13*8($30)
|
||||
stq $20, 14*8($30)
|
||||
stq $21, 15*8($30)
|
||||
stq $22, 16*8($30)
|
||||
stq $23, 17*8($30)
|
||||
stq $24, 18*8($30)
|
||||
stq $25, 19*8($30)
|
||||
stq $29, 20*8($30)
|
||||
stt $f0, 21*8($30)
|
||||
stt $f1, 22*8($30)
|
||||
stt $f10, 23*8($30)
|
||||
stt $f11, 24*8($30)
|
||||
stt $f12, 25*8($30)
|
||||
stt $f13, 26*8($30)
|
||||
stt $f14, 27*8($30)
|
||||
stt $f15, 28*8($30)
|
||||
stt $f16, 29*8($30)
|
||||
stt $f17, 30*8($30)
|
||||
stt $f18, 31*8($30)
|
||||
stt $f19, 32*8($30)
|
||||
stt $f20, 33*8($30)
|
||||
stt $f21, 34*8($30)
|
||||
stt $f22, 35*8($30)
|
||||
stt $f23, 36*8($30)
|
||||
stt $f24, 37*8($30)
|
||||
stt $f25, 38*8($30)
|
||||
stt $f26, 39*8($30)
|
||||
stt $f27, 40*8($30)
|
||||
stt $f28, 41*8($30)
|
||||
stt $f29, 42*8($30)
|
||||
stt $f30, 43*8($30)
|
||||
.mask 0x27ff01ff, -FRAMESIZE
|
||||
.fmask 0xfffffc03, -FRAMESIZE+21*8
|
||||
/* Set up our GP. */
|
||||
br $29, .+4
|
||||
ldgp $29, 0($29)
|
||||
.prologue 0
|
||||
/* Set up the arguments for _dl_fixup:
|
||||
$16 = link_map out of plt0
|
||||
$17 = offset of reloc entry = ($28 - $27 - 20) /12 * 24
|
||||
$18 = return address
|
||||
*/
|
||||
subq $28, $27, $17
|
||||
ldq $16, 8($27)
|
||||
subq $17, 20, $17
|
||||
mov $26, $18
|
||||
addq $17, $17, $17
|
||||
bsr $26, _dl_fixup !samegp
|
||||
|
||||
/* Move the destination address into position. */
|
||||
mov $0, $27
|
||||
/* Restore program registers. */
|
||||
ldq $26, 0*8($30)
|
||||
ldq $0, 1*8($30)
|
||||
ldq $1, 2*8($30)
|
||||
ldq $2, 3*8($30)
|
||||
ldq $3, 4*8($30)
|
||||
ldq $4, 5*8($30)
|
||||
ldq $5, 6*8($30)
|
||||
ldq $6, 7*8($30)
|
||||
ldq $7, 8*8($30)
|
||||
ldq $8, 9*8($30)
|
||||
ldq $16, 10*8($30)
|
||||
ldq $17, 11*8($30)
|
||||
ldq $18, 12*8($30)
|
||||
ldq $19, 13*8($30)
|
||||
ldq $20, 14*8($30)
|
||||
ldq $21, 15*8($30)
|
||||
ldq $22, 16*8($30)
|
||||
ldq $23, 17*8($30)
|
||||
ldq $24, 18*8($30)
|
||||
ldq $25, 19*8($30)
|
||||
ldq $29, 20*8($30)
|
||||
ldt $f0, 21*8($30)
|
||||
ldt $f1, 22*8($30)
|
||||
ldt $f10, 23*8($30)
|
||||
ldt $f11, 24*8($30)
|
||||
ldt $f12, 25*8($30)
|
||||
ldt $f13, 26*8($30)
|
||||
ldt $f14, 27*8($30)
|
||||
ldt $f15, 28*8($30)
|
||||
ldt $f16, 29*8($30)
|
||||
ldt $f17, 30*8($30)
|
||||
ldt $f18, 31*8($30)
|
||||
ldt $f19, 32*8($30)
|
||||
ldt $f20, 33*8($30)
|
||||
ldt $f21, 34*8($30)
|
||||
ldt $f22, 35*8($30)
|
||||
ldt $f23, 36*8($30)
|
||||
ldt $f24, 37*8($30)
|
||||
ldt $f25, 38*8($30)
|
||||
ldt $f26, 39*8($30)
|
||||
ldt $f27, 40*8($30)
|
||||
ldt $f28, 41*8($30)
|
||||
ldt $f29, 42*8($30)
|
||||
ldt $f30, 43*8($30)
|
||||
/* Flush the Icache after having modified the .plt code. */
|
||||
imb
|
||||
/* Clean up and turn control to the destination */
|
||||
lda $30, FRAMESIZE($30)
|
||||
jmp $31, ($27)
|
||||
|
||||
.end _dl_runtime_resolve
|
||||
|
||||
.globl _dl_runtime_profile
|
||||
.usepv _dl_runtime_profile, no
|
||||
.type _dl_runtime_profile, @function
|
||||
|
||||
/* We save the registers in a different order than desired by
|
||||
.mask/.fmask, so we have to use explicit cfi directives. */
|
||||
cfi_startproc
|
||||
|
||||
.macro savei regno, offset
|
||||
stq $\regno, \offset($30)
|
||||
cfi_rel_offset(\regno, \offset)
|
||||
.endm
|
||||
|
||||
.macro savef regno, offset
|
||||
stt $f\regno, \offset($30)
|
||||
cfi_rel_offset(\regno+32, \offset)
|
||||
.endm
|
||||
|
||||
#undef FRAMESIZE
|
||||
#define FRAMESIZE 50*8
|
||||
|
||||
_dl_runtime_profile:
|
||||
lda $30, -FRAMESIZE($30)
|
||||
cfi_adjust_cfa_offset (FRAMESIZE)
|
||||
|
||||
/* Preserve all argument registers. This also constructs the
|
||||
La_alpha_regs structure. */
|
||||
savei 26, 0*8
|
||||
savei 16, 2*8
|
||||
savei 17, 3*8
|
||||
savei 18, 4*8
|
||||
savei 19, 5*8
|
||||
savei 20, 6*8
|
||||
savei 21, 7*8
|
||||
lda $16, FRAMESIZE($30)
|
||||
savef 16, 8*8
|
||||
savef 17, 9*8
|
||||
savef 18, 10*8
|
||||
savef 19, 11*8
|
||||
savef 20, 12*8
|
||||
savef 21, 13*8
|
||||
stq $16, 1*8($30)
|
||||
|
||||
/* Preserve all registers that C normally doesn't. */
|
||||
savei 0, 14*8
|
||||
savei 1, 15*8
|
||||
savei 2, 16*8
|
||||
savei 3, 17*8
|
||||
savei 4, 18*8
|
||||
savei 5, 19*8
|
||||
savei 6, 20*8
|
||||
savei 7, 21*8
|
||||
savei 8, 22*8
|
||||
savei 22, 23*8
|
||||
savei 23, 24*8
|
||||
savei 24, 25*8
|
||||
savei 25, 26*8
|
||||
savei 29, 27*8
|
||||
savef 0, 28*8
|
||||
savef 1, 29*8
|
||||
savef 10, 30*8
|
||||
savef 11, 31*8
|
||||
savef 12, 32*8
|
||||
savef 13, 33*8
|
||||
savef 14, 34*8
|
||||
savef 15, 35*8
|
||||
savef 22, 36*8
|
||||
savef 23, 37*8
|
||||
savef 24, 38*8
|
||||
savef 25, 39*8
|
||||
savef 26, 40*8
|
||||
savef 27, 41*8
|
||||
savef 28, 42*8
|
||||
savef 29, 43*8
|
||||
savef 30, 44*8
|
||||
|
||||
/* Set up our GP. */
|
||||
br $29, .+4
|
||||
ldgp $29, 0($29)
|
||||
|
||||
/* Set up the arguments for _dl_profile_fixup:
|
||||
$16 = link_map out of plt0
|
||||
$17 = offset of reloc entry = ($28 - $27 - 20) /12 * 24
|
||||
$18 = return address
|
||||
$19 = La_alpha_regs address
|
||||
$20 = framesize address
|
||||
*/
|
||||
subq $28, $27, $17
|
||||
ldq $16, 8($27)
|
||||
subq $17, 20, $17
|
||||
mov $26, $18
|
||||
addq $17, $17, $17
|
||||
lda $19, 0($30)
|
||||
lda $20, 45*8($30)
|
||||
stq $16, 48*8($30)
|
||||
stq $17, 49*8($30)
|
||||
|
||||
bsr $26, _dl_profile_fixup !samegp
|
||||
|
||||
/* Discover if we're wrapping this call. */
|
||||
ldq $18, 45*8($30)
|
||||
bge $18, 1f
|
||||
|
||||
/* Move the destination address into position. */
|
||||
mov $0, $27
|
||||
/* Restore program registers. */
|
||||
ldq $26, 0*8($30)
|
||||
ldq $16, 2*8($30)
|
||||
ldq $17, 3*8($30)
|
||||
ldq $18, 4*8($30)
|
||||
ldq $19, 5*8($30)
|
||||
ldq $20, 6*8($30)
|
||||
ldq $21, 7*8($30)
|
||||
ldt $f16, 8*8($30)
|
||||
ldt $f17, 9*8($30)
|
||||
ldt $f18, 10*8($30)
|
||||
ldt $f19, 11*8($30)
|
||||
ldt $f20, 12*8($30)
|
||||
ldt $f21, 13*8($30)
|
||||
ldq $0, 14*8($30)
|
||||
ldq $1, 15*8($30)
|
||||
ldq $2, 16*8($30)
|
||||
ldq $3, 17*8($30)
|
||||
ldq $4, 18*8($30)
|
||||
ldq $5, 19*8($30)
|
||||
ldq $6, 20*8($30)
|
||||
ldq $7, 21*8($30)
|
||||
ldq $8, 22*8($30)
|
||||
ldq $22, 23*8($30)
|
||||
ldq $23, 24*8($30)
|
||||
ldq $24, 25*8($30)
|
||||
ldq $25, 26*8($30)
|
||||
ldq $29, 27*8($30)
|
||||
ldt $f0, 28*8($30)
|
||||
ldt $f1, 29*8($30)
|
||||
ldt $f10, 30*8($30)
|
||||
ldt $f11, 31*8($30)
|
||||
ldt $f12, 32*8($30)
|
||||
ldt $f13, 33*8($30)
|
||||
ldt $f14, 34*8($30)
|
||||
ldt $f15, 35*8($30)
|
||||
ldt $f22, 36*8($30)
|
||||
ldt $f23, 37*8($30)
|
||||
ldt $f24, 38*8($30)
|
||||
ldt $f25, 39*8($30)
|
||||
ldt $f26, 40*8($30)
|
||||
ldt $f27, 41*8($30)
|
||||
ldt $f28, 42*8($30)
|
||||
ldt $f29, 43*8($30)
|
||||
ldt $f30, 44*8($30)
|
||||
|
||||
/* Clean up and turn control to the destination. */
|
||||
lda $30, FRAMESIZE($30)
|
||||
jmp $31, ($27)
|
||||
|
||||
1:
|
||||
/* Create a frame pointer and allocate a new argument frame. */
|
||||
savei 15, 45*8
|
||||
mov $30, $15
|
||||
cfi_def_cfa_register (15)
|
||||
addq $18, 15, $18
|
||||
bic $18, 15, $18
|
||||
subq $30, $18, $30
|
||||
|
||||
/* Save the call destination around memcpy. */
|
||||
stq $0, 46*8($30)
|
||||
|
||||
/* Copy the stack arguments into place. */
|
||||
lda $16, 0($30)
|
||||
lda $17, FRAMESIZE($15)
|
||||
jsr $26, memcpy
|
||||
ldgp $29, 0($26)
|
||||
|
||||
/* Reload the argument registers. */
|
||||
ldq $27, 46*8($30)
|
||||
ldq $16, 2*8($15)
|
||||
ldq $17, 3*8($15)
|
||||
ldq $18, 4*8($15)
|
||||
ldq $19, 5*8($15)
|
||||
ldq $20, 6*8($15)
|
||||
ldq $21, 7*8($15)
|
||||
ldt $f16, 8*8($15)
|
||||
ldt $f17, 9*8($15)
|
||||
ldt $f18, 10*8($15)
|
||||
ldt $f19, 11*8($15)
|
||||
ldt $f20, 12*8($15)
|
||||
ldt $f21, 13*8($15)
|
||||
|
||||
jsr $26, ($27), 0
|
||||
ldgp $29, 0($26)
|
||||
|
||||
/* Set up for call to _dl_call_pltexit. */
|
||||
ldq $16, 48($15)
|
||||
ldq $17, 49($15)
|
||||
stq $0, 46*8($15)
|
||||
lda $18, 0($15)
|
||||
stq $1, 47*8($15)
|
||||
lda $19, 46*8($15)
|
||||
stt $f0, 48*8($15)
|
||||
stt $f1, 49*8($15)
|
||||
bsr $26, _dl_call_pltexit !samegp
|
||||
|
||||
mov $15, $30
|
||||
cfi_def_cfa_register (30)
|
||||
ldq $26, 0($30)
|
||||
ldq $15, 45*8($30)
|
||||
lda $30, FRAMESIZE($30)
|
||||
ret
|
||||
|
||||
cfi_endproc
|
||||
.size _dl_runtime_profile, .-_dl_runtime_profile
|
@ -187,7 +187,8 @@ struct La_sh_regs;
|
||||
struct La_sh_retval;
|
||||
struct La_m68k_regs;
|
||||
struct La_m68k_retval;
|
||||
|
||||
struct La_alpha_regs;
|
||||
struct La_alpha_retval;
|
||||
|
||||
struct audit_ifaces
|
||||
{
|
||||
@ -228,6 +229,10 @@ struct audit_ifaces
|
||||
uintptr_t *, struct La_m68k_regs *,
|
||||
unsigned int *, const char *name,
|
||||
long int *framesizep);
|
||||
Elf64_Addr (*alpha_gnu_pltenter) (Elf64_Sym *, unsigned int, uintptr_t *,
|
||||
uintptr_t *, struct La_alpha_regs *,
|
||||
unsigned int *, const char *name,
|
||||
long int *framesizep);
|
||||
};
|
||||
union
|
||||
{
|
||||
@ -253,6 +258,10 @@ struct audit_ifaces
|
||||
unsigned int (*m68k_gnu_pltexit) (Elf32_Sym *, unsigned int, uintptr_t *,
|
||||
uintptr_t *, const struct La_m68k_regs *,
|
||||
struct La_m68k_retval *, const char *);
|
||||
unsigned int (*alpha_gnu_pltexit) (Elf64_Sym *, unsigned int, uintptr_t *,
|
||||
uintptr_t *,
|
||||
const struct La_alpha_regs *,
|
||||
struct La_alpha_retval *, const char *);
|
||||
};
|
||||
unsigned int (*objclose) (uintptr_t *);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user