Add CFI statements to ARM's assembly code.
[glibc.git] / sysdeps / unix / sysv / linux / arm / eabi / ____longjmp_chk.S
blob423e7776eae2b107ba8b18a742e5ca1781737f21
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 General Public License
15    along with GCC; see the file COPYING.  If not, write to the Free
16    Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
17    02110-1301, USA.  */
19 #include <sysdep.h>
21         .section .rodata.str1.1,"aMS",%progbits,1
22         .type   longjmp_msg,%object
23 longjmp_msg:
24         .string "longjmp causes uninitialized stack frame"
25         .size   longjmp_msg, .-longjmp_msg
26         .text
28 #define __longjmp ____longjmp_chk
30 #ifdef PIC
31 # define CALL_FAIL                                              \
32         ldr     sl, .L_GOT;                                     \
33         cfi_undefined (sl);                                     \
34 .L_GOT_OFF:                                                     \
35         add     sl, pc, sl;                                     \
36         ldr     r0, .Lstr;                                      \
37         add     r0, sl, r0;                                     \
38         B       PLTJMP(HIDDEN_JUMPTARGET(__fortify_fail));      \
39 .L_GOT:                                                         \
40         .word   _GLOBAL_OFFSET_TABLE_-(.L_GOT_OFF+8);           \
41 .Lstr:                                                          \
42         .word   longjmp_msg(GOTOFF);
43 #else
44 # define CALL_FAIL                                      \
45         ldr     r0, .Lstr;                              \
46         B       HIDDEN_JUMPTARGET(__fortify_fail);      \
47 .Lstr:                                                  \
48         .word   longjmp_msg;
49 #endif
51 #define CHECK_SP(reg)                           \
52         cfi_remember_state;                     \
53         cmp     sp, reg;                        \
54         bls     .Lok;                           \
55         mov     r5, r0;                         \
56         cfi_undefined (r5);                     \
57         mov     r7, #SYS_ify(sigaltstack);      \
58         cfi_undefined (r7);                     \
59         mov     r0, #0;                         \
60         sub     sp, sp, #16; /* >= sizeof (stack_t) */ \
61         cfi_adjust_cfa_offset (16);             \
62         cfi_remember_state;                     \
63         mov     r1, sp;                         \
64         swi     #0;                             \
65         cmp     r0, #0;                         \
66         bne     .Lok2;                          \
67         ldr     r1, [sp, #4];                   \
68         tst     r1, #1;                         \
69         beq     .Lfail;                         \
70         ldr     r2, [sp, #0];                   \
71         ldr     r3, [sp, #8];                   \
72         add     r2, r2, r3;                     \
73         sub     r2, r2, reg;                    \
74         cmp     r2, r3;                         \
75         bhi     .Lok2;                          \
76 .Lfail:                                         \
77         CALL_FAIL                               \
78         cfi_restore_state;                      \
79 .Lok2:                                          \
80         mov     r0, r5;                         \
81         cfi_restore_state;                      \
82 .Lok:
84 #include <__longjmp.S>