mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-10 07:10:06 +00:00
* elf/elf.h (DT_ALPHA_PLTRO, DT_ALPHA_NUM): New. * sysdeps/alpha/dl-dtprocnum.h: New file. * sysdeps/alpha/dl-machine.h (DT_ALPHA): New. (elf_machine_load_address): Simplify to rely on gprel relocations. (elf_machine_runtime_setup): Handle DT_ALPHA_PLTRO plt format. Remove thread safety workaround for binutils 2.6. (elf_machine_fixup_plt): Handle DT_ALPHA_PLTRO plt format. * sysdeps/alpha/dl-trampoline.S (_dl_runtime_resolve_new): New. (_dl_runtime_profile_new): New. (_dl_runtime_resolve_old): Rename from _dl_runtime_resolve. (_dl_runtime_profile_old): Rename from _dl_runtime_profile. Fix typo in _dl_call_pltexit argument loading.
* sysdeps/alpha/div_libc.h (funcnoplt): New. * sysdeps/alpha/divl.S, sysdeps/alpha/divq.S: Use it. * sysdeps/alpha/divqu.S, sysdeps/alpha/reml.S: Likewise. * sysdeps/alpha/remq.S, sysdeps/alpha/remqu.S: Likewise. 2005-05-28 Richard Henderson <rth@redhat.com> * elf/elf.h (DT_ALPHA_PLTRO, DT_ALPHA_NUM): New. * sysdeps/alpha/dl-dtprocnum.h: New file. * sysdeps/alpha/dl-machine.h (DT_ALPHA): New. (elf_machine_load_address): Simplify to rely on gprel relocations. (elf_machine_runtime_setup): Handle DT_ALPHA_PLTRO plt format. Remove thread safety workaround for binutils 2.6. (elf_machine_fixup_plt): Handle DT_ALPHA_PLTRO plt format. * sysdeps/alpha/dl-trampoline.S (_dl_runtime_resolve_new): New. (_dl_runtime_profile_new): New. (_dl_runtime_resolve_old): Rename from _dl_runtime_resolve. (_dl_runtime_profile_old): Rename from _dl_runtime_profile. Fix typo in _dl_call_pltexit argument loading. * sysdeps/alpha/div_libc.h (funcnoplt): New. * sysdeps/alpha/divl.S, sysdeps/alpha/divq.S: Use it. * sysdeps/alpha/divqu.S, sysdeps/alpha/reml.S: Likewise. * sysdeps/alpha/remq.S, sysdeps/alpha/remqu.S: Likewise.
This commit is contained in:
parent
7427c5defa
commit
4d87b39422
20
ChangeLog
20
ChangeLog
@ -1,3 +1,23 @@
|
|||||||
|
2005-05-28 Richard Henderson <rth@redhat.com>
|
||||||
|
|
||||||
|
* elf/elf.h (DT_ALPHA_PLTRO, DT_ALPHA_NUM): New.
|
||||||
|
* sysdeps/alpha/dl-dtprocnum.h: New file.
|
||||||
|
* sysdeps/alpha/dl-machine.h (DT_ALPHA): New.
|
||||||
|
(elf_machine_load_address): Simplify to rely on gprel relocations.
|
||||||
|
(elf_machine_runtime_setup): Handle DT_ALPHA_PLTRO plt format.
|
||||||
|
Remove thread safety workaround for binutils 2.6.
|
||||||
|
(elf_machine_fixup_plt): Handle DT_ALPHA_PLTRO plt format.
|
||||||
|
* sysdeps/alpha/dl-trampoline.S (_dl_runtime_resolve_new): New.
|
||||||
|
(_dl_runtime_profile_new): New.
|
||||||
|
(_dl_runtime_resolve_old): Rename from _dl_runtime_resolve.
|
||||||
|
(_dl_runtime_profile_old): Rename from _dl_runtime_profile. Fix
|
||||||
|
typo in _dl_call_pltexit argument loading.
|
||||||
|
|
||||||
|
* sysdeps/alpha/div_libc.h (funcnoplt): New.
|
||||||
|
* sysdeps/alpha/divl.S, sysdeps/alpha/divq.S: Use it.
|
||||||
|
* sysdeps/alpha/divqu.S, sysdeps/alpha/reml.S: Likewise.
|
||||||
|
* sysdeps/alpha/remq.S, sysdeps/alpha/remqu.S: Likewise.
|
||||||
|
|
||||||
2005-05-26 Andreas Schwab <schwab@suse.de>
|
2005-05-26 Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
* locale/Makefile (CFLAGS-loadlocale.c): Don't define.
|
* locale/Makefile (CFLAGS-loadlocale.c): Don't define.
|
||||||
|
@ -1866,6 +1866,9 @@ typedef Elf32_Addr Elf32_Conflict;
|
|||||||
#define LITUSE_ALPHA_TLS_GD 4
|
#define LITUSE_ALPHA_TLS_GD 4
|
||||||
#define LITUSE_ALPHA_TLS_LDM 5
|
#define LITUSE_ALPHA_TLS_LDM 5
|
||||||
|
|
||||||
|
/* Legal values for d_tag of Elf64_Dyn. */
|
||||||
|
#define DT_ALPHA_PLTRO 0x70000000
|
||||||
|
#define DT_ALPHA_NUM 1
|
||||||
|
|
||||||
/* PowerPC specific declarations */
|
/* PowerPC specific declarations */
|
||||||
|
|
||||||
|
@ -34,6 +34,12 @@
|
|||||||
#define RV t12
|
#define RV t12
|
||||||
#define RA t9
|
#define RA t9
|
||||||
|
|
||||||
|
/* The secureplt format does not allow the division routines to be called
|
||||||
|
via plt; there aren't enough registers free to be clobbered. Avoid
|
||||||
|
setting the symbol type to STT_FUNC, so that the linker won't be tempted
|
||||||
|
to create a plt entry. */
|
||||||
|
#define funcnoplt notype
|
||||||
|
|
||||||
/* None of these functions should use implicit anything. */
|
/* None of these functions should use implicit anything. */
|
||||||
.set nomacro
|
.set nomacro
|
||||||
.set noat
|
.set noat
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
.text
|
.text
|
||||||
.align 4
|
.align 4
|
||||||
.globl __divl
|
.globl __divl
|
||||||
.type __divl, @function
|
.type __divl, @funcnoplt
|
||||||
.usepv __divl, no
|
.usepv __divl, no
|
||||||
|
|
||||||
cfi_startproc
|
cfi_startproc
|
||||||
|
@ -43,7 +43,7 @@
|
|||||||
.text
|
.text
|
||||||
.align 4
|
.align 4
|
||||||
.globl __divq
|
.globl __divq
|
||||||
.type __divq, @function
|
.type __divq, @funcnoplt
|
||||||
.usepv __divq, no
|
.usepv __divq, no
|
||||||
|
|
||||||
cfi_startproc
|
cfi_startproc
|
||||||
|
@ -43,7 +43,7 @@
|
|||||||
.text
|
.text
|
||||||
.align 4
|
.align 4
|
||||||
.globl __divqu
|
.globl __divqu
|
||||||
.type __divqu, @function
|
.type __divqu, @funcnoplt
|
||||||
.usepv __divqu, no
|
.usepv __divqu, no
|
||||||
|
|
||||||
cfi_startproc
|
cfi_startproc
|
||||||
|
3
sysdeps/alpha/dl-dtprocnum.h
Normal file
3
sysdeps/alpha/dl-dtprocnum.h
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
/* Number of extra dynamic section entries for this architecture. By
|
||||||
|
default there are none. */
|
||||||
|
#define DT_THISPROCNUM DT_ALPHA_NUM
|
@ -33,6 +33,9 @@
|
|||||||
where the dynamic linker should not map anything. */
|
where the dynamic linker should not map anything. */
|
||||||
#define ELF_MACHINE_USER_ADDRESS_MASK 0x120000000UL
|
#define ELF_MACHINE_USER_ADDRESS_MASK 0x120000000UL
|
||||||
|
|
||||||
|
/* Translate a processor specific dynamic tag to the index in l_info array. */
|
||||||
|
#define DT_ALPHA(x) (DT_ALPHA_##x - DT_LOPROC + DT_NUM)
|
||||||
|
|
||||||
/* Return nonzero iff ELF header is compatible with the running host. */
|
/* Return nonzero iff ELF header is compatible with the running host. */
|
||||||
static inline int
|
static inline int
|
||||||
elf_machine_matches_host (const Elf64_Ehdr *ehdr)
|
elf_machine_matches_host (const Elf64_Ehdr *ehdr)
|
||||||
@ -55,105 +58,74 @@ elf_machine_dynamic (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Return the run-time load address of the shared object. */
|
/* Return the run-time load address of the shared object. */
|
||||||
|
|
||||||
static inline Elf64_Addr
|
static inline Elf64_Addr
|
||||||
elf_machine_load_address (void)
|
elf_machine_load_address (void)
|
||||||
{
|
{
|
||||||
/* NOTE: While it is generally unfriendly to put data in the text
|
/* This relies on the compiler using gp-relative addresses for static symbols. */
|
||||||
segment, it is only slightly less so when the "data" is an
|
static void *dot = ˙
|
||||||
instruction. While we don't have to worry about GLD just yet, an
|
return (void *)&dot - dot;
|
||||||
optimizing linker might decide that our "data" is an unreachable
|
|
||||||
instruction and throw it away -- with the right switches, DEC's
|
|
||||||
linker will do this. What ought to happen is we should add
|
|
||||||
something to GAS to allow us access to the new GPREL_HI32/LO32
|
|
||||||
relocation types stolen from OSF/1 3.0. */
|
|
||||||
/* This code relies on the fact that BRADDR relocations do not
|
|
||||||
appear in dynamic relocation tables. Not that that would be very
|
|
||||||
useful anyway -- br/bsr has a 4MB range and the shared libraries
|
|
||||||
are usually many many terabytes away. */
|
|
||||||
|
|
||||||
Elf64_Addr dot;
|
|
||||||
long int zero_disp;
|
|
||||||
|
|
||||||
asm("br %0, 1f\n"
|
|
||||||
"0:\n\t"
|
|
||||||
"br $0, 2f\n"
|
|
||||||
"1:\n\t"
|
|
||||||
".section\t.data\n"
|
|
||||||
"2:\n\t"
|
|
||||||
".quad 0b\n\t"
|
|
||||||
".previous"
|
|
||||||
: "=r"(dot));
|
|
||||||
|
|
||||||
zero_disp = *(int *) dot;
|
|
||||||
zero_disp = (zero_disp << 43) >> 41;
|
|
||||||
|
|
||||||
return dot - *(Elf64_Addr *) (dot + 4 + zero_disp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set up the loaded object described by L so its unrelocated PLT
|
/* Set up the loaded object described by L so its unrelocated PLT
|
||||||
entries will jump to the on-demand fixup code in dl-runtime.c. */
|
entries will jump to the on-demand fixup code in dl-runtime.c. */
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
elf_machine_runtime_setup (struct link_map *map, int lazy, int profile)
|
||||||
{
|
{
|
||||||
Elf64_Addr plt;
|
extern char _dl_runtime_resolve_new[] attribute_hidden;
|
||||||
extern void _dl_runtime_resolve (void);
|
extern char _dl_runtime_profile_new[] attribute_hidden;
|
||||||
extern void _dl_runtime_profile (void);
|
extern char _dl_runtime_resolve_old[] attribute_hidden;
|
||||||
|
extern char _dl_runtime_profile_old[] attribute_hidden;
|
||||||
|
|
||||||
if (l->l_info[DT_JMPREL] && lazy)
|
struct pltgot {
|
||||||
|
char *resolve;
|
||||||
|
struct link_map *link;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct pltgot *pg;
|
||||||
|
long secureplt;
|
||||||
|
char *resolve;
|
||||||
|
|
||||||
|
if (map->l_info[DT_JMPREL] == 0 || !lazy)
|
||||||
|
return lazy;
|
||||||
|
|
||||||
|
/* Check to see if we're using the read-only plt form. */
|
||||||
|
secureplt = map->l_info[DT_ALPHA(PLTRO)] != 0;
|
||||||
|
|
||||||
|
/* If the binary uses the read-only secure plt format, PG points to
|
||||||
|
the .got.plt section, which is the right place for ld.so to place
|
||||||
|
its hooks. Otherwise, PG is currently pointing at the start of
|
||||||
|
the plt; the hooks go at offset 16. */
|
||||||
|
pg = (struct pltgot *) D_PTR (map, l_info[DT_PLTGOT]);
|
||||||
|
pg += !secureplt;
|
||||||
|
|
||||||
|
/* This function will be called to perform the relocation. They're
|
||||||
|
not declared as functions to convince the compiler to use gp
|
||||||
|
relative relocations for them. */
|
||||||
|
if (secureplt)
|
||||||
|
resolve = _dl_runtime_resolve_new;
|
||||||
|
else
|
||||||
|
resolve = _dl_runtime_resolve_old;
|
||||||
|
|
||||||
|
if (__builtin_expect (profile, 0))
|
||||||
{
|
{
|
||||||
/* The GOT entries for the functions in the PLT have not been
|
if (secureplt)
|
||||||
filled in yet. Their initial contents are directed to the
|
resolve = _dl_runtime_profile_new;
|
||||||
PLT which arranges for the dynamic linker to be called. */
|
|
||||||
plt = D_PTR (l, l_info[DT_PLTGOT]);
|
|
||||||
|
|
||||||
/* This function will be called to perform the relocation. */
|
|
||||||
if (__builtin_expect (profile, 0))
|
|
||||||
{
|
|
||||||
*(Elf64_Addr *)(plt + 16) = (Elf64_Addr) &_dl_runtime_profile;
|
|
||||||
|
|
||||||
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
|
else
|
||||||
*(Elf64_Addr *)(plt + 16) = (Elf64_Addr) &_dl_runtime_resolve;
|
resolve = _dl_runtime_profile_old;
|
||||||
|
|
||||||
/* Identify this shared object */
|
if (GLRO(dl_profile) && _dl_name_match_p (GLRO(dl_profile), map))
|
||||||
*(Elf64_Addr *)(plt + 24) = (Elf64_Addr) l;
|
|
||||||
|
|
||||||
/* If the first instruction of the plt entry is not
|
|
||||||
"br $28, plt0", we have to reinitialize .plt for lazy relocation. */
|
|
||||||
if (*(unsigned int *)(plt + 32) != 0xc39ffff7)
|
|
||||||
{
|
{
|
||||||
unsigned int val = 0xc39ffff7;
|
/* This is the object we are looking for. Say that we really
|
||||||
unsigned int *slot, *end;
|
want profiling and the timers are started. */
|
||||||
const Elf64_Rela *rela = (const Elf64_Rela *)
|
GL(dl_profile_map) = map;
|
||||||
D_PTR (l, l_info[DT_JMPREL]);
|
|
||||||
Elf64_Addr l_addr = l->l_addr;
|
|
||||||
|
|
||||||
/* br t12,.+4; ldq t12,12(t12); nop; jmp t12,(t12),.+4 */
|
|
||||||
*(unsigned long *)plt = 0xa77b000cc3600000;
|
|
||||||
*(unsigned long *)(plt + 8) = 0x6b7b000047ff041f;
|
|
||||||
slot = (unsigned int *)(plt + 32);
|
|
||||||
end = (unsigned int *)(plt + 32
|
|
||||||
+ l->l_info[DT_PLTRELSZ]->d_un.d_val / 2);
|
|
||||||
while (slot < end)
|
|
||||||
{
|
|
||||||
/* br at,.plt+0 */
|
|
||||||
*slot = val;
|
|
||||||
*(Elf64_Addr *) rela->r_offset = (Elf64_Addr) slot - l_addr;
|
|
||||||
val -= 3;
|
|
||||||
slot += 3;
|
|
||||||
++rela;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pg->resolve = resolve;
|
||||||
|
pg->link = map;
|
||||||
|
|
||||||
return lazy;
|
return lazy;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -280,7 +252,7 @@ $fixup_stack: \n\
|
|||||||
/* Fix up the instructions of a PLT entry to invoke the function
|
/* Fix up the instructions of a PLT entry to invoke the function
|
||||||
rather than the dynamic linker. */
|
rather than the dynamic linker. */
|
||||||
static inline Elf64_Addr
|
static inline Elf64_Addr
|
||||||
elf_machine_fixup_plt (struct link_map *l, lookup_t t,
|
elf_machine_fixup_plt (struct link_map *map, lookup_t t,
|
||||||
const Elf64_Rela *reloc,
|
const Elf64_Rela *reloc,
|
||||||
Elf64_Addr *got_addr, Elf64_Addr value)
|
Elf64_Addr *got_addr, Elf64_Addr value)
|
||||||
{
|
{
|
||||||
@ -291,10 +263,16 @@ elf_machine_fixup_plt (struct link_map *l, lookup_t t,
|
|||||||
/* Store the value we are going to load. */
|
/* Store the value we are going to load. */
|
||||||
*got_addr = value;
|
*got_addr = value;
|
||||||
|
|
||||||
|
/* If this binary uses the read-only secure plt format, we're done. */
|
||||||
|
if (map->l_info[DT_ALPHA(PLTRO)])
|
||||||
|
return value;
|
||||||
|
|
||||||
|
/* Otherwise we have to modify the plt entry in place to do the branch. */
|
||||||
|
|
||||||
/* Recover the PLT entry address by calculating reloc's index into the
|
/* Recover the PLT entry address by calculating reloc's index into the
|
||||||
.rela.plt, and finding that entry in the .plt. */
|
.rela.plt, and finding that entry in the .plt. */
|
||||||
rela_plt = (void *) D_PTR (l, l_info[DT_JMPREL]);
|
rela_plt = (const Elf64_Rela *) D_PTR (map, l_info[DT_JMPREL]);
|
||||||
plte = (void *) (D_PTR (l, l_info[DT_PLTGOT]) + 32);
|
plte = (Elf64_Word *) (D_PTR (map, l_info[DT_PLTGOT]) + 32);
|
||||||
plte += 3 * (reloc - rela_plt);
|
plte += 3 * (reloc - rela_plt);
|
||||||
|
|
||||||
/* Find the displacement from the plt entry to the function. */
|
/* Find the displacement from the plt entry to the function. */
|
||||||
|
@ -21,13 +21,202 @@
|
|||||||
|
|
||||||
.set noat
|
.set noat
|
||||||
|
|
||||||
.globl _dl_runtime_resolve
|
.macro savei regno, offset
|
||||||
.ent _dl_runtime_resolve
|
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
|
||||||
|
|
||||||
|
.align 4
|
||||||
|
.globl _dl_runtime_resolve_new
|
||||||
|
.ent _dl_runtime_resolve_new
|
||||||
|
|
||||||
|
#undef FRAMESIZE
|
||||||
|
#define FRAMESIZE 14*8
|
||||||
|
|
||||||
|
_dl_runtime_resolve_new:
|
||||||
|
.frame $30, FRAMESIZE, $26, 0
|
||||||
|
.mask 0x4000000, 0
|
||||||
|
|
||||||
|
ldah $29, 0($27) !gpdisp!1
|
||||||
|
lda $30, -FRAMESIZE($30)
|
||||||
|
stq $26, 0*8($30)
|
||||||
|
stq $16, 2*8($30)
|
||||||
|
|
||||||
|
stq $17, 3*8($30)
|
||||||
|
lda $29, 0($29) !gpdisp!1
|
||||||
|
stq $18, 4*8($30)
|
||||||
|
mov $28, $16 /* link_map from .got.plt */
|
||||||
|
|
||||||
|
stq $19, 5*8($30)
|
||||||
|
mov $25, $17 /* offset of reloc entry */
|
||||||
|
stq $20, 6*8($30)
|
||||||
|
mov $26, $18 /* return address */
|
||||||
|
|
||||||
|
stq $21, 7*8($30)
|
||||||
|
stt $f16, 8*8($30)
|
||||||
|
stt $f17, 9*8($30)
|
||||||
|
stt $f18, 10*8($30)
|
||||||
|
|
||||||
|
stt $f19, 11*8($30)
|
||||||
|
stt $f20, 12*8($30)
|
||||||
|
stt $f21, 13*8($30)
|
||||||
|
.prologue 2
|
||||||
|
|
||||||
|
bsr $26, _dl_fixup !samegp
|
||||||
|
mov $0, $27
|
||||||
|
|
||||||
|
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)
|
||||||
|
lda $30, FRAMESIZE($30)
|
||||||
|
jmp $31, ($27), 0
|
||||||
|
.end _dl_runtime_resolve_new
|
||||||
|
|
||||||
|
.globl _dl_runtime_profile_new
|
||||||
|
.type _dl_runtime_profile_new, @function
|
||||||
|
|
||||||
|
#undef FRAMESIZE
|
||||||
|
#define FRAMESIZE 20*8
|
||||||
|
|
||||||
|
/* We save the registers in a different order than desired by
|
||||||
|
.mask/.fmask, so we have to use explicit cfi directives. */
|
||||||
|
cfi_startproc
|
||||||
|
|
||||||
|
_dl_runtime_profile_new:
|
||||||
|
ldah $29, 0($27) !gpdisp!2
|
||||||
|
lda $30, -FRAMESIZE($30)
|
||||||
|
savei 26, 0*8
|
||||||
|
stq $16, 2*8($30)
|
||||||
|
|
||||||
|
stq $17, 3*8($30)
|
||||||
|
lda $29, 0($29) !gpdisp!2
|
||||||
|
stq $18, 4*8($30)
|
||||||
|
lda $1, FRAMESIZE($30) /* incoming sp value */
|
||||||
|
|
||||||
|
stq $1, 1*8($30)
|
||||||
|
stq $19, 5*8($30)
|
||||||
|
stq $20, 6*8($30)
|
||||||
|
mov $28, $16 /* link_map from .got.plt */
|
||||||
|
|
||||||
|
stq $21, 7*8($30)
|
||||||
|
mov $25, $17 /* offset of reloc entry */
|
||||||
|
stt $f16, 8*8($30)
|
||||||
|
mov $26, $18 /* return address */
|
||||||
|
|
||||||
|
stt $f17, 9*8($30)
|
||||||
|
mov $30, $19 /* La_alpha_regs address */
|
||||||
|
stt $f18, 10*8($30)
|
||||||
|
lda $20, 14*8($30) /* framesize address */
|
||||||
|
|
||||||
|
stt $f19, 11*8($30)
|
||||||
|
stt $f20, 12*8($30)
|
||||||
|
stt $f21, 13*8($30)
|
||||||
|
stq $28, 16*8($30)
|
||||||
|
stq $25, 17*8($30)
|
||||||
|
|
||||||
|
bsr $26, _dl_profile_fixup !samegp
|
||||||
|
mov $0, $27
|
||||||
|
|
||||||
|
/* Discover if we're wrapping this call. */
|
||||||
|
ldq $18, 14*8($30)
|
||||||
|
bge $18, 1f
|
||||||
|
|
||||||
|
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)
|
||||||
|
lda $30, FRAMESIZE($30)
|
||||||
|
jmp $31, ($27), 0
|
||||||
|
|
||||||
|
1:
|
||||||
|
/* Create a frame pointer and allocate a new argument frame. */
|
||||||
|
savei 15, 15*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, 14*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, 14*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, 16*8($15)
|
||||||
|
ldq $17, 17*8($15)
|
||||||
|
stq $0, 16*8($15)
|
||||||
|
lda $18, 0($15)
|
||||||
|
stq $1, 17*8($15)
|
||||||
|
lda $19, 16*8($15)
|
||||||
|
stt $f0, 18*8($15)
|
||||||
|
stt $f1, 19*8($15)
|
||||||
|
bsr $26, _dl_call_pltexit !samegp
|
||||||
|
|
||||||
|
mov $15, $30
|
||||||
|
cfi_def_cfa_register (30)
|
||||||
|
ldq $26, 0($30)
|
||||||
|
ldq $15, 15*8($30)
|
||||||
|
lda $30, FRAMESIZE($30)
|
||||||
|
ret
|
||||||
|
|
||||||
|
cfi_endproc
|
||||||
|
.size _dl_runtime_profile_new, .-_dl_runtime_profile_new
|
||||||
|
|
||||||
|
.align 4
|
||||||
|
.globl _dl_runtime_resolve_old
|
||||||
|
.ent _dl_runtime_resolve_old
|
||||||
|
|
||||||
#undef FRAMESIZE
|
#undef FRAMESIZE
|
||||||
#define FRAMESIZE 44*8
|
#define FRAMESIZE 44*8
|
||||||
|
|
||||||
_dl_runtime_resolve:
|
_dl_runtime_resolve_old:
|
||||||
lda $30, -FRAMESIZE($30)
|
lda $30, -FRAMESIZE($30)
|
||||||
.frame $30, FRAMESIZE, $26
|
.frame $30, FRAMESIZE, $26
|
||||||
/* Preserve all registers that C normally doesn't. */
|
/* Preserve all registers that C normally doesn't. */
|
||||||
@ -146,30 +335,21 @@ _dl_runtime_resolve:
|
|||||||
lda $30, FRAMESIZE($30)
|
lda $30, FRAMESIZE($30)
|
||||||
jmp $31, ($27)
|
jmp $31, ($27)
|
||||||
|
|
||||||
.end _dl_runtime_resolve
|
.end _dl_runtime_resolve_old
|
||||||
|
|
||||||
.globl _dl_runtime_profile
|
.globl _dl_runtime_profile_old
|
||||||
.usepv _dl_runtime_profile, no
|
.usepv _dl_runtime_profile_old, no
|
||||||
.type _dl_runtime_profile, @function
|
.type _dl_runtime_profile_old, @function
|
||||||
|
|
||||||
/* We save the registers in a different order than desired by
|
/* We save the registers in a different order than desired by
|
||||||
.mask/.fmask, so we have to use explicit cfi directives. */
|
.mask/.fmask, so we have to use explicit cfi directives. */
|
||||||
cfi_startproc
|
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
|
#undef FRAMESIZE
|
||||||
#define FRAMESIZE 50*8
|
#define FRAMESIZE 50*8
|
||||||
|
|
||||||
_dl_runtime_profile:
|
.align 4
|
||||||
|
_dl_runtime_profile_old:
|
||||||
lda $30, -FRAMESIZE($30)
|
lda $30, -FRAMESIZE($30)
|
||||||
cfi_adjust_cfa_offset (FRAMESIZE)
|
cfi_adjust_cfa_offset (FRAMESIZE)
|
||||||
|
|
||||||
@ -340,8 +520,8 @@ _dl_runtime_profile:
|
|||||||
ldgp $29, 0($26)
|
ldgp $29, 0($26)
|
||||||
|
|
||||||
/* Set up for call to _dl_call_pltexit. */
|
/* Set up for call to _dl_call_pltexit. */
|
||||||
ldq $16, 48($15)
|
ldq $16, 48*8($15)
|
||||||
ldq $17, 49($15)
|
ldq $17, 49*8($15)
|
||||||
stq $0, 46*8($15)
|
stq $0, 46*8($15)
|
||||||
lda $18, 0($15)
|
lda $18, 0($15)
|
||||||
stq $1, 47*8($15)
|
stq $1, 47*8($15)
|
||||||
@ -358,4 +538,4 @@ _dl_runtime_profile:
|
|||||||
ret
|
ret
|
||||||
|
|
||||||
cfi_endproc
|
cfi_endproc
|
||||||
.size _dl_runtime_profile, .-_dl_runtime_profile
|
.size _dl_runtime_profile_old, .-_dl_runtime_profile_old
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
.text
|
.text
|
||||||
.align 4
|
.align 4
|
||||||
.globl __reml
|
.globl __reml
|
||||||
.type __reml, @function
|
.type __reml, @funcnoplt
|
||||||
.usepv __reml, no
|
.usepv __reml, no
|
||||||
|
|
||||||
cfi_startproc
|
cfi_startproc
|
||||||
|
@ -43,7 +43,7 @@
|
|||||||
.text
|
.text
|
||||||
.align 4
|
.align 4
|
||||||
.globl __remq
|
.globl __remq
|
||||||
.type __remq, @function
|
.type __remq, @funcnoplt
|
||||||
.usepv __remq, no
|
.usepv __remq, no
|
||||||
|
|
||||||
cfi_startproc
|
cfi_startproc
|
||||||
|
@ -43,7 +43,7 @@
|
|||||||
.text
|
.text
|
||||||
.align 4
|
.align 4
|
||||||
.globl __remqu
|
.globl __remqu
|
||||||
.type __remqu, @function
|
.type __remqu, @funcnoplt
|
||||||
.usepv __remqu, no
|
.usepv __remqu, no
|
||||||
|
|
||||||
cfi_startproc
|
cfi_startproc
|
||||||
|
Loading…
Reference in New Issue
Block a user