Add ____longjmp_chk for SH.
authorKaz Kojima <kkojima@rr.iij4u.or.jp>
Mon, 18 May 2009 22:44:09 +0000 (15:44 -0700)
committerUlrich Drepper <drepper@redhat.com>
Mon, 18 May 2009 22:44:09 +0000 (15:44 -0700)
Following the previous changes for x86 and x86-64.

ChangeLog
sysdeps/sh/____longjmp_chk.S [new file with mode: 0644]
sysdeps/sh/sh3/__longjmp.S
sysdeps/sh/sh4/__longjmp.S

index dfe26cf..d831dd5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2009-05-18  Kaz Kojima  <kkojima@rr.iij4u.or.jp>
+
+       * sysdeps/sh/____longjmp_chk.S: New file.
+       * sysdeps/sh/sh3/__longjmp.S: If CHECK_SP is defined, use it.
+       * sysdeps/sh/sh4/__longjmp.S: Likewise.
+                       
 2009-05-18  Jakub Jelinek  <jakub@redhat.com>
            Ulrich Drepper  <drepper@redhat.com>
 
diff --git a/sysdeps/sh/____longjmp_chk.S b/sysdeps/sh/____longjmp_chk.S
new file mode 100644 (file)
index 0000000..2ff4f58
--- /dev/null
@@ -0,0 +1,70 @@
+/* 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 Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+       .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 \
+       mov.l   .Lfail, r1;                             \
+       mov.l   .Lstr, r4;                              \
+       mova    .Lgot, r0;                              \
+       mov.l   .Lgot, r12;                             \
+       add     r0, r12;                                \
+       bsrf    r1;                                     \
+        add    r12, r4;                                \
+.Lfail0:                                               \
+       bra     0f;                                     \
+        nop;                                           \
+       .align  2;                                      \
+.Lgot:                                                 \
+       .long   _GLOBAL_OFFSET_TABLE_;                  \
+.Lstr:                                                 \
+       .long   longjmp_msg@GOTOFF;                     \
+.Lfail:                                                        \
+       .long   __GI___fortify_fail@PLT-(.Lfail0-.);    \
+0:
+#else
+# define CALL_FAIL \
+       mov.l   .Lfail, r1;                             \
+       mov.l   .Lstr, r4;                              \
+       jsr     @r1;                                    \
+        nop;                                           \
+       bra     0f;                                     \
+        nop;                                           \
+       .align  2;                                      \
+.Lstr:                                                 \
+       .long   longjmp_msg;                            \
+.Lfail:                                                        \
+       .long   __fortify_fail;                         \
+0:
+#endif
+
+#define CHECK_SP(reg) \
+       cmp/hs  r15, reg;                               \
+       bt      .Lok;                                   \
+       CALL_FAIL                                       \
+.Lok:
+
+#include <__longjmp.S>
index c6d8a32..8c84aff 100644 (file)
@@ -1,5 +1,5 @@
 /* longjmp for SH.
-   Copyright (C) 1999, 2000, 2005, 2006 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2000, 2005, 2006, 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
@@ -42,6 +42,9 @@ ENTRY (__longjmp)
        mov     r2, r14
        mov.l   @r4+, r2
        PTR_DEMANGLE2 (r2, r1)
+# ifdef CHECK_SP
+       CHECK_SP (r2)
+# endif
        mov     r2, r15
        mov.l   @r4+, r2
        PTR_DEMANGLE2 (r2, r1)
@@ -49,6 +52,10 @@ ENTRY (__longjmp)
        mov     #0, r1
 #else
        mov.l   @r4+, r14
+# ifdef CHECK_SP
+       mov.l   @r4, r2
+       CHECK_SP (r2)
+# endif
        mov.l   @r4+, r15
        lds.l   @r4+, pr
 #endif
index 2fd137b..f2e4b75 100644 (file)
@@ -42,6 +42,9 @@ ENTRY (__longjmp)
        mov     r2, r14
        mov.l   @r4+, r2
        PTR_DEMANGLE2 (r2, r1)
+# ifdef CHECK_SP
+       CHECK_SP (r2)
+# endif
        mov     r2, r15
        mov.l   @r4+, r2
        PTR_DEMANGLE2 (r2, r1)
@@ -49,6 +52,10 @@ ENTRY (__longjmp)
        mov     #0, r1
 #else
        mov.l   @r4+, r14
+# ifdef CHECK_SP
+       mov.l   @r4, r2
+       CHECK_SP (r2)
+# endif
        mov.l   @r4+, r15
        lds.l   @r4+, pr
 #endif