This is the mail archive of the libc-hacker@sourceware.org mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Hi, The attached patch is to add an SH version of ____longjmp_chk which was done for x86 and x86_64 recently. Regards, kaz -- 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. diff --git a/sysdeps/sh/____longjmp_chk.S b/sysdeps/sh/____longjmp_chk.S new file mode 100644 index 0000000..e17c1c2 --- /dev/null +++ b/sysdeps/sh/____longjmp_chk.S @@ -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" diff --git a/sysdeps/sh/sh3/__longjmp.S b/sysdeps/sh/sh3/__longjmp.S index c6d8a32..8c84aff 100644 --- a/sysdeps/sh/sh3/__longjmp.S +++ b/sysdeps/sh/sh3/__longjmp.S @@ -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 diff --git a/sysdeps/sh/sh4/__longjmp.S b/sysdeps/sh/sh4/__longjmp.S index 2fd137b..f2e4b75 100644 --- a/sysdeps/sh/sh4/__longjmp.S +++ b/sysdeps/sh/sh4/__longjmp.S @@ -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 Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |