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:
David S. Miller 2012-03-09 20:48:06 -08:00
parent 9a07f9d01f
commit 2d2cd51564
5 changed files with 129 additions and 52 deletions

View File

@ -1,3 +1,19 @@
2012-03-09 David S. Miller <davem@davemloft.net>
* 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.
2012-03-10 Joseph Myers <joseph@codesourcery.com>
* sunrpc/Makefile (others): Add rpcgen.

View File

@ -1,5 +1,5 @@
/* Trace calls through PLTs and show caller, callee, and parameters.
Copyright (C) 2011 Free Software Foundation, Inc.
Copyright (C) 2011, 2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gmail.com>, 2011.
@ -288,6 +288,40 @@ la_x86_64_gnu_pltenter (Elf64_Sym *sym __attribute__ ((unused)),
return sym->st_value;
}
#elif defined __sparc__ && !defined __arch64__
Elf32_Addr
la_sparc32_gnu_pltenter (Elf32_Sym *sym __attribute__ ((unused)),
unsigned int ndx __attribute__ ((unused)),
uintptr_t *refcook, uintptr_t *defcook,
La_sparc32_regs *regs, unsigned int *flags,
const char *symname, long int *framesizep)
{
print_enter (refcook, defcook, symname,
regs->lr_reg[0], regs->lr_reg[1], regs->lr_reg[2],
*flags);
/* No need to copy anything, we will not need the parameters in any case. */
*framesizep = 0;
return sym->st_value;
}
#elif defined __sparc__ && defined __arch64__
Elf64_Addr
la_sparc64_gnu_pltenter (Elf64_Sym *sym __attribute__ ((unused)),
unsigned int ndx __attribute__ ((unused)),
uintptr_t *refcook, uintptr_t *defcook,
La_sparc64_regs *regs, unsigned int *flags,
const char *symname, long int *framesizep)
{
print_enter (refcook, defcook, symname,
regs->lr_reg[0], regs->lr_reg[1], regs->lr_reg[2],
*flags);
/* No need to copy anything, we will not need the parameters in any case. */
*framesizep = 0;
return sym->st_value;
}
#elif !defined HAVE_ARCH_PLTENTER
# warning "pltenter for architecture not supported"
#endif
@ -302,7 +336,7 @@ print_exit (uintptr_t *refcook, uintptr_t *defcook, const char *symname,
if (print_pid)
snprintf (buf, sizeof (buf), "%5ld: ", (long int) getpid ());
fprintf (out_file, "%s%15s -> %-15s:%s%s - 0x%lu\n",
fprintf (out_file, "%s%15s -> %-15s:%s%s - 0x%lx\n",
buf, (char *) *refcook, (char *) *defcook, " ", symname, reg);
}
@ -327,6 +361,26 @@ la_x86_64_gnu_pltexit (Elf64_Sym *sym, unsigned int ndx, uintptr_t *refcook,
return 0;
}
#elif defined __sparc__ && !defined __arch64__
unsigned int
la_sparc32_gnu_pltexit (Elf32_Sym *sym, unsigned int ndx, uintptr_t *refcook,
uintptr_t *defcook, const struct La_sparc32_regs *inregs,
struct La_sparc32_retval *outregs, const char *symname)
{
print_exit (refcook, defcook, symname, outregs->lrv_reg[0]);
return 0;
}
#elif defined __sparc__ && defined __arch64__
unsigned int
la_sparc64_gnu_pltexit (Elf64_Sym *sym, unsigned int ndx, uintptr_t *refcook,
uintptr_t *defcook, const struct La_sparc64_regs *inregs,
struct La_sparc64_retval *outregs, const char *symname)
{
print_exit (refcook, defcook, symname, outregs->lrv_reg[0]);
return 0;
}
#elif !defined HAVE_ARCH_PLTEXIT
# warning "pltexit for architecture not supported"
#endif

View File

@ -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

View File

@ -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

View File

@ -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