Add alternate signal stack support to ARM ____longjmp_chk.
authorJoseph Myers <joseph@codesourcery.com>
Thu, 6 Aug 2009 16:53:09 +0000 (16:53 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Thu, 6 Aug 2009 16:53:09 +0000 (16:53 +0000)
* sysdeps/arm/____longjmp_chk.S: Remove.  Replaced by....
* sysdeps/unix/sysv/linux/arm/____longjmp_chk.S,
sysdeps/unix/sysv/linux/arm/eabi/____longjmp_chk.S: This.  New
files.
* sysdeps/arm/__longjmp.S, sysdeps/arm/eabi/__longjmp.S: Use r4
for saved sp.

ChangeLog.arm
sysdeps/arm/__longjmp.S
sysdeps/arm/eabi/__longjmp.S
sysdeps/unix/sysv/linux/arm/____longjmp_chk.S [moved from sysdeps/arm/____longjmp_chk.S with 79% similarity]
sysdeps/unix/sysv/linux/arm/eabi/____longjmp_chk.S [new file with mode: 0644]

index fe87809..9df8b0f 100644 (file)
@@ -1,3 +1,12 @@
+2009-08-06  Joseph Myers  <joseph@codesourcery.com>
+
+       * sysdeps/arm/____longjmp_chk.S: Remove.  Replaced by....
+       * sysdeps/unix/sysv/linux/arm/____longjmp_chk.S,
+       sysdeps/unix/sysv/linux/arm/eabi/____longjmp_chk.S: This.  New
+       files.
+       * sysdeps/arm/__longjmp.S, sysdeps/arm/eabi/__longjmp.S: Use r4
+       for saved sp.
+
 2009-07-29  Aurelien Jarno  <aurelien@aurel32.net>
 
        * sysdeps/unix/sysv/linux/arm/kernel-features.h: Define
index c834e78..09e6386 100644 (file)
@@ -30,8 +30,8 @@ ENTRY (__longjmp)
        moveq   r0, #1          /* can't let setjmp() return zero! */
 
 #ifdef CHECK_SP
-       ldr     r1, [ip, #32]
-       CHECK_SP (r1)
+       ldr     r4, [ip, #32]
+       CHECK_SP (r4)
 #endif
        LOADREGS(ia, ip, {v1-v6, sl, fp, sp, pc})
 END (__longjmp)
index 1f3f791..f283297 100644 (file)
@@ -31,8 +31,8 @@ ENTRY (__longjmp)
        moveq   r0, #1          /* can't let setjmp() return zero! */
 
 #ifdef CHECK_SP
-       ldr     r1, [ip, #32]
-       CHECK_SP (r1)
+       ldr     r4, [ip, #32]
+       CHECK_SP (r4)
 #endif
        LOADREGS(ia, ip!, {v1-v6, sl, fp, sp, lr})
 
similarity index 79%
rename from sysdeps/arm/____longjmp_chk.S
rename to sysdeps/unix/sysv/linux/arm/____longjmp_chk.S
index 16fc4cd..2fa727d 100644 (file)
@@ -16,6 +16,7 @@
    Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.  */
 
+#include <sysdep.h>
 
        .section .rodata.str1.1,"aMS",%progbits,1
        .type   longjmp_msg,%object
@@ -47,9 +48,28 @@ longjmp_msg:
 #endif
 
 #define CHECK_SP(reg)                          \
-       cmp     sp, reg;                                \
+       cmp     sp, reg;                        \
        bls     .Lok;                           \
+       mov     r5, r0;                         \
+       mov     r0, #0;                         \
+       sub     sp, sp, #16;                    \
+       mov     r1, sp;                         \
+       swi     #SYS_ify(sigaltstack);          \
+       cmp     r0, #0;                         \
+       bne     .Lok2;                          \
+       ldr     r1, [sp, #4];                   \
+       tst     r1, #1;                         \
+       beq     .Lfail;                         \
+       ldr     r2, [sp, #0];                   \
+       ldr     r3, [sp, #8];                   \
+       add     r2, r2, r3;                     \
+       sub     r2, r2, reg;                    \
+       cmp     r2, r3;                         \
+       bhi     .Lok2;                          \
+.Lfail:                                                \
        CALL_FAIL                               \
+.Lok2:                                         \
+       mov     r0, r5;                         \
 .Lok:
 
 #include <__longjmp.S>
diff --git a/sysdeps/unix/sysv/linux/arm/eabi/____longjmp_chk.S b/sysdeps/unix/sysv/linux/arm/eabi/____longjmp_chk.S
new file mode 100644 (file)
index 0000000..f92a382
--- /dev/null
@@ -0,0 +1,76 @@
+/* Copyright (C) 2009 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
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GCC; see the file COPYING.  If not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.  */
+
+#include <sysdep.h>
+
+       .section .rodata.str1.1,"aMS",%progbits,1
+       .type   longjmp_msg,%object
+longjmp_msg:
+       .string "longjmp causes uninitialized stack frame"
+       .size   longjmp_msg, .-longjmp_msg
+       .text
+
+#define __longjmp ____longjmp_chk
+
+#ifdef PIC
+# define CALL_FAIL                                             \
+       ldr     sl, .L_GOT;                                     \
+.L_GOT_OFF:                                                    \
+       add     sl, pc, sl;                                     \
+       ldr     r0, .Lstr;                                      \
+       add     r0, sl, r0;                                     \
+       B       PLTJMP(HIDDEN_JUMPTARGET(__fortify_fail));      \
+.L_GOT:                                                                \
+       .word   _GLOBAL_OFFSET_TABLE_-(.L_GOT_OFF+8);           \
+.Lstr:                                                         \
+       .word   longjmp_msg(GOTOFF);
+#else
+# define CALL_FAIL                                     \
+       ldr     r0, .Lstr;                              \
+       B       HIDDEN_JUMPTARGET(__fortify_fail);      \
+.Lstr:                                                 \
+       .word   longjmp_msg;
+#endif
+
+#define CHECK_SP(reg)                          \
+       cmp     sp, reg;                        \
+       bls     .Lok;                           \
+       mov     r5, r0;                         \
+       mov     r7, #SYS_ify(sigaltstack);      \
+       mov     r0, #0;                         \
+       sub     sp, sp, #16;                    \
+       mov     r1, sp;                         \
+       swi     #0;                             \
+       cmp     r0, #0;                         \
+       bne     .Lok2;                          \
+       ldr     r1, [sp, #4];                   \
+       tst     r1, #1;                         \
+       beq     .Lfail;                         \
+       ldr     r2, [sp, #0];                   \
+       ldr     r3, [sp, #8];                   \
+       add     r2, r2, r3;                     \
+       sub     r2, r2, reg;                    \
+       cmp     r2, r3;                         \
+       bhi     .Lok2;                          \
+.Lfail:                                                \
+       CALL_FAIL                               \
+.Lok2:                                         \
+       mov     r0, r5;                         \
+.Lok:
+
+#include <__longjmp.S>