This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix bugs in sparc PLT profiling register management, andadd sparc sotruss support.


This gets sparc sotruss working.  The dl_profile plt exit handling was
incorrect, from the register save area handling to the interpretation
of the framesize value set by the plt entry call.

Along the way I noticed that sotruss's plt exit handler was printing
the return value using the wrong format string.  It was using "0x%lu"
instead of "0x%lx".  So that's fixed here too.

Incidentally this gets the warnings emitting by the sparc builds down
to things that appear to be compiler issues.

Committed to master.

	* 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                             |   16 +++++++++
 elf/sotruss-lib.c                     |   58 +++++++++++++++++++++++++++++++-
 sysdeps/sparc/sparc32/dl-machine.h    |    6 +++-
 sysdeps/sparc/sparc32/dl-trampoline.S |   58 +++++++++++++++++---------------
 sysdeps/sparc/sparc64/dl-trampoline.S |   43 ++++++++++++------------
 5 files changed, 129 insertions(+), 52 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index dbc58e6..a07342d 100644
--- 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.
diff --git a/elf/sotruss-lib.c b/elf/sotruss-lib.c
index 5426726..c2ab733 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 1620ca5..f85683d 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 79ec79f..4479459 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 7caece3..7d74fd0 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
-- 
1.7.6.401.g6a319


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]