1 | /* Copyright (C) 2009-2022 Free Software Foundation, Inc. |
2 | This file is part of the GNU C Library. |
3 | |
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. |
8 | |
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. |
13 | |
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 | <https://www.gnu.org/licenses/>. */ |
17 | |
18 | #include <sysdep.h> |
19 | |
20 | .section .rodata.str1.1,"aMS" ,%progbits,1 |
21 | .type longjmp_msg,%object |
22 | longjmp_msg: |
23 | .string "longjmp causes uninitialized stack frame" |
24 | .size longjmp_msg, .-longjmp_msg |
25 | .text |
26 | |
27 | #define __longjmp ____longjmp_chk |
28 | |
29 | #ifdef PIC |
30 | # define CALL_FAIL \ |
31 | ldr sl, .L_GOT; \ |
32 | cfi_undefined (sl); \ |
33 | .L_GOT_OFF: \ |
34 | add sl, pc, sl; \ |
35 | ldr r0, .Lstr; \ |
36 | add r0, sl, r0; \ |
37 | B PLTJMP(HIDDEN_JUMPTARGET(__fortify_fail)); \ |
38 | .L_GOT: \ |
39 | .word _GLOBAL_OFFSET_TABLE_-(.L_GOT_OFF+8); \ |
40 | .Lstr: \ |
41 | .word longjmp_msg(GOTOFF); |
42 | #else |
43 | # define CALL_FAIL \ |
44 | ldr r0, .Lstr; \ |
45 | B HIDDEN_JUMPTARGET(__fortify_fail); \ |
46 | .Lstr: \ |
47 | .word longjmp_msg; |
48 | #endif |
49 | |
50 | #define CHECK_SP(reg) \ |
51 | cfi_remember_state; \ |
52 | cmp sp, reg; \ |
53 | bls .Lok; \ |
54 | push { r7 }; \ |
55 | cfi_adjust_cfa_offset (4); \ |
56 | cfi_rel_offset (r7, 0); \ |
57 | mov r5, r0; \ |
58 | cfi_undefined (r5); \ |
59 | mov r7, #SYS_ify(sigaltstack); \ |
60 | mov r0, #0; \ |
61 | sub sp, sp, #12; /* == sizeof (stack_t) */ \ |
62 | cfi_adjust_cfa_offset (12); \ |
63 | cfi_remember_state; \ |
64 | mov r1, sp; \ |
65 | swi #0; \ |
66 | cmp r0, #0; \ |
67 | bne .Lok2; \ |
68 | ldr r1, [sp, #4]; \ |
69 | tst r1, #1; \ |
70 | beq .Lfail; \ |
71 | ldr r2, [sp, #0]; \ |
72 | ldr r3, [sp, #8]; \ |
73 | add r2, r2, r3; \ |
74 | sub r2, r2, reg; \ |
75 | cmp r3, r2; \ |
76 | bls .Lok2; \ |
77 | .Lfail: \ |
78 | add sp, sp, #12; \ |
79 | cfi_adjust_cfa_offset (-12); \ |
80 | pop { r7 }; \ |
81 | cfi_adjust_cfa_offset (-4); \ |
82 | cfi_restore (r7); \ |
83 | CALL_FAIL \ |
84 | cfi_restore_state; \ |
85 | .Lok2: \ |
86 | mov r0, r5; \ |
87 | cfi_restore_state; \ |
88 | .Lok: |
89 | |
90 | #include <__longjmp.S> |
91 | |