]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix bugs in sparc PLT profiling register management, and add sparc sotruss support.
authorDavid S. Miller <davem@davemloft.net>
Sat, 10 Mar 2012 04:48:06 +0000 (20:48 -0800)
committerDavid S. Miller <davem@davemloft.net>
Sat, 10 Mar 2012 04:48:06 +0000 (20:48 -0800)
* 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.

ChangeLog
elf/sotruss-lib.c
sysdeps/sparc/sparc32/dl-machine.h
sysdeps/sparc/sparc32/dl-trampoline.S
sysdeps/sparc/sparc64/dl-trampoline.S

index dbc58e6c0bbe773990bc83c5479027dfeb53da77..a07342dc8015dab28eb251153d0b7205349e23aa 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
index 542672692fe850bc69cc522581872bd09235dfd0..c2ab7330d4fb4ced74d4f7a487bf29cc02baded8 100644 (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
index 1620ca54dfba49d16bdc82a158b4e5eade825bdd..f85683d1b029b62508b923b10fcf881200c33332 100644 (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
index 79ec79fe9ea9775c72519a9ccc7c2c735aa59d51..44794592aa5addf9345356d984565108ab90eed7 100644 (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
index 7caece343077052852b0f5a146a19acbe105159a..7d74fd0af8437812bb3a74eac860636c36068ed8 100644 (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