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

source code of glibc/sysdeps/unix/sysv/linux/powerpc/powerpc64/____longjmp_chk.S