aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog13
-rw-r--r--sysdeps/arm/__longjmp.S61
-rw-r--r--sysdeps/arm/bits/setjmp.h5
-rw-r--r--sysdeps/arm/include/bits/setjmp.h2
-rw-r--r--sysdeps/arm/setjmp.S12
5 files changed, 62 insertions, 31 deletions
diff --git a/ChangeLog b/ChangeLog
index 5789022..caa8917 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2014-02-25 Will Newton <will.newton@linaro.org>
+
+ * sysdeps/arm/__longjmp.S: Include stap-probe.h.
+ (__longjmp): Restore sp and lr before restoring callee
+ saved registers. Add longjmp and longjmp_target
+ SystemTap probe point.
+ * sysdeps/arm/bits/setjmp.h (__jmp_buf): Update comment.
+ * sysdeps/arm/include/bits/setjmp.h (__JMP_BUF_SP):
+ Define to zero to match jmpbuf layout.
+ * sysdeps/arm/setjmp.S: Include stap-probe.h.
+ (__sigsetjmp): Save sp and lr before saving callee
+ saved registers. Add setjmp SystemTap probe point.
+
2014-02-24 Stefan Liebler <stli@linux.vnet.ibm.com>
* sysdeps/s390/fpu/libm-test-ulps: Regenerate.
diff --git a/sysdeps/arm/__longjmp.S b/sysdeps/arm/__longjmp.S
index 27c57a1..08521e5 100644
--- a/sysdeps/arm/__longjmp.S
+++ b/sysdeps/arm/__longjmp.S
@@ -17,6 +17,7 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
+#include <stap-probe.h>
#include <bits/setjmp.h>
#include <rtld-global-offsets.h>
#include <arm-features.h>
@@ -25,31 +26,35 @@
ENTRY (__longjmp)
mov ip, r0
- movs r0, r1 /* get the return value in place */
- it eq
- moveq r0, #1 /* can't let setjmp() return zero! */
#ifdef CHECK_SP
sfi_breg ip, \
- ldr r4, [\B, #32] /* jmpbuf's sp */
+ ldr r4, [\B] /* jmpbuf's sp */
cfi_undefined (r4)
#ifdef PTR_DEMANGLE
PTR_DEMANGLE (r4, r4, a3, a4)
#endif
CHECK_SP (r4)
#endif
- sfi_sp sfi_breg ip, \
- ldmia \B!, JMP_BUF_REGLIST
+
#ifdef PTR_DEMANGLE
ldr a4, [ip], #4
- PTR_DEMANGLE (a4, a4, a3, a2)
- mov sp, a4
- ldr a4, [ip], #4
- PTR_DEMANGLE2 (lr, a4, a3)
+ PTR_DEMANGLE (a4, a4, a3, r4)
+ cfi_undefined (r4)
+ ldr r4, [ip], #4
+ PTR_DEMANGLE2 (r4, r4, a3)
#else
- ldr sp, [ip], #4
- ldr lr, [ip], #4
+ ldr a4, [ip], #4
+ ldr r4, [ip], #4
+ cfi_undefined (r4)
#endif
+ /* longjmp probe expects longjmp first argument (4@r0), second
+ argument (-4@r1), and target address (4@r4), respectively. */
+ LIBC_PROBE (longjmp, 3, 4@r0, -4@r1, 4@r4)
+ mov sp, a4
+ mov lr, r4
+ sfi_sp sfi_breg ip, \
+ ldmia \B!, JMP_BUF_REGLIST
cfi_restore (v1)
cfi_restore (v2)
cfi_restore (v3)
@@ -67,27 +72,27 @@ ENTRY (__longjmp)
#ifdef NEED_HWCAP
# ifdef IS_IN_rtld
- ldr a2, 1f
+ ldr a4, 1f
ldr a3, .Lrtld_local_ro
-0: add a2, pc, a2
- add a2, a2, a3
- ldr a2, [a2, #RTLD_GLOBAL_RO_DL_HWCAP_OFFSET]
+0: add a4, pc, a4
+ add a4, a4, a3
+ ldr a4, [a4, #RTLD_GLOBAL_RO_DL_HWCAP_OFFSET]
# else
# ifdef PIC
- ldr a2, 1f
+ ldr a4, 1f
ldr a3, .Lrtld_global_ro
-0: add a2, pc, a2
- ldr a2, [a2, a3]
- ldr a2, [a2, #RTLD_GLOBAL_RO_DL_HWCAP_OFFSET]
+0: add a4, pc, a4
+ ldr a4, [a4, a3]
+ ldr a4, [a4, #RTLD_GLOBAL_RO_DL_HWCAP_OFFSET]
# else
- ldr a2, .Lhwcap
- ldr a2, [a2, #0]
+ ldr a4, .Lhwcap
+ ldr a4, [a4, #0]
# endif
# endif
#endif
#ifdef __SOFTFP__
- tst a2, #HWCAP_ARM_VFP
+ tst a4, #HWCAP_ARM_VFP
beq .Lno_vfp
#endif
@@ -98,7 +103,7 @@ ENTRY (__longjmp)
.Lno_vfp:
#ifndef ARM_ASSUME_NO_IWMMXT
- tst a2, #HWCAP_ARM_IWMMXT
+ tst a4, #HWCAP_ARM_IWMMXT
beq .Lno_iwmmxt
/* Restore the call-preserved iWMMXt registers. */
@@ -118,6 +123,14 @@ ENTRY (__longjmp)
.Lno_iwmmxt:
#endif
+ /* longjmp_target probe expects longjmp first argument (4@r0), second
+ argument (-4@r1), and target address (4@r14), respectively. */
+ LIBC_PROBE (longjmp_target, 3, 4@r0, -4@r1, 4@r14)
+
+ movs r0, r1 /* get the return value in place */
+ it eq
+ moveq r0, #1 /* can't let setjmp() return zero! */
+
DO_RET(lr)
#ifdef NEED_HWCAP
diff --git a/sysdeps/arm/bits/setjmp.h b/sysdeps/arm/bits/setjmp.h
index 41423b2..a687359 100644
--- a/sysdeps/arm/bits/setjmp.h
+++ b/sysdeps/arm/bits/setjmp.h
@@ -28,9 +28,8 @@
/* The exact set of registers saved may depend on the particular core
in use, as some coprocessor registers may need to be saved. The C
Library ABI requires that the buffer be 8-byte aligned, and
- recommends that the buffer contain 64 words. The first 27 words
- are occupied by v1-v6, sl, fp, sp, pc, and d8-d15. (Note that
- d8-15 require 17 words, due to the use of fstmx.) */
+ recommends that the buffer contain 64 words. The first 26 words
+ are occupied by sp, lr, v1-v6, sl, fp, and d8-d15. */
typedef int __jmp_buf[64] __attribute__((__aligned__ (8)));
#endif
diff --git a/sysdeps/arm/include/bits/setjmp.h b/sysdeps/arm/include/bits/setjmp.h
index 220dfe8..5877c1f 100644
--- a/sysdeps/arm/include/bits/setjmp.h
+++ b/sysdeps/arm/include/bits/setjmp.h
@@ -30,7 +30,7 @@
# define JMP_BUF_REGLIST {v1-v6, sl, fp}
/* Index of __jmp_buf where the sp register resides. */
-# define __JMP_BUF_SP 8
+# define __JMP_BUF_SP 0
#endif
#endif /* include/bits/setjmp.h */
diff --git a/sysdeps/arm/setjmp.S b/sysdeps/arm/setjmp.S
index b0b45ed..5e55ca5 100644
--- a/sysdeps/arm/setjmp.S
+++ b/sysdeps/arm/setjmp.S
@@ -17,6 +17,7 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
+#include <stap-probe.h>
#include <bits/setjmp.h>
#include <rtld-global-offsets.h>
#include <arm-features.h>
@@ -27,9 +28,11 @@ ENTRY (__sigsetjmp)
#endif
mov ip, r0
- /* Save registers */
- sfi_breg ip, \
- stmia \B!, JMP_BUF_REGLIST
+ /* setjmp probe expects sigsetjmp first argument (4@r0), second
+ argument (-4@r1), and target address (4@r14), respectively. */
+ LIBC_PROBE (setjmp, 3, 4@r0, -4@r1, 4@r14)
+
+ /* Save sp and lr */
#ifdef PTR_MANGLE
mov a4, sp
PTR_MANGLE2 (a4, a4, a3)
@@ -40,6 +43,9 @@ ENTRY (__sigsetjmp)
str sp, [ip], #4
str lr, [ip], #4
#endif
+ /* Save registers */
+ sfi_breg ip, \
+ stmia \B!, JMP_BUF_REGLIST
#if !defined ARM_ASSUME_NO_IWMMXT || defined __SOFTFP__
# define NEED_HWCAP 1