diff options
Diffstat (limited to 'sysdeps/unix/sysv')
-rw-r--r-- | sysdeps/unix/sysv/linux/powerpc/powerpc32/____longjmp_chk.S | 85 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/powerpc/powerpc64/____longjmp_chk.S | 69 |
2 files changed, 154 insertions, 0 deletions
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/____longjmp_chk.S b/sysdeps/unix/sysv/linux/powerpc/powerpc32/____longjmp_chk.S new file mode 100644 index 0000000000..4cb968505d --- /dev/null +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/____longjmp_chk.S @@ -0,0 +1,85 @@ +/* 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. */ + +#include <sysdep.h> +#include <rtld-global-offsets.h> + + .section .rodata.str1.4,"aMS",@progbits,1 + .align 2 +.LC0: + .string "longjmp causes uninitialized stack frame" + .text + +#define __longjmp ____longjmp_chk + +#ifdef PIC +# ifdef HAVE_ASM_PPC_REL16 +# define LOAD_ARG \ + bcl 20,31,1f; \ +1: mflr r3; \ + addis r3,r3,_GLOBAL_OFFSET_TABLE_-1b@ha; \ + addi r3,r3,_GLOBAL_OFFSET_TABLE_-1b@l; \ + lwz r3,.LC0@got(r3) +# else +# define LOAD_ARG \ + bl _GLOBAL_OFFSET_TABLE_-4@local; \ + mflr r3; \ + lwz r3,.LC0@got(r3) +# endif +#else +# define LOAD_ARG \ + lis r3,.LC0@ha; \ + la r3,.LC0@l(r3) +#endif + +#define CHECK_SP(reg) \ + cmplw reg, r1; \ + bge+ .Lok; \ + mflr r0; \ + stwu r1,-32(r1); \ + cfi_remember_state; \ + cfi_adjust_cfa_offset (32); \ + stw r0,36(r1); \ + cfi_offset (lr, 4); \ + mr r31,r3; \ + mr r30,r4; \ + li r3,0; \ + addi r4,r1,8; \ + li r0,__NR_sigaltstack; \ + sc; \ + /* Without working sigaltstack we cannot perform the test. */ \ + bso .Lok2; \ + lwz r0,12(r1); \ + andi. r3,r0,1; \ + beq .Lfail; \ + lwz r0,16(r1); \ + lwz r3,8(r1); \ + add r3,r3,r0; \ + sub r3,r3,reg; \ + cmplw r3,r0; \ + bge+ .Lok2; \ +.Lfail: \ + LOAD_ARG; \ + bl HIDDEN_JUMPTARGET (__fortify_fail); \ +.Lok2: \ + mr r3,r31; \ + mr r4,r30; \ + cfi_restore_state; \ +.Lok: + +#include <__longjmp-common.S> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/____longjmp_chk.S b/sysdeps/unix/sysv/linux/powerpc/powerpc64/____longjmp_chk.S new file mode 100644 index 0000000000..936ace5f69 --- /dev/null +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/____longjmp_chk.S @@ -0,0 +1,69 @@ +/* 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. */ + +#include <sysdep.h> +#include <rtld-global-offsets.h> + + .section .rodata.str1.8,"aMS",@progbits,1 + .align 3 +.LC0: + .string "longjmp causes uninitialized stack frame" + .section .toc,"aw" +.LC1: + .tc .LC0[TC],.LC0 + .text + +#define __longjmp ____longjmp_chk + +#define CHECK_SP(reg) \ + cmpld reg, r1; \ + bge+ .Lok; \ + mflr r0; \ + std r0,16(r1); \ + mr r31,r3; \ + mr r30,r4; \ + stdu r1,-144(r1); \ + cfi_remember_state; \ + cfi_adjust_cfa_offset (144); \ + cfi_offset (lr, 16); \ + li r3,0; \ + addi r4,r1,112; \ + li r0,__NR_sigaltstack; \ + sc; \ + /* Without working sigaltstack we cannot perform the test. */ \ + bso .Lok2; \ + lwz r0,112+8(r1); \ + andi. r4,r0,1; \ + beq .Lfail; \ + ld r0,112+16(r1); \ + ld r4,112(r1); \ + add r4,r4,r0; \ + sub r3,r3,reg; \ + cmpld r3,r0; \ + bge+ .Lok2; \ +.Lfail: \ + ld r3,.LC1@toc(2); \ + bl HIDDEN_JUMPTARGET (__fortify_fail); \ + nop; \ +.Lok2: \ + mr r3,r31; \ + mr r4,r30; \ + cfi_restore_state; \ +.Lok: + +#include <__longjmp-common.S> |