aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/sparc/sparc64
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2012-03-09 20:48:06 -0800
committerDavid S. Miller <davem@davemloft.net>2012-03-09 20:48:06 -0800
commit2d2cd51564c7fa6f82677e9f4baab8e6996380b5 (patch)
tree0a4ddd2c985725ef6138a1cc38b652df985834d5 /sysdeps/sparc/sparc64
parent9a07f9d01f1689e99e89bbb5ec48e6930da755f1 (diff)
downloadglibc-2d2cd51564c7fa6f82677e9f4baab8e6996380b5.tar
glibc-2d2cd51564c7fa6f82677e9f4baab8e6996380b5.tar.gz
glibc-2d2cd51564c7fa6f82677e9f4baab8e6996380b5.tar.bz2
glibc-2d2cd51564c7fa6f82677e9f4baab8e6996380b5.zip
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.
Diffstat (limited to 'sysdeps/sparc/sparc64')
-rw-r--r--sysdeps/sparc/sparc64/dl-trampoline.S43
1 files changed, 21 insertions, 22 deletions
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