Update copyright notices with scripts/update-copyrights
[glibc.git] / sysdeps / unix / sysv / linux / powerpc / powerpc64 / ____longjmp_chk.S
blobdc9c8540ff43043079378af17f047df8b0fa59cf
1 /* Copyright (C) 2009-2014 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <http://www.gnu.org/licenses/>.  */
18 #include <sysdep.h>
19 #include <rtld-global-offsets.h>
21         .section .rodata.str1.8,"aMS",@progbits,1
22         .align 3
23 .LC0:
24         .string "longjmp causes uninitialized stack frame"
25         .section .toc,"aw"
26 .LC1:
27         .tc .LC0[TC],.LC0
28         .text
30 #define __longjmp ____longjmp_chk
32 #define CHECK_SP(reg) \
33         cmpld   reg, r1;                                \
34         bge+    .Lok;                                   \
35         mflr    r0;                                     \
36         std     r0,FRAME_LR_SAVE(r1);                   \
37         mr      r31,r3;                                 \
38         mr      r30,r4;                                 \
39         stdu    r1,-FRAME_MIN_SIZE-32(r1);              \
40         cfi_remember_state;                             \
41         cfi_adjust_cfa_offset (FRAME_MIN_SIZE+32);      \
42         cfi_offset (lr, FRAME_LR_SAVE);                 \
43         li      r3,0;                                   \
44         addi    r4,r1,FRAME_MIN_SIZE;                   \
45         li      r0,__NR_sigaltstack;                    \
46         sc;                                             \
47         /* Without working sigaltstack we cannot perform the test.  */ \
48         bso     .Lok2;                                  \
49         lwz     r0,FRAME_MIN_SIZE+8(r1);                \
50         andi.   r4,r0,1;                                \
51         beq     .Lfail;                                 \
52         ld      r0,FRAME_MIN_SIZE+16(r1);               \
53         ld      r4,FRAME_MIN_SIZE(r1);                  \
54         add     r4,r4,r0;                               \
55         sub     r3,r3,reg;                              \
56         cmpld   r3,r0;                                  \
57         bge+    .Lok2;                                  \
58 .Lfail:                                                 \
59         ld      r3,.LC1@toc(2);                         \
60         bl      HIDDEN_JUMPTARGET (__fortify_fail);     \
61         nop;                                            \
62 .Lok2:                                                  \
63         mr      r3,r31;                                 \
64         mr      r4,r30;                                 \
65         cfi_restore_state;                              \
66 .Lok:
68 #include <__longjmp-common.S>