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#include <rtld-global-offsets.h> 20 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 29 30#define __longjmp ____longjmp_chk 31 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: 67 68#include <__longjmp-common.S> 69