1 | /* Copyright (C) 1997-2024 Free Software Foundation, Inc. |
2 | |
3 | This file is part of the GNU C Library. |
4 | |
5 | The GNU C Library is free software; you can redistribute it and/or |
6 | modify it under the terms of the GNU Lesser General Public License as |
7 | published by the Free Software Foundation; either version 2.1 of the |
8 | License, or (at your option) any later version. |
9 | |
10 | The GNU C Library is distributed in the hope that it will be useful, |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
13 | Lesser General Public License for more details. |
14 | |
15 | You should have received a copy of the GNU Lesser General Public |
16 | License along with the GNU C Library. If not, see |
17 | <https://www.gnu.org/licenses/>. */ |
18 | |
19 | #include <sysdep.h> |
20 | #include <pointer_guard.h> |
21 | #include <jmpbuf-offsets.h> |
22 | #include <stap-probe.h> |
23 | |
24 | /* Keep traditional entry points in with sigsetjmp(). */ |
25 | ENTRY (setjmp) |
26 | mov x1, #1 |
27 | b 1f |
28 | END (setjmp) |
29 | |
30 | ENTRY (_setjmp) |
31 | mov x1, #0 |
32 | b 1f |
33 | END (_setjmp) |
34 | libc_hidden_def (_setjmp) |
35 | |
36 | ENTRY (__sigsetjmp) |
37 | PTR_ARG (0) |
38 | |
39 | 1: |
40 | stp x19, x20, [x0, #JB_X19<<3] |
41 | stp x21, x22, [x0, #JB_X21<<3] |
42 | stp x23, x24, [x0, #JB_X23<<3] |
43 | stp x25, x26, [x0, #JB_X25<<3] |
44 | stp x27, x28, [x0, #JB_X27<<3] |
45 | |
46 | #ifdef PTR_MANGLE |
47 | PTR_MANGLE (4, 30, 3, 2) |
48 | stp x29, x4, [x0, #JB_X29<<3] |
49 | #else |
50 | stp x29, x30, [x0, #JB_X29<<3] |
51 | #endif |
52 | /* setjmp probe takes 3 arguments, address of jump buffer |
53 | first argument (8@x0), return value second argument (-4@x1), |
54 | and target address (8@x30), respectively. */ |
55 | LIBC_PROBE (setjmp, 3, 8@x0, -4@x1, 8@x30) |
56 | stp d8, d9, [x0, #JB_D8<<3] |
57 | stp d10, d11, [x0, #JB_D10<<3] |
58 | stp d12, d13, [x0, #JB_D12<<3] |
59 | stp d14, d15, [x0, #JB_D14<<3] |
60 | #ifdef PTR_MANGLE |
61 | mov x4, sp |
62 | PTR_MANGLE (5, 4, 3, 2) |
63 | str x5, [x0, #JB_SP<<3] |
64 | #else |
65 | mov x2, sp |
66 | str x2, [x0, #JB_SP<<3] |
67 | #endif |
68 | #if IS_IN (rtld) |
69 | /* In ld.so we never save the signal mask */ |
70 | mov w0, #0 |
71 | RET |
72 | #else |
73 | b C_SYMBOL_NAME(__sigjmp_save) |
74 | #endif |
75 | END (__sigsetjmp) |
76 | hidden_def (__sigsetjmp) |
77 | |