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/* longjmp is implemented in terms of the setcontext trap on Linux/Sparc64. */
19
20#include <sysdep.h>
21
22/* Offsets into the jmp_buf structure. */
23
24#define O_mask_was_saved 512
25#define O_gregs 32
26#define O_g1 (O_gregs + 4*8)
27#define O_sp (O_gregs + 17*8)
28
29.section .rodata.str1.1,"aMS",@progbits,1
30 .type longjmp_msg,@object
31longjmp_msg:
32 .string "longjmp causes uninitialized stack frame"
33 .size longjmp_msg, .-longjmp_msg
34
35 .text
36ENTRY (____longjmp_chk)
37 ldx [%o0 + O_sp], %o2
38 cmp %sp, %o2
39 bleu,pt %xcc, .Lok
40 nop
41
42 save %sp, -208, %sp
43 cfi_remember_state
44 cfi_def_cfa_register(%fp)
45 cfi_window_save
46 cfi_register(%o7, %i7)
47 add %fp, 2023, %o1
48 clr %o0
49 LOADSYSCALL(sigaltstack)
50 ta 0x6d
51 bcs,pn %xcc, .Lok2
52 lduw [%fp + 2031], %l2
53 andcc %l2, 0x1, %g0
54 be,pn %xcc, .Lfail
55 ldx [%fp + 2023], %l0
56 ldx [%fp + 2039], %l1
57 sub %l0, STACK_BIAS, %l0
58 add %l0, %l1, %l0
59 sub %l0, %i2, %l0
60 cmp %l0, %l1
61 bgeu,pt %xcc, .Lok2
62 nop
63
64.Lfail:
65#ifndef PIC
66 sethi %hi(longjmp_msg), %o0
67 or %o0, %lo(longjmp_msg), %o0
68#else
69 SETUP_PIC_REG(l7)
70 sethi %gdop_hix22(longjmp_msg), %o0
71 xor %o0, %gdop_lox10(longjmp_msg), %o0
72 ldx [%l7 + %o0], %o0, %gdop(longjmp_msg)
73#endif
74 call HIDDEN_JUMPTARGET(__fortify_fail)
75 nop
76
77.Lok2: restore
78 cfi_restore_state
79
80.Lok:
81 /* Modify the context with the value we want to return. */
82 movre %o1, 1, %o1
83 stx %o1, [%o0 + O_g1]
84
85 /* Let setcontext know if we want to modify the current sigmask. */
86 ld [%o0 + O_mask_was_saved], %o1
87
88 /* And bamf back to where we belong! */
89 ta 0x6f
90END(____longjmp_chk)
91

source code of glibc/sysdeps/unix/sysv/linux/sparc/sparc64/____longjmp_chk.S