diff options
-rw-r--r-- | ChangeLog | 16 | ||||
-rw-r--r-- | elf/sotruss-lib.c | 58 | ||||
-rw-r--r-- | sysdeps/sparc/sparc32/dl-machine.h | 6 | ||||
-rw-r--r-- | sysdeps/sparc/sparc32/dl-trampoline.S | 58 | ||||
-rw-r--r-- | sysdeps/sparc/sparc64/dl-trampoline.S | 43 |
5 files changed, 129 insertions, 52 deletions
@@ -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. diff --git a/elf/sotruss-lib.c b/elf/sotruss-lib.c index 542672692f..c2ab7330d4 100644 --- a/elf/sotruss-lib.c +++ b/elf/sotruss-lib.c @@ -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 diff --git a/sysdeps/sparc/sparc32/dl-machine.h b/sysdeps/sparc/sparc32/dl-machine.h index 1620ca54df..f85683d1b0 100644 --- a/sysdeps/sparc/sparc32/dl-machine.h +++ b/sysdeps/sparc/sparc32/dl-machine.h @@ -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 diff --git a/sysdeps/sparc/sparc32/dl-trampoline.S b/sysdeps/sparc/sparc32/dl-trampoline.S index 79ec79fe9e..44794592aa 100644 --- a/sysdeps/sparc/sparc32/dl-trampoline.S +++ b/sysdeps/sparc/sparc32/dl-trampoline.S @@ -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 diff --git a/sysdeps/sparc/sparc64/dl-trampoline.S b/sysdeps/sparc/sparc64/dl-trampoline.S index 7caece3430..7d74fd0af8 100644 --- a/sysdeps/sparc/sparc64/dl-trampoline.S +++ b/sysdeps/sparc/sparc64/dl-trampoline.S @@ -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 |