1/* Copyright (C) 2009-2021 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 22longjmp_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