From 15efafdf07789322219cc8f938ac758f932fe208 Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Sat, 22 Aug 2009 02:01:51 -0700 Subject: Add sigstack handling to Linux ____longjmp_chk on powerpc. --- .../sysv/linux/powerpc/powerpc64/____longjmp_chk.S | 69 ++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc64/____longjmp_chk.S (limited to 'sysdeps/unix/sysv/linux/powerpc/powerpc64') 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 +#include + + .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> -- cgit 1.4.1