summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Schwab <aschwab@redhat.com>2009-06-26 17:10:59 +0200
committerAndreas Schwab <aschwab@redhat.com>2009-06-26 17:10:59 +0200
commitbb8723997676e11a0f7f2b3bf61fedf761da9a2a (patch)
tree8bef03cd9cbe74b11e08b604c32f01777e39cb0c
parenta879c2cb1753c3aa868aa1e9d2107e9f0deb0dc2 (diff)
Allow backtracing through ____longjmp_chk.
-rw-r--r--ChangeLog7
-rw-r--r--sysdeps/powerpc/powerpc32/____longjmp_chk.S8
-rw-r--r--sysdeps/powerpc/powerpc64/____longjmp_chk.S8
3 files changed, 23 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 00c46a1038..dd08e60249 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2009-06-26 Andreas Schwab <aschwab@redhat.com>
+
+ * sysdeps/powerpc/powerpc32/____longjmp_chk.S (CHECK_SP): Save lr
+ before call.
+ * sysdeps/powerpc/powerpc64/____longjmp_chk.S (CHECK_SP):
+ Likewise.
+
2009-06-26 Ulrich Drepper <drepper@redhat.com>
* resolv/resolv.h: Define RES_SNGLKUPREOP.
diff --git a/sysdeps/powerpc/powerpc32/____longjmp_chk.S b/sysdeps/powerpc/powerpc32/____longjmp_chk.S
index 510ce5250d..128899a532 100644
--- a/sysdeps/powerpc/powerpc32/____longjmp_chk.S
+++ b/sysdeps/powerpc/powerpc32/____longjmp_chk.S
@@ -49,8 +49,16 @@
#define CHECK_SP(reg) \
cmplw reg, r1; \
bge+ .Lok; \
+ cfi_remember_state; \
+ mflr r0; \
+ stwu r1,-16(r1); \
+ cfi_adjust_cfa_offset (16); \
+ stw r0,20(r1); \
+ cfi_offset (lr, 4); \
LOAD_ARG; \
bl HIDDEN_JUMPTARGET (__fortify_fail); \
+ nop; \
+ cfi_restore_state; \
.Lok:
#include <__longjmp-common.S>
diff --git a/sysdeps/powerpc/powerpc64/____longjmp_chk.S b/sysdeps/powerpc/powerpc64/____longjmp_chk.S
index 56549021aa..f1b7d85e46 100644
--- a/sysdeps/powerpc/powerpc64/____longjmp_chk.S
+++ b/sysdeps/powerpc/powerpc64/____longjmp_chk.S
@@ -32,8 +32,16 @@
#define CHECK_SP(reg) \
cmpld reg, r1; \
bge+ .Lok; \
+ cfi_remember_state; \
+ mflr r0; \
+ std r0,16(r1); \
+ stdu r1,-112(r1); \
+ cfi_adjust_cfa_offset (112); \
+ cfi_offset (lr, 16); \
ld r3,.LC1@toc(2); \
bl HIDDEN_JUMPTARGET (__fortify_fail); \
+ nop; \
+ cfi_restore_state; \
.Lok:
#include <__longjmp-common.S>