Cleanup old obsolete PPC_REL16 checks
[glibc.git] / sysdeps / unix / sysv / linux / powerpc / powerpc32 / ____longjmp_chk.S
blobcfd9864f63515517dfdbe0277bf48113dab1db97
1 /* Copyright (C) 2009 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, write to the Free
16    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17    02111-1307 USA.  */
19 #include <sysdep.h>
20 #include <rtld-global-offsets.h>
22         .section .rodata.str1.4,"aMS",@progbits,1
23         .align 2
24 .LC0:
25         .string "longjmp causes uninitialized stack frame"
26         .text
28 #define __longjmp ____longjmp_chk
30 #ifdef PIC
31 #  define LOAD_ARG \
32         bcl     20,31,1f;                               \
33 1:      mflr    r3;                                     \
34         addis   r3,r3,_GLOBAL_OFFSET_TABLE_-1b@ha;      \
35         addi    r3,r3,_GLOBAL_OFFSET_TABLE_-1b@l;       \
36         lwz     r3,.LC0@got(r3)
37 #else
38 # define LOAD_ARG \
39         lis     r3,.LC0@ha;                             \
40         la      r3,.LC0@l(r3)
41 #endif
43 #define CHECK_SP(reg) \
44         cmplw   reg, r1;                                \
45         bge+    .Lok;                                   \
46         mflr    r0;                                     \
47         stwu    r1,-32(r1);                             \
48         cfi_remember_state;                             \
49         cfi_adjust_cfa_offset (32);                     \
50         stw     r0,36(r1);                              \
51         cfi_offset (lr, 4);                             \
52         mr      r31,r3;                                 \
53         mr      r30,r4;                                 \
54         li      r3,0;                                   \
55         addi    r4,r1,8;                                \
56         li      r0,__NR_sigaltstack;                    \
57         sc;                                             \
58         /* Without working sigaltstack we cannot perform the test.  */ \
59         bso     .Lok2;                                  \
60         lwz     r0,12(r1);                              \
61         andi.   r3,r0,1;                                \
62         beq     .Lfail;                                 \
63         lwz     r0,16(r1);                              \
64         lwz     r3,8(r1);                               \
65         add     r3,r3,r0;                               \
66         sub     r3,r3,reg;                              \
67         cmplw   r3,r0;                                  \
68         bge+    .Lok2;                                  \
69 .Lfail:                                                 \
70         LOAD_ARG;                                       \
71         bl      HIDDEN_JUMPTARGET (__fortify_fail);     \
72 .Lok2:                                                  \
73         mr      r3,r31;                                 \
74         mr      r4,r30;                                 \
75         cfi_restore_state;                              \
76 .Lok:
78 #include <__longjmp-common.S>