1 | /* Set current context for ARC. |
2 | Copyright (C) 2020-2024 Free Software Foundation, Inc. |
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 |
7 | License as published by the Free Software Foundation; either |
8 | version 2.1 of the 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 "ucontext-macros.h" |
20 | |
21 | /* int setcontext (const ucontext_t *ucp) |
22 | - Restores the machine context in @ucp and resumes execution |
23 | (doesn't return to caller). */ |
24 | |
25 | ENTRY (__setcontext) |
26 | |
27 | mov r9, r0 /* Stash @ucp across syscall. */ |
28 | |
29 | /* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, NULL, _NSIG8). */ |
30 | mov r3, _NSIG8 |
31 | mov r2, 0 |
32 | add r1, r0, UCONTEXT_SIGMASK |
33 | mov r0, SIG_SETMASK |
34 | mov r8, __NR_rt_sigprocmask |
35 | ARC_TRAP_INSN |
36 | brhi r0, -1024, L (call_syscall_err) |
37 | |
38 | /* Restore scratch/arg regs for makecontext case. */ |
39 | add r9, r9, UCONTEXT_MCONTEXT |
40 | LDR (r0, r9, 22) |
41 | LDR (r1, r9, 21) |
42 | LDR (r2, r9, 20) |
43 | LDR (r3, r9, 19) |
44 | LDR (r4, r9, 18) |
45 | LDR (r5, r9, 17) |
46 | LDR (r6, r9, 16) |
47 | LDR (r7, r9, 15) |
48 | |
49 | /* Restore callee saved registers. */ |
50 | LDR (r13, r9, 37) |
51 | LDR (r14, r9, 36) |
52 | LDR (r15, r9, 35) |
53 | LDR (r16, r9, 34) |
54 | LDR (r17, r9, 33) |
55 | LDR (r18, r9, 32) |
56 | LDR (r19, r9, 31) |
57 | LDR (r20, r9, 30) |
58 | LDR (r21, r9, 29) |
59 | LDR (r22, r9, 28) |
60 | LDR (r23, r9, 27) |
61 | LDR (r24, r9, 26) |
62 | |
63 | LDR (blink, r9, 7) |
64 | LDR (fp, r9, 8) |
65 | LDR (gp, r9, 9) |
66 | LDR (sp, r9, 23) |
67 | |
68 | j [blink] |
69 | |
70 | PSEUDO_END (__setcontext) |
71 | weak_alias (__setcontext, setcontext) |
72 | |
73 | |
74 | /* Helper for activating makecontext created context |
75 | - r14 has @func, r15 has uc_link. */ |
76 | |
77 | ENTRY (__startcontext) |
78 | |
79 | .cfi_label .Ldummy |
80 | cfi_undefined (blink) |
81 | |
82 | /* Call user @func, loaded in r14 by setcontext. */ |
83 | jl [r14] |
84 | |
85 | /* If uc_link (r15) call setcontext with that. */ |
86 | mov r0, r15 |
87 | breq r0, 0, 1f |
88 | |
89 | bl __setcontext |
90 | 1: |
91 | /* Exit with status 0. */ |
92 | b HIDDEN_JUMPTARGET(exit) |
93 | END (__startcontext) |
94 | |