]>
Commit | Line | Data |
---|---|---|
5bccf609 | 1 | /* Install given context. |
6d7e8eda | 2 | Copyright (C) 2008-2023 Free Software Foundation, Inc. |
5bccf609 | 3 | This file is part of the GNU C Library. |
5bccf609 CD |
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 | |
ab84e3ff | 16 | License along with the GNU C Library. If not, see |
5a82c748 | 17 | <https://www.gnu.org/licenses/>. */ |
5bccf609 CD |
18 | |
19 | #include <sysdep.h> | |
c92d40c0 | 20 | #include <libc-symbols.h> |
5bccf609 CD |
21 | |
22 | #include "ucontext_i.h" | |
23 | ||
24 | ||
25 | ENTRY(__setcontext) | |
26 | /* Prologue */ | |
8da92e72 JDA |
27 | stw %r2, -20(%sp) |
28 | .cfi_offset 2, -20 | |
131fafa7 | 29 | stwm %r3, 64(%sp) |
ce1917d0 JDA |
30 | .cfi_def_cfa_offset -64 |
31 | .cfi_offset 3, 0 | |
5bccf609 | 32 | #ifdef PIC |
131fafa7 | 33 | stw %r19, -32(%sp) |
ce1917d0 | 34 | .cfi_offset 19, 32 |
5bccf609 | 35 | #endif |
71b108d7 JDA |
36 | stw %ret1, -60(%sp) |
37 | .cfi_offset 29, 4 | |
5bccf609 CD |
38 | |
39 | /* Save ucp. */ | |
40 | copy %r26, %r3 | |
41 | ||
42 | .Lagain: | |
43 | /* Set the current signal mask. */ | |
44 | /* sigprocmask(SIG_BLOCK, &ucp->uc_sigmask, NULL); */ | |
45 | copy %r0, %r24 | |
46 | ldo oSIGMASK(%r3), %r25 | |
3785b31c | 47 | bl __sigprocmask, %r2 |
5bccf609 CD |
48 | ldi SIG_SETMASK, %r26 |
49 | ||
50 | comib,<>,n 0,%ret0,.Lerror | |
51 | ||
52 | /* Save %sp, %dp. */ | |
53 | copy %sp, %r4 | |
54 | copy %dp, %r5 | |
55 | copy %r19, %r6 | |
56 | ||
57 | /* Get the registers. */ | |
58 | ldw oR1(%r3), %r1 | |
59 | ldw oR2(%r3), %r2 | |
60 | /* ldw oR3(%r3), %r3 - used for ucp pointer. */ | |
61 | /* ldw oR4(%r3), %r4 - used for original %sp. */ | |
62 | /* ldw oR5(%r3), %r5 - used for %dp / %r27. */ | |
63 | /* ldw oR6(%r3), %r6 - used for %r19. */ | |
64 | ldw oR7(%r3), %r7 | |
65 | ldw oR8(%r3), %r8 | |
66 | ldw oR9(%r3), %r9 | |
67 | ldw oR10(%r3), %r10 | |
68 | ldw oR11(%r3), %r11 | |
69 | ldw oR12(%r3), %r12 | |
70 | ldw oR13(%r3), %r13 | |
71 | ldw oR14(%r3), %r14 | |
72 | ldw oR15(%r3), %r15 | |
73 | ldw oR16(%r3), %r16 | |
74 | ldw oR17(%r3), %r17 | |
75 | ldw oR18(%r3), %r18 | |
76 | ldw oR19(%r3), %r19 | |
77 | ldw oR20(%r3), %r20 | |
9e7e5fda | 78 | ldw oR21(%r3), %r21 /* maybe clobbered by dyncall */ |
5bccf609 CD |
79 | /* ldw oR22(%r3), %r22 - dyncall arg. */ |
80 | ldw oR23(%r3), %r23 | |
81 | ldw oR24(%r3), %r24 | |
82 | ldw oR25(%r3), %r25 | |
83 | ldw oR26(%r3), %r26 | |
84 | ldw oR27(%r3), %r27 | |
85 | ldw oR28(%r3), %r28 | |
86 | ldw oR29(%r3), %r29 | |
131fafa7 | 87 | ldw oR30(%r3), %sp |
5bccf609 CD |
88 | /* ldw oR31(%r3), %r31 - dyncall scratch register */ |
89 | ||
9e7e5fda JDA |
90 | /* Restore SAR register. */ |
91 | ldw oSAR(%r3), %r22 | |
92 | mtsar %r22 | |
93 | ||
5bccf609 CD |
94 | /* Restore floating-point registers. */ |
95 | ldo oFPREGS31(%r3), %r22 | |
96 | fldds 0(%r22), %fr31 | |
97 | fldds,mb -8(%r22), %fr30 | |
98 | fldds,mb -8(%r22), %fr29 | |
99 | fldds,mb -8(%r22), %fr28 | |
100 | fldds,mb -8(%r22), %fr27 | |
101 | fldds,mb -8(%r22), %fr26 | |
102 | fldds,mb -8(%r22), %fr25 | |
103 | fldds,mb -8(%r22), %fr24 | |
104 | fldds,mb -8(%r22), %fr23 | |
105 | fldds,mb -8(%r22), %fr22 | |
106 | fldds,mb -8(%r22), %fr21 | |
107 | fldds,mb -8(%r22), %fr20 | |
108 | fldds,mb -8(%r22), %fr19 | |
109 | fldds,mb -8(%r22), %fr18 | |
110 | fldds,mb -8(%r22), %fr17 | |
111 | fldds,mb -8(%r22), %fr16 | |
112 | fldds,mb -8(%r22), %fr15 | |
113 | fldds,mb -8(%r22), %fr14 | |
114 | fldds,mb -8(%r22), %fr13 | |
115 | fldds,mb -8(%r22), %fr12 | |
116 | fldds,mb -8(%r22), %fr11 | |
117 | fldds,mb -8(%r22), %fr10 | |
118 | fldds,mb -8(%r22), %fr9 | |
119 | fldds,mb -8(%r22), %fr8 | |
120 | fldds,mb -8(%r22), %fr7 | |
121 | fldds,mb -8(%r22), %fr6 | |
122 | fldds,mb -8(%r22), %fr5 | |
123 | fldds,mb -8(%r22), %fr4 | |
124 | fldds,mb -8(%r22), %fr3 | |
125 | fldds,mb -8(%r22), %fr2 | |
126 | fldds,mb -8(%r22), %fr1 | |
127 | fldds,mb -8(%r22), %fr0 | |
128 | ||
131fafa7 CD |
129 | /* Do not load oSS_SP into %sp. The value of oSS_SP indicates |
130 | the start of the user allocated stack, but not the sp that | |
5556231d | 131 | should be used by the new context. In fact makecontext |
131fafa7 CD |
132 | will create a frame, and adjust sp as required. We do not |
133 | support calling getcontext and modifying ss_sp without | |
134 | a call to makecontext to synchronize ss_sp into the machine | |
135 | context. */ | |
5bccf609 CD |
136 | |
137 | /* Call external function. */ | |
138 | copy %r2, %r22 | |
139 | bl $$dyncall, %r31 | |
140 | copy %r31, %r2 | |
141 | ||
142 | /* We return here. Get new ucp in %r3, reload %sp. */ | |
143 | ldw oUC_LINK(%r3), %r3 | |
144 | copy %r4, %sp | |
145 | copy %r5, %dp | |
146 | copy %r6, %r19 | |
147 | ||
148 | /* Continue until ucp == NULL. */ | |
149 | comib,<> 0,%r3,.Lagain | |
150 | nop | |
151 | ||
152 | /* No further context available. Exit now. */ | |
c92d40c0 | 153 | bl HIDDEN_JUMPTARGET(exit), %r2 |
07f94b7a | 154 | ldi 0, %r26 |
5556231d | 155 | |
5bccf609 CD |
156 | |
157 | .Lerror: | |
158 | /* Epilogue */ | |
159 | ldw -84(%r30), %r2 | |
160 | #ifdef PIC | |
8da92e72 | 161 | ldw -32(%r30), %r19 |
5bccf609 | 162 | #endif |
71b108d7 | 163 | ldw -60(%r30), %ret1 |
5bccf609 CD |
164 | bv %r0(%r2) |
165 | ldwm -64(%r30), %r3 | |
166 | L(pseudo_end): | |
167 | PSEUDO_END(__setcontext) | |
168 | ||
169 | weak_alias(__setcontext, setcontext) |