mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-25 22: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>
|
2005-01-22 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
* sysdeps/ia64/dl-machine.h: Remove PLT trampolines here.
|
* 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_regs La_m68k_regs
|
||||||
# define La_retval La_m68k_retval
|
# define La_retval La_m68k_retval
|
||||||
# define int_retval lrv_d0
|
# 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
|
#else
|
||||||
# error "architecture specific code needed"
|
# error "architecture specific code needed"
|
||||||
#endif
|
#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]);
|
plt = D_PTR (l, l_info[DT_PLTGOT]);
|
||||||
|
|
||||||
/* This function will be called to perform the relocation. */
|
/* This function will be called to perform the relocation. */
|
||||||
if (!profile)
|
if (__builtin_expect (profile, 0))
|
||||||
*(Elf64_Addr *)(plt + 16) = (Elf64_Addr) &_dl_runtime_resolve;
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
*(Elf64_Addr *)(plt + 16) = (Elf64_Addr) &_dl_runtime_profile;
|
*(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
|
/* This is the object we are looking for. Say that we really
|
||||||
want profiling and the timers are started. */
|
want profiling and the timers are started. */
|
||||||
GL(dl_profile_map) = l;
|
GL(dl_profile_map) = l;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
*(Elf64_Addr *)(plt + 16) = (Elf64_Addr) &_dl_runtime_resolve;
|
||||||
|
|
||||||
/* Identify this shared object */
|
/* Identify this shared object */
|
||||||
*(Elf64_Addr *)(plt + 24) = (Elf64_Addr) l;
|
*(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;
|
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.
|
/* Initial entry point code for the dynamic linker.
|
||||||
The C function `_dl_start' is the real entry point;
|
The C function `_dl_start' is the real entry point;
|
||||||
its return value is the user program's 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;
|
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 */
|
#endif /* !dl_machine_h */
|
||||||
|
|
||||||
#ifdef RESOLVE
|
#ifdef RESOLVE_MAP
|
||||||
|
|
||||||
/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
|
/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
|
||||||
MAP is the object containing the reloc. */
|
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);
|
_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_sh_retval;
|
||||||
struct La_m68k_regs;
|
struct La_m68k_regs;
|
||||||
struct La_m68k_retval;
|
struct La_m68k_retval;
|
||||||
|
struct La_alpha_regs;
|
||||||
|
struct La_alpha_retval;
|
||||||
|
|
||||||
struct audit_ifaces
|
struct audit_ifaces
|
||||||
{
|
{
|
||||||
@ -228,6 +229,10 @@ struct audit_ifaces
|
|||||||
uintptr_t *, struct La_m68k_regs *,
|
uintptr_t *, struct La_m68k_regs *,
|
||||||
unsigned int *, const char *name,
|
unsigned int *, const char *name,
|
||||||
long int *framesizep);
|
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
|
union
|
||||||
{
|
{
|
||||||
@ -253,6 +258,10 @@ struct audit_ifaces
|
|||||||
unsigned int (*m68k_gnu_pltexit) (Elf32_Sym *, unsigned int, uintptr_t *,
|
unsigned int (*m68k_gnu_pltexit) (Elf32_Sym *, unsigned int, uintptr_t *,
|
||||||
uintptr_t *, const struct La_m68k_regs *,
|
uintptr_t *, const struct La_m68k_regs *,
|
||||||
struct La_m68k_retval *, const char *);
|
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 *);
|
unsigned int (*objclose) (uintptr_t *);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user