mirror of
https://sourceware.org/git/glibc.git
synced 2026-01-06 11:51:29 +03:00
Fix bugs in sparc PLT profiling register management, and add sparc sotruss support.
* sysdeps/sparc/sparc32/dl-machine.h (elf_machine_rela): Protect local variables with appropriate CPP guards. * sysdeps/sparc/sparc32/dl-trampoline.S: Propagate the stack_ptr from the frame pointer, not the stack pointer. Correct layout comments. Fix test on resulting framesize and the management of the outregs buffer for pltexit. Preserve floating point return values across _dl_call_pltexit call. * sysdeps/sparc/sparc64/dl-trampoline.S: Fix test on resulting framesize and the management of the outregs buffer for pltexit. Preserve floating point return values across _dl_call_pltexit call. * elf/sotruss-lib.c (la_sparc32_gnu_pltenter, la_sparc64_gnu_pltenter, la_sparc32_gnu_pltexit, la_sparc64_gnu_pltexit): New functions. (print_exit): Fix format string for return register value.
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/* Machine-dependent ELF dynamic relocation inline functions. SPARC version.
|
||||
Copyright (C) 1996-2003, 2004, 2005, 2006, 2007, 2010, 2011
|
||||
Copyright (C) 1996-2003, 2004, 2005, 2006, 2007, 2010, 2011, 2012
|
||||
Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
@@ -341,10 +341,14 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
||||
void *const reloc_addr_arg, int skip_ifunc)
|
||||
{
|
||||
Elf32_Addr *const reloc_addr = reloc_addr_arg;
|
||||
#if !defined RTLD_BOOTSTRAP && !defined RESOLVE_CONFLICT_FIND_MAP
|
||||
const Elf32_Sym *const refsym = sym;
|
||||
#endif
|
||||
Elf32_Addr value;
|
||||
const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
|
||||
#if !defined RESOLVE_CONFLICT_FIND_MAP
|
||||
struct link_map *sym_map = NULL;
|
||||
#endif
|
||||
|
||||
#if !defined RTLD_BOOTSTRAP && !defined HAVE_Z_COMBRELOC
|
||||
/* This is defined in rtld.c, but nowhere in the static libc.a; make the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* PLT trampolines. Sparc 32-bit version.
|
||||
Copyright (C) 2005 Free Software Foundation, Inc.
|
||||
Copyright (C) 2005, 2012 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
|
||||
@@ -48,17 +48,20 @@ _dl_runtime_resolve:
|
||||
.size _dl_runtime_resolve, .-_dl_runtime_resolve
|
||||
|
||||
/* For the profiling cases we pass in our stack frame
|
||||
* as the base of the La_sparc64_regs, so it looks
|
||||
* as the base of the La_sparc32_regs, so it looks
|
||||
* like:
|
||||
* %l0 %sp
|
||||
* %l0 %sp + (0 * 8)
|
||||
* %l1 %sp + (0 * 8) + 4
|
||||
* ...
|
||||
* %l7 %sp + (7 * 8)
|
||||
* %i0 %sp + (8 * 8)
|
||||
* %l6 %sp + (3 * 8)
|
||||
* %l7 %sp + (3 * 8) + 4
|
||||
* %i0 %sp + (4 * 8)
|
||||
* %i1 %sp + (4 * 8) + 4
|
||||
* ...
|
||||
* %i7 %sp + (15 * 8)
|
||||
* %f0 %sp + (16 * 8)
|
||||
* %f16 %sp + (31 * 8)
|
||||
* framesize %sp + (32 * 8)
|
||||
* %i6 %sp + (7 * 8)
|
||||
* %i7 %sp + (7 * 8) + 4
|
||||
* struct_ret_ptr %sp + (8 * 8)
|
||||
* framesize %sp + (9 * 8)
|
||||
*/
|
||||
|
||||
.globl _dl_profile_save_regs
|
||||
@@ -74,7 +77,7 @@ _dl_profile_save_regs:
|
||||
std %i2, [%sp + ( 5 * 8)]
|
||||
std %i4, [%sp + ( 6 * 8)]
|
||||
std %i6, [%sp + ( 7 * 8)]
|
||||
ld [%sp + (8 * 8)], %l4
|
||||
ld [%fp + (8 * 8)], %l4
|
||||
retl
|
||||
st %l4, [%sp + (8 * 8)]
|
||||
|
||||
@@ -91,8 +94,11 @@ _dl_profile_save_regs:
|
||||
_dl_profile_invoke:
|
||||
cfi_startproc
|
||||
|
||||
sub %sp, %l0, %sp
|
||||
1:
|
||||
add %l0, 7, %l0
|
||||
andn %l0, 7, %l0
|
||||
add %l0, 2 * 8, %g1
|
||||
|
||||
sub %sp, %g1, %sp
|
||||
srl %l0, 3, %l7
|
||||
mov %o0, %l1
|
||||
mov %i0, %o0
|
||||
@@ -101,8 +107,10 @@ _dl_profile_invoke:
|
||||
mov %i3, %o3
|
||||
mov %i4, %o4
|
||||
mov %i5, %o5
|
||||
cmp %l0, 0
|
||||
mov %fp, %l2
|
||||
mov %sp, %l3
|
||||
be 2f
|
||||
add %sp, (11 * 8), %l3
|
||||
1: ldd [%l2], %g2
|
||||
add %l2, 0x8, %l2
|
||||
subcc %l7, 1, %l7
|
||||
@@ -110,7 +118,7 @@ _dl_profile_invoke:
|
||||
bne 1b
|
||||
add %l3, 0x8, %l3
|
||||
|
||||
jmpl %l1, %o7
|
||||
2: jmpl %l1, %o7
|
||||
nop
|
||||
|
||||
std %o0, [%sp + ( 9 * 8)]
|
||||
@@ -118,11 +126,12 @@ _dl_profile_invoke:
|
||||
|
||||
mov %l5, %o0
|
||||
mov %l6, %o1
|
||||
add %sp, %l0, %o2
|
||||
add %sp, (11 * 8), %o2
|
||||
call _dl_call_pltexit
|
||||
add %sp, (16 * 8), %o3
|
||||
add %sp, ( 9 * 8), %o3
|
||||
|
||||
ldd [%sp + (9 * 8)], %i0
|
||||
ldd [%sp + ( 9 * 8)], %i0
|
||||
ldd [%sp + (10 * 8)], %f0
|
||||
|
||||
jmpl %i7 + 8, %g0
|
||||
restore
|
||||
@@ -142,11 +151,7 @@ _dl_profile_invoke:
|
||||
_dl_runtime_profile:
|
||||
cfi_startproc
|
||||
|
||||
cmp %fp, 0
|
||||
be,a 1f
|
||||
mov 104, %g3
|
||||
sub %fp, %sp, %g3
|
||||
1: save %sp, -104, %sp
|
||||
save %sp, -104, %sp
|
||||
cfi_def_cfa_register(%fp)
|
||||
cfi_window_save
|
||||
cfi_register(%o7, %i7)
|
||||
@@ -156,20 +161,19 @@ _dl_runtime_profile:
|
||||
mov %i7, %o2
|
||||
sub %o1, 4*12, %o1
|
||||
|
||||
mov %g3, %l0
|
||||
mov %o0, %l5
|
||||
mov %o1, %l6
|
||||
|
||||
call _dl_profile_save_regs
|
||||
call _dl_profile_save_regs
|
||||
nop
|
||||
|
||||
mov %sp, %o3
|
||||
call _dl_profile_fixup
|
||||
add %sp, (9 * 8), %o4
|
||||
|
||||
ld [%sp + (9 * 8)], %o1
|
||||
cmp %o1, 0
|
||||
bgeu 1f
|
||||
ld [%sp + (9 * 8)], %l0
|
||||
cmp %l0, 0
|
||||
bl 1f
|
||||
nop
|
||||
|
||||
call _dl_profile_invoke
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* PLT trampolines. Sparc 64-bit version.
|
||||
Copyright (C) 2005 Free Software Foundation, Inc.
|
||||
Copyright (C) 2005, 2012 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
|
||||
@@ -158,8 +158,11 @@ _dl_profile_save_regs:
|
||||
_dl_profile_invoke:
|
||||
cfi_startproc
|
||||
|
||||
sub %sp, %l0, %sp
|
||||
1:
|
||||
add %l0, 7, %l0
|
||||
andn %l0, 7, %l0
|
||||
add %l0, (8 * 8), %g1
|
||||
|
||||
sub %sp, %g1, %sp
|
||||
srlx %l0, 3, %l7
|
||||
mov %o0, %l1
|
||||
mov %i0, %o0
|
||||
@@ -169,7 +172,8 @@ _dl_profile_invoke:
|
||||
mov %i4, %o4
|
||||
mov %i5, %o5
|
||||
add %fp, STACK_BIAS, %l2
|
||||
add %sp, STACK_BIAS, %l3
|
||||
brz %l0, 2f
|
||||
add %sp, STACK_BIAS, %l3
|
||||
1: ldx [%l2], %l4
|
||||
add %l2, 0x8, %l2
|
||||
subcc %l7, 1, %l7
|
||||
@@ -177,7 +181,7 @@ _dl_profile_invoke:
|
||||
bne,pt %xcc, 1b
|
||||
add %l3, 0x8, %l3
|
||||
|
||||
jmpl %l1, %o7
|
||||
2: jmpl %l1, %o7
|
||||
nop
|
||||
|
||||
stx %o0, [%sp + STACK_BIAS + (16 * 8)]
|
||||
@@ -191,15 +195,18 @@ _dl_profile_invoke:
|
||||
|
||||
mov %l5, %o0
|
||||
mov %l6, %o1
|
||||
add %sp, %l0, %o2
|
||||
add %sp, STACK_BIAS + (16 * 8), %o3
|
||||
add %sp, STACK_BIAS + (24 * 8), %o2
|
||||
call _dl_call_pltexit
|
||||
add %o2, STACK_BIAS, %o2
|
||||
add %sp, STACK_BIAS + (16 * 8), %o3
|
||||
|
||||
ldx [%sp + STACK_BIAS + (16 * 8)], %i0
|
||||
ldx [%sp + STACK_BIAS + (17 * 8)], %i1
|
||||
ldx [%sp + STACK_BIAS + (18 * 8)], %i2
|
||||
ldx [%sp + STACK_BIAS + (19 * 8)], %i3
|
||||
ldd [%sp + STACK_BIAS + (20 * 8)], %f0
|
||||
ldd [%sp + STACK_BIAS + (21 * 8)], %f2
|
||||
ldd [%sp + STACK_BIAS + (22 * 8)], %f4
|
||||
ldd [%sp + STACK_BIAS + (23 * 8)], %f8
|
||||
|
||||
jmpl %i7 + 8, %g0
|
||||
restore
|
||||
@@ -219,10 +226,7 @@ _dl_profile_invoke:
|
||||
_dl_runtime_profile_0:
|
||||
cfi_startproc
|
||||
|
||||
brz,a,pn %fp, 1f
|
||||
mov 192, %g5
|
||||
sub %fp, %sp, %g5
|
||||
1: save %sp, -336, %sp
|
||||
save %sp, -336, %sp
|
||||
cfi_def_cfa_register(%fp)
|
||||
cfi_window_save
|
||||
cfi_register(%o7, %i7)
|
||||
@@ -250,7 +254,6 @@ _dl_runtime_profile_0:
|
||||
mov %i7, %o2
|
||||
sllx %l0, 3, %o1
|
||||
|
||||
mov %g5, %l0
|
||||
mov %o0, %l5
|
||||
mov %o1, %l6
|
||||
|
||||
@@ -261,8 +264,8 @@ _dl_runtime_profile_0:
|
||||
call _dl_profile_fixup
|
||||
add %sp, (STACK_BIAS + (32 * 8)), %o4
|
||||
|
||||
ldx [%sp + STACK_BIAS + (32 * 8)], %o1
|
||||
brgez,pt %o1, 1f
|
||||
ldx [%sp + STACK_BIAS + (32 * 8)], %l0
|
||||
brlz,pt %l0, 1f
|
||||
nop
|
||||
|
||||
call _dl_profile_invoke
|
||||
@@ -285,10 +288,7 @@ _dl_runtime_profile_0:
|
||||
_dl_runtime_profile_1:
|
||||
cfi_startproc
|
||||
|
||||
brz,a,pn %fp, 1f
|
||||
mov 192, %g5
|
||||
sub %fp, %sp, %g5
|
||||
1: save %sp, -336, %sp
|
||||
save %sp, -336, %sp
|
||||
cfi_def_cfa_register(%fp)
|
||||
cfi_window_save
|
||||
cfi_register(%o7, %i7)
|
||||
@@ -300,7 +300,6 @@ _dl_runtime_profile_1:
|
||||
mov %i7, %o2
|
||||
add %o1, %o3, %o1
|
||||
|
||||
mov %g5, %l0
|
||||
mov %o0, %l5
|
||||
mov %o1, %l6
|
||||
|
||||
@@ -311,8 +310,8 @@ _dl_runtime_profile_1:
|
||||
call _dl_profile_fixup
|
||||
add %sp, (STACK_BIAS + (32 * 8)), %o4
|
||||
|
||||
ldx [%sp + STACK_BIAS + (32 * 8)], %o1
|
||||
brgez,pt %o1, 1f
|
||||
ldx [%sp + STACK_BIAS + (32 * 8)], %l0
|
||||
brlz,pt %l0, 1f
|
||||
nop
|
||||
|
||||
call _dl_profile_invoke
|
||||
|
||||
Reference in New Issue
Block a user