]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/unix/sysv/linux/powerpc/powerpc64/swapcontext.S
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / sysdeps / unix / sysv / linux / powerpc / powerpc64 / swapcontext.S
CommitLineData
609b4783 1/* Save current context and install the given one.
688903eb 2 Copyright (C) 2002-2018 Free Software Foundation, Inc.
609b4783
UD
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
59ba27a6
PE
16 License along with the GNU C Library; if not, see
17 <http://www.gnu.org/licenses/>. */
609b4783
UD
18
19#include <sysdep.h>
5ef6ae4b
UD
20#include <rtld-global-offsets.h>
21#include <shlib-compat.h>
609b4783
UD
22
23#define __ASSEMBLY__
24#include <asm/ptrace.h>
25#include "ucontext_i.h"
38e68573 26#include <asm/errno.h>
609b4783 27
edba7a54
UD
28 .section ".toc","aw"
29.LC__dl_hwcap:
30#ifdef SHARED
31 .tc _rtld_global_ro[TC],_rtld_global_ro
32#else
33 .tc _dl_hwcap[TC],_dl_hwcap
34#endif
35
5ef6ae4b 36#if SHLIB_COMPAT (libc, GLIBC_2_3, GLIBC_2_3_4)
edba7a54 37 .section ".text"
5ef6ae4b 38ENTRY(__novec_swapcontext)
865d953f 39 CALL_MCOUNT 2
5ef6ae4b
UD
40 std r0,(SIGCONTEXT_GP_REGS+(PT_R0*8))(r3)
41 std r1,(SIGCONTEXT_GP_REGS+(PT_R1*8))(r3)
42 mflr r0
43 std r31,-8(1)
3e7e947f 44 cfi_offset(r31,-8)
5ef6ae4b
UD
45 std r2,(SIGCONTEXT_GP_REGS+(PT_R2*8))(r3)
46 std r0,FRAME_LR_SAVE(r1)
a7e91561 47 cfi_offset (lr, FRAME_LR_SAVE)
5ef6ae4b
UD
48 std r0,(SIGCONTEXT_GP_REGS+(PT_LNK*8))(r3)
49 std r0,(SIGCONTEXT_GP_REGS+(PT_NIP*8))(r3)
50 stdu r1,-128(r1)
a7e91561 51 cfi_adjust_cfa_offset (128)
5ef6ae4b
UD
52 std r4,(SIGCONTEXT_GP_REGS+(PT_R4*8))(r3)
53 std r5,(SIGCONTEXT_GP_REGS+(PT_R5*8))(r3)
54 std r6,(SIGCONTEXT_GP_REGS+(PT_R6*8))(r3)
55 std r7,(SIGCONTEXT_GP_REGS+(PT_R7*8))(r3)
56 std r8,(SIGCONTEXT_GP_REGS+(PT_R8*8))(r3)
57 std r9,(SIGCONTEXT_GP_REGS+(PT_R9*8))(r3)
58 std r10,(SIGCONTEXT_GP_REGS+(PT_R10*8))(r3)
59 std r11,(SIGCONTEXT_GP_REGS+(PT_R11*8))(r3)
60 std r12,(SIGCONTEXT_GP_REGS+(PT_R12*8))(r3)
61 std r13,(SIGCONTEXT_GP_REGS+(PT_R13*8))(r3)
62 std r14,(SIGCONTEXT_GP_REGS+(PT_R14*8))(r3)
63 std r15,(SIGCONTEXT_GP_REGS+(PT_R15*8))(r3)
64 std r16,(SIGCONTEXT_GP_REGS+(PT_R16*8))(r3)
65 std r17,(SIGCONTEXT_GP_REGS+(PT_R17*8))(r3)
66 std r18,(SIGCONTEXT_GP_REGS+(PT_R18*8))(r3)
67 std r19,(SIGCONTEXT_GP_REGS+(PT_R19*8))(r3)
68 std r20,(SIGCONTEXT_GP_REGS+(PT_R20*8))(r3)
69 std r21,(SIGCONTEXT_GP_REGS+(PT_R21*8))(r3)
70 std r22,(SIGCONTEXT_GP_REGS+(PT_R22*8))(r3)
71 std r23,(SIGCONTEXT_GP_REGS+(PT_R23*8))(r3)
72 std r24,(SIGCONTEXT_GP_REGS+(PT_R24*8))(r3)
73 std r25,(SIGCONTEXT_GP_REGS+(PT_R25*8))(r3)
74 std r26,(SIGCONTEXT_GP_REGS+(PT_R26*8))(r3)
75 std r27,(SIGCONTEXT_GP_REGS+(PT_R27*8))(r3)
76 std r28,(SIGCONTEXT_GP_REGS+(PT_R28*8))(r3)
77 std r29,(SIGCONTEXT_GP_REGS+(PT_R29*8))(r3)
78 std r30,(SIGCONTEXT_GP_REGS+(PT_R30*8))(r3)
79 std r31,(SIGCONTEXT_GP_REGS+(PT_R31*8))(r3)
80 mfctr r0
81 std r0,(SIGCONTEXT_GP_REGS+(PT_CTR*8))(r3)
82 mfxer r0
83 std r0,(SIGCONTEXT_GP_REGS+(PT_XER*8))(r3)
84 mfcr r0
85 std r0,(SIGCONTEXT_GP_REGS+(PT_CCR*8))(r3)
afdca0f2
UD
86
87 /* Set the return value of swapcontext to "success". R3 is the only
5ef6ae4b
UD
88 register whose value is not preserved in the saved context. */
89 li r0,0
90 std r0,(SIGCONTEXT_GP_REGS+(PT_R3*8))(r3)
afdca0f2 91
5ef6ae4b
UD
92 /* Zero fill fields that can't be set in user state or are unused. */
93 std r0,(SIGCONTEXT_GP_REGS+(PT_MSR*8))(r3)
94 std r0,(SIGCONTEXT_GP_REGS+(34*8))(r3)
95 std r0,(SIGCONTEXT_GP_REGS+(PT_SOFTE*8))(r3)
96 std r0,(SIGCONTEXT_GP_REGS+(40*8))(r3)
97 std r0,(SIGCONTEXT_GP_REGS+(41*8))(r3)
98 std r0,(SIGCONTEXT_GP_REGS+(42*8))(r3)
99 std r0,(SIGCONTEXT_GP_REGS+(PT_RESULT*8))(r3)
afdca0f2
UD
100
101 /* Set the PT_REGS pointer to the address of sigcontext gp_regs
102 field. Struct pt_regs and elf_gregset_t are the same thing.
5ef6ae4b
UD
103 We kept the regs field for backwards compatibility with
104 libraries built before we extended sigcontext. */
105 addi r0,r3,SIGCONTEXT_GP_REGS
106 std r0,SIGCONTEXT_PT_REGS(r3)
afdca0f2 107
5ef6ae4b
UD
108 stfd fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r3)
109 stfd fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r3)
110 stfd fp2,(SIGCONTEXT_FP_REGS+(PT_R2*8))(r3)
111 stfd fp3,(SIGCONTEXT_FP_REGS+(PT_R3*8))(r3)
112 stfd fp4,(SIGCONTEXT_FP_REGS+(PT_R4*8))(r3)
113 stfd fp5,(SIGCONTEXT_FP_REGS+(PT_R5*8))(r3)
114 stfd fp6,(SIGCONTEXT_FP_REGS+(PT_R6*8))(r3)
115 stfd fp7,(SIGCONTEXT_FP_REGS+(PT_R7*8))(r3)
116 stfd fp8,(SIGCONTEXT_FP_REGS+(PT_R8*8))(r3)
117 stfd fp9,(SIGCONTEXT_FP_REGS+(PT_R9*8))(r3)
118 stfd fp10,(SIGCONTEXT_FP_REGS+(PT_R10*8))(r3)
119 stfd fp11,(SIGCONTEXT_FP_REGS+(PT_R11*8))(r3)
120 stfd fp12,(SIGCONTEXT_FP_REGS+(PT_R12*8))(r3)
121 stfd fp13,(SIGCONTEXT_FP_REGS+(PT_R13*8))(r3)
122 stfd fp14,(SIGCONTEXT_FP_REGS+(PT_R14*8))(r3)
123 stfd fp15,(SIGCONTEXT_FP_REGS+(PT_R15*8))(r3)
124 stfd fp16,(SIGCONTEXT_FP_REGS+(PT_R16*8))(r3)
125 stfd fp17,(SIGCONTEXT_FP_REGS+(PT_R17*8))(r3)
126 stfd fp18,(SIGCONTEXT_FP_REGS+(PT_R18*8))(r3)
127 stfd fp19,(SIGCONTEXT_FP_REGS+(PT_R19*8))(r3)
128 stfd fp20,(SIGCONTEXT_FP_REGS+(PT_R20*8))(r3)
129 stfd fp21,(SIGCONTEXT_FP_REGS+(PT_R21*8))(r3)
130 stfd fp22,(SIGCONTEXT_FP_REGS+(PT_R22*8))(r3)
131 stfd fp23,(SIGCONTEXT_FP_REGS+(PT_R23*8))(r3)
132 stfd fp24,(SIGCONTEXT_FP_REGS+(PT_R24*8))(r3)
133 stfd fp25,(SIGCONTEXT_FP_REGS+(PT_R25*8))(r3)
134 stfd fp26,(SIGCONTEXT_FP_REGS+(PT_R26*8))(r3)
135 stfd fp27,(SIGCONTEXT_FP_REGS+(PT_R27*8))(r3)
136 stfd fp28,(SIGCONTEXT_FP_REGS+(PT_R28*8))(r3)
b86d92c0 137 stfd fp29,(SIGCONTEXT_FP_REGS+(PT_R29*8))(r3)
5ef6ae4b
UD
138 mffs fp0
139 stfd fp30,(SIGCONTEXT_FP_REGS+(PT_R30*8))(r3)
140 stfd fp31,(SIGCONTEXT_FP_REGS+(PT_R31*8))(r3)
141 stfd fp0,(SIGCONTEXT_FP_REGS+(32*8))(r3)
142
143 mr r31,r4
144 addi r5,r3,UCONTEXT_SIGMASK
145 addi r4,r4,UCONTEXT_SIGMASK
146 li r3,SIG_SETMASK
d980f41a 147 bl JUMPTARGET(__sigprocmask)
5ef6ae4b
UD
148 nop
149 cmpdi r3,0
150 bne L(nv_error_exit)
151
152/*
153 * If this new ucontext refers to the point where we were interrupted
154 * by a signal, we have to use the rt_sigreturn system call to
155 * return to the context so we get both LR and CTR restored.
156 *
157 * Otherwise, the context we are restoring is either just after
158 * a procedure call (getcontext/swapcontext) or at the beginning
159 * of a procedure call (makecontext), so we don't need to restore
160 * msr and ctr. We don't restore r13 since it will be used as
161 * the TLS pointer. */
16cc1800 162 ld r0,(SIGCONTEXT_GP_REGS+(PT_MSR*8))(r31)
5ef6ae4b
UD
163 cmpdi r0,0
164 bne L(nv_do_sigret)
165
cbc06bc4 166 ld r8,.LC__dl_hwcap@toc(r2)
edba7a54
UD
167# ifdef SHARED
168/* Load _rtld-global._dl_hwcap. */
169 ld r8,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET(r8)
170# else
171 ld r8,0(r8) /* Load extern _dl_hwcap. */
172# endif
173
5ef6ae4b 174 lfd fp0,(SIGCONTEXT_FP_REGS+(32*8))(r31)
afdca0f2 175 lfd fp31,(SIGCONTEXT_FP_REGS+(PT_R31*8))(r31)
5ef6ae4b 176 lfd fp30,(SIGCONTEXT_FP_REGS+(PT_R30*8))(r31)
db8fed87 177
edba7a54
UD
178# ifdef _ARCH_PWR6
179 /* Use the extended four-operand version of the mtfsf insn. */
bddec78c
UD
180 .machine push
181 .machine "power6"
db8fed87
MS
182
183 mtfsf 0xff,fp0,1,0
184
185 .machine pop
186# else
edba7a54
UD
187 /* Availability of DFP indicates a 64-bit FPSCR. */
188 andi. r6,r8,PPC_FEATURE_HAS_DFP
189 beq 5f
db8fed87
MS
190
191 .machine push
192 .machine "power6"
193
edba7a54 194 mtfsf 0xff,fp0,1,0
db8fed87
MS
195
196 .machine pop
197
edba7a54
UD
198 b 6f
199 /* Continue to operate on the FPSCR as if it were 32-bits. */
2005:
5ef6ae4b 201 mtfsf 0xff,fp0
edba7a54
UD
2026:
203#endif /* _ARCH_PWR6 */
db8fed87 204
afdca0f2 205 lfd fp29,(SIGCONTEXT_FP_REGS+(PT_R29*8))(r31)
5ef6ae4b 206 lfd fp28,(SIGCONTEXT_FP_REGS+(PT_R28*8))(r31)
afdca0f2 207 lfd fp27,(SIGCONTEXT_FP_REGS+(PT_R27*8))(r31)
5ef6ae4b 208 lfd fp26,(SIGCONTEXT_FP_REGS+(PT_R26*8))(r31)
afdca0f2 209 lfd fp25,(SIGCONTEXT_FP_REGS+(PT_R25*8))(r31)
5ef6ae4b 210 lfd fp24,(SIGCONTEXT_FP_REGS+(PT_R24*8))(r31)
afdca0f2 211 lfd fp23,(SIGCONTEXT_FP_REGS+(PT_R23*8))(r31)
5ef6ae4b 212 lfd fp22,(SIGCONTEXT_FP_REGS+(PT_R22*8))(r31)
afdca0f2 213 lfd fp21,(SIGCONTEXT_FP_REGS+(PT_R21*8))(r31)
5ef6ae4b 214 lfd fp20,(SIGCONTEXT_FP_REGS+(PT_R20*8))(r31)
afdca0f2 215 lfd fp19,(SIGCONTEXT_FP_REGS+(PT_R19*8))(r31)
5ef6ae4b 216 lfd fp18,(SIGCONTEXT_FP_REGS+(PT_R18*8))(r31)
afdca0f2 217 lfd fp17,(SIGCONTEXT_FP_REGS+(PT_R17*8))(r31)
5ef6ae4b 218 lfd fp16,(SIGCONTEXT_FP_REGS+(PT_R16*8))(r31)
afdca0f2 219 lfd fp15,(SIGCONTEXT_FP_REGS+(PT_R15*8))(r31)
5ef6ae4b 220 lfd fp14,(SIGCONTEXT_FP_REGS+(PT_R14*8))(r31)
afdca0f2 221 lfd fp13,(SIGCONTEXT_FP_REGS+(PT_R13*8))(r31)
5ef6ae4b 222 lfd fp12,(SIGCONTEXT_FP_REGS+(PT_R12*8))(r31)
afdca0f2 223 lfd fp11,(SIGCONTEXT_FP_REGS+(PT_R11*8))(r31)
5ef6ae4b 224 lfd fp10,(SIGCONTEXT_FP_REGS+(PT_R10*8))(r31)
afdca0f2 225 lfd fp9,(SIGCONTEXT_FP_REGS+(PT_R9*8))(r31)
5ef6ae4b 226 lfd fp8,(SIGCONTEXT_FP_REGS+(PT_R8*8))(r31)
afdca0f2 227 lfd fp7,(SIGCONTEXT_FP_REGS+(PT_R7*8))(r31)
5ef6ae4b 228 lfd fp6,(SIGCONTEXT_FP_REGS+(PT_R6*8))(r31)
afdca0f2 229 lfd fp5,(SIGCONTEXT_FP_REGS+(PT_R5*8))(r31)
5ef6ae4b 230 lfd fp4,(SIGCONTEXT_FP_REGS+(PT_R4*8))(r31)
afdca0f2 231 lfd fp3,(SIGCONTEXT_FP_REGS+(PT_R3*8))(r31)
5ef6ae4b 232 lfd fp2,(SIGCONTEXT_FP_REGS+(PT_R2*8))(r31)
afdca0f2 233 lfd fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r31)
5ef6ae4b 234 lfd fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r31)
afdca0f2
UD
235
236 ld r0,(SIGCONTEXT_GP_REGS+(PT_LNK*8))(r31)
5ef6ae4b
UD
237 ld r1,(SIGCONTEXT_GP_REGS+(PT_R1*8))(r31)
238 mtlr r0
239 ld r2,(SIGCONTEXT_GP_REGS+(PT_R2*8))(r31)
240 ld r0,(SIGCONTEXT_GP_REGS+(PT_XER*8))(r31)
241 ld r3,(SIGCONTEXT_GP_REGS+(PT_R3*8))(r31)
242 mtxer r0
243 ld r4,(SIGCONTEXT_GP_REGS+(PT_R4*8))(r31)
244 ld r0,(SIGCONTEXT_GP_REGS+(PT_CCR*8))(r31)
245 ld r5,(SIGCONTEXT_GP_REGS+(PT_R5*8))(r31)
16cc1800 246 mtcr r0
5ef6ae4b
UD
247 ld r6,(SIGCONTEXT_GP_REGS+(PT_R6*8))(r31)
248 ld r7,(SIGCONTEXT_GP_REGS+(PT_R7*8))(r31)
249 ld r8,(SIGCONTEXT_GP_REGS+(PT_R8*8))(r31)
250 ld r9,(SIGCONTEXT_GP_REGS+(PT_R9*8))(r31)
251 ld r10,(SIGCONTEXT_GP_REGS+(PT_R10*8))(r31)
252 ld r11,(SIGCONTEXT_GP_REGS+(PT_R11*8))(r31)
253 ld r12,(SIGCONTEXT_GP_REGS+(PT_R12*8))(r31)
254 /* Don't reload the thread ID or TLS pointer (r13). */
255 ld r14,(SIGCONTEXT_GP_REGS+(PT_R14*8))(r31)
256 ld r15,(SIGCONTEXT_GP_REGS+(PT_R15*8))(r31)
257 ld r16,(SIGCONTEXT_GP_REGS+(PT_R16*8))(r31)
258 ld r17,(SIGCONTEXT_GP_REGS+(PT_R17*8))(r31)
259 ld r18,(SIGCONTEXT_GP_REGS+(PT_R18*8))(r31)
260 ld r19,(SIGCONTEXT_GP_REGS+(PT_R19*8))(r31)
261 ld r20,(SIGCONTEXT_GP_REGS+(PT_R20*8))(r31)
262 ld r21,(SIGCONTEXT_GP_REGS+(PT_R21*8))(r31)
263 ld r22,(SIGCONTEXT_GP_REGS+(PT_R22*8))(r31)
264 ld r23,(SIGCONTEXT_GP_REGS+(PT_R23*8))(r31)
265 ld r24,(SIGCONTEXT_GP_REGS+(PT_R24*8))(r31)
266 ld r25,(SIGCONTEXT_GP_REGS+(PT_R25*8))(r31)
267 ld r26,(SIGCONTEXT_GP_REGS+(PT_R26*8))(r31)
268 ld r27,(SIGCONTEXT_GP_REGS+(PT_R27*8))(r31)
269 ld r28,(SIGCONTEXT_GP_REGS+(PT_R28*8))(r31)
270 ld r29,(SIGCONTEXT_GP_REGS+(PT_R29*8))(r31)
271 ld r30,(SIGCONTEXT_GP_REGS+(PT_R30*8))(r31)
afdca0f2 272
5ef6ae4b 273 /* Now we branch to the "Next Instruction Pointer" from the saved
afdca0f2 274 context. With the powerpc64 instruction set there is no good way to
5ef6ae4b 275 do this (from user state) without clobbering either the LR or CTR.
afdca0f2 276 The makecontext and swapcontext functions depend on the callers
5ef6ae4b
UD
277 LR being preserved so we use the CTR. */
278 ld r0,(SIGCONTEXT_GP_REGS+(PT_NIP*8))(r31)
279 mtctr r0
280 ld r0,(SIGCONTEXT_GP_REGS+(PT_R0*8))(r31)
281 ld r31,(SIGCONTEXT_GP_REGS+(PT_R31*8))(r31)
282 bctr
afdca0f2 283
5ef6ae4b 284L(nv_error_exit):
afdca0f2 285 ld r0,128+FRAME_LR_SAVE(r1)
5ef6ae4b
UD
286 addi r1,r1,128
287 mtlr r0
288 ld r31,-8(r1)
289 blr
290
afdca0f2
UD
291 /* At this point we assume that the ucontext was created by a
292 rt_signal and we should use rt_sigreturn to restore the original
293 state. As of the 2.4.21 kernel the ucontext is the first thing
294 (offset 0) in the rt_signal frame and rt_sigreturn expects the
295 ucontext address in R1. Normally the rt-signal trampoline handles
296 this by popping dummy frame before the rt_signal syscall. In our
297 case the stack may not be in its original (signal handler return with
298 R1 pointing at the dummy frame) state. We do have the ucontext
5ef6ae4b
UD
299 address in R3, so simply copy R3 to R1 before the syscall. */
300L(nv_do_sigret):
301 mr r1,r3,
302 li r0,SYS_ify(rt_sigreturn)
303 sc
304 /* No return. */
5ef6ae4b
UD
305
306PSEUDO_END(__novec_swapcontext)
307
308compat_symbol (libc, __novec_swapcontext, swapcontext, GLIBC_2_3)
309
310#endif
311
5ef6ae4b 312 .section ".text"
f2bfeadf 313 .machine "altivec"
609b4783 314ENTRY(__swapcontext)
865d953f 315 CALL_MCOUNT 2
609b4783
UD
316 std r0,(SIGCONTEXT_GP_REGS+(PT_R0*8))(r3)
317 std r1,(SIGCONTEXT_GP_REGS+(PT_R1*8))(r3)
318 mflr r0
319 std r31,-8(1)
3e7e947f 320 cfi_offset(r31,-8)
609b4783
UD
321 std r2,(SIGCONTEXT_GP_REGS+(PT_R2*8))(r3)
322 std r0,FRAME_LR_SAVE(r1)
3e7e947f 323 cfi_offset (lr, FRAME_LR_SAVE)
609b4783
UD
324 std r0,(SIGCONTEXT_GP_REGS+(PT_LNK*8))(r3)
325 std r0,(SIGCONTEXT_GP_REGS+(PT_NIP*8))(r3)
326 stdu r1,-128(r1)
3e7e947f 327 cfi_adjust_cfa_offset(128)
609b4783
UD
328 std r4,(SIGCONTEXT_GP_REGS+(PT_R4*8))(r3)
329 std r5,(SIGCONTEXT_GP_REGS+(PT_R5*8))(r3)
330 std r6,(SIGCONTEXT_GP_REGS+(PT_R6*8))(r3)
331 std r7,(SIGCONTEXT_GP_REGS+(PT_R7*8))(r3)
332 std r8,(SIGCONTEXT_GP_REGS+(PT_R8*8))(r3)
333 std r9,(SIGCONTEXT_GP_REGS+(PT_R9*8))(r3)
334 std r10,(SIGCONTEXT_GP_REGS+(PT_R10*8))(r3)
335 std r11,(SIGCONTEXT_GP_REGS+(PT_R11*8))(r3)
336 std r12,(SIGCONTEXT_GP_REGS+(PT_R12*8))(r3)
337 std r13,(SIGCONTEXT_GP_REGS+(PT_R13*8))(r3)
338 std r14,(SIGCONTEXT_GP_REGS+(PT_R14*8))(r3)
339 std r15,(SIGCONTEXT_GP_REGS+(PT_R15*8))(r3)
340 std r16,(SIGCONTEXT_GP_REGS+(PT_R16*8))(r3)
341 std r17,(SIGCONTEXT_GP_REGS+(PT_R17*8))(r3)
342 std r18,(SIGCONTEXT_GP_REGS+(PT_R18*8))(r3)
343 std r19,(SIGCONTEXT_GP_REGS+(PT_R19*8))(r3)
344 std r20,(SIGCONTEXT_GP_REGS+(PT_R20*8))(r3)
345 std r21,(SIGCONTEXT_GP_REGS+(PT_R21*8))(r3)
346 std r22,(SIGCONTEXT_GP_REGS+(PT_R22*8))(r3)
347 std r23,(SIGCONTEXT_GP_REGS+(PT_R23*8))(r3)
348 std r24,(SIGCONTEXT_GP_REGS+(PT_R24*8))(r3)
349 std r25,(SIGCONTEXT_GP_REGS+(PT_R25*8))(r3)
350 std r26,(SIGCONTEXT_GP_REGS+(PT_R26*8))(r3)
351 std r27,(SIGCONTEXT_GP_REGS+(PT_R27*8))(r3)
352 std r28,(SIGCONTEXT_GP_REGS+(PT_R28*8))(r3)
353 std r29,(SIGCONTEXT_GP_REGS+(PT_R29*8))(r3)
354 std r30,(SIGCONTEXT_GP_REGS+(PT_R30*8))(r3)
355 std r31,(SIGCONTEXT_GP_REGS+(PT_R31*8))(r3)
356 mfctr r0
357 std r0,(SIGCONTEXT_GP_REGS+(PT_CTR*8))(r3)
358 mfxer r0
359 std r0,(SIGCONTEXT_GP_REGS+(PT_XER*8))(r3)
360 mfcr r0
361 std r0,(SIGCONTEXT_GP_REGS+(PT_CCR*8))(r3)
afdca0f2
UD
362
363 /* Set the return value of swapcontext to "success". R3 is the only
609b4783
UD
364 register whose value is not preserved in the saved context. */
365 li r0,0
366 std r0,(SIGCONTEXT_GP_REGS+(PT_R3*8))(r3)
afdca0f2 367
609b4783
UD
368 /* Zero fill fields that can't be set in user state or are unused. */
369 std r0,(SIGCONTEXT_GP_REGS+(PT_MSR*8))(r3)
370 std r0,(SIGCONTEXT_GP_REGS+(34*8))(r3)
371 std r0,(SIGCONTEXT_GP_REGS+(PT_SOFTE*8))(r3)
372 std r0,(SIGCONTEXT_GP_REGS+(40*8))(r3)
373 std r0,(SIGCONTEXT_GP_REGS+(41*8))(r3)
374 std r0,(SIGCONTEXT_GP_REGS+(42*8))(r3)
375 std r0,(SIGCONTEXT_GP_REGS+(PT_RESULT*8))(r3)
afdca0f2
UD
376
377 /* Set the PT_REGS pointer to the address of sigcontext gp_regs
378 field. Struct pt_regs and elf_gregset_t are the same thing.
609b4783
UD
379 We kept the regs field for backwards compatibility with
380 libraries built before we extended sigcontext. */
381 addi r0,r3,SIGCONTEXT_GP_REGS
382 std r0,SIGCONTEXT_PT_REGS(r3)
afdca0f2 383
609b4783
UD
384 stfd fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r3)
385 stfd fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r3)
386 stfd fp2,(SIGCONTEXT_FP_REGS+(PT_R2*8))(r3)
387 stfd fp3,(SIGCONTEXT_FP_REGS+(PT_R3*8))(r3)
388 stfd fp4,(SIGCONTEXT_FP_REGS+(PT_R4*8))(r3)
389 stfd fp5,(SIGCONTEXT_FP_REGS+(PT_R5*8))(r3)
390 stfd fp6,(SIGCONTEXT_FP_REGS+(PT_R6*8))(r3)
391 stfd fp7,(SIGCONTEXT_FP_REGS+(PT_R7*8))(r3)
392 stfd fp8,(SIGCONTEXT_FP_REGS+(PT_R8*8))(r3)
393 stfd fp9,(SIGCONTEXT_FP_REGS+(PT_R9*8))(r3)
394 stfd fp10,(SIGCONTEXT_FP_REGS+(PT_R10*8))(r3)
395 stfd fp11,(SIGCONTEXT_FP_REGS+(PT_R11*8))(r3)
396 stfd fp12,(SIGCONTEXT_FP_REGS+(PT_R12*8))(r3)
397 stfd fp13,(SIGCONTEXT_FP_REGS+(PT_R13*8))(r3)
398 stfd fp14,(SIGCONTEXT_FP_REGS+(PT_R14*8))(r3)
399 stfd fp15,(SIGCONTEXT_FP_REGS+(PT_R15*8))(r3)
400 stfd fp16,(SIGCONTEXT_FP_REGS+(PT_R16*8))(r3)
401 stfd fp17,(SIGCONTEXT_FP_REGS+(PT_R17*8))(r3)
402 stfd fp18,(SIGCONTEXT_FP_REGS+(PT_R18*8))(r3)
403 stfd fp19,(SIGCONTEXT_FP_REGS+(PT_R19*8))(r3)
404 stfd fp20,(SIGCONTEXT_FP_REGS+(PT_R20*8))(r3)
405 stfd fp21,(SIGCONTEXT_FP_REGS+(PT_R21*8))(r3)
406 stfd fp22,(SIGCONTEXT_FP_REGS+(PT_R22*8))(r3)
407 stfd fp23,(SIGCONTEXT_FP_REGS+(PT_R23*8))(r3)
408 stfd fp24,(SIGCONTEXT_FP_REGS+(PT_R24*8))(r3)
409 stfd fp25,(SIGCONTEXT_FP_REGS+(PT_R25*8))(r3)
410 stfd fp26,(SIGCONTEXT_FP_REGS+(PT_R26*8))(r3)
411 stfd fp27,(SIGCONTEXT_FP_REGS+(PT_R27*8))(r3)
412 stfd fp28,(SIGCONTEXT_FP_REGS+(PT_R28*8))(r3)
b86d92c0 413 stfd fp29,(SIGCONTEXT_FP_REGS+(PT_R29*8))(r3)
609b4783
UD
414 mffs fp0
415 stfd fp30,(SIGCONTEXT_FP_REGS+(PT_R30*8))(r3)
416 stfd fp31,(SIGCONTEXT_FP_REGS+(PT_R31*8))(r3)
417 stfd fp0,(SIGCONTEXT_FP_REGS+(32*8))(r3)
afdca0f2 418
5ef6ae4b 419 ld r8,.LC__dl_hwcap@toc(r2)
afdca0f2 420#ifdef SHARED
5ef6ae4b 421/* Load _rtld-global._dl_hwcap. */
ef690add 422 ld r8,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET(r8)
afdca0f2 423#else
5ef6ae4b
UD
424 ld r8,0(r8) /* Load extern _dl_hwcap. */
425#endif
5ef6ae4b
UD
426 la r10,(SIGCONTEXT_V_RESERVE+8)(r3)
427 la r9,(SIGCONTEXT_V_RESERVE+24)(r3)
fb9d5c73 428
edba7a54 429 andis. r6,r8,(PPC_FEATURE_HAS_ALTIVEC >> 16)
e1ad4c53 430
5ef6ae4b 431 clrrdi r10,r10,4
e1ad4c53 432 beq L(has_no_vec)
fb9d5c73 433
5ef6ae4b 434 clrrdi r9,r9,4
e1ad4c53 435 mr r8,r10 /* Capture *v_regs value in r5. */
afdca0f2
UD
436
437 stvx v0,0,r10
5ef6ae4b
UD
438 stvx v1,0,r9
439 addi r10,r10,32
440 addi r9,r9,32
afdca0f2
UD
441
442 stvx v2,0,r10
5ef6ae4b
UD
443 stvx v3,0,r9
444 addi r10,r10,32
445 addi r9,r9,32
afdca0f2
UD
446
447 stvx v4,0,r10
5ef6ae4b
UD
448 stvx v5,0,r9
449 addi r10,r10,32
450 addi r9,r9,32
afdca0f2
UD
451
452 stvx v6,0,r10
5ef6ae4b
UD
453 stvx v7,0,r9
454 addi r10,r10,32
455 addi r9,r9,32
afdca0f2
UD
456
457 stvx v8,0,r10
5ef6ae4b
UD
458 stvx v9,0,r9
459 addi r10,r10,32
460 addi r9,r9,32
afdca0f2
UD
461
462 stvx v10,0,r10
5ef6ae4b
UD
463 stvx v11,0,r9
464 addi r10,r10,32
465 addi r9,r9,32
afdca0f2
UD
466
467 stvx v12,0,r10
5ef6ae4b
UD
468 stvx v13,0,r9
469 addi r10,r10,32
470 addi r9,r9,32
afdca0f2
UD
471
472 stvx v14,0,r10
5ef6ae4b
UD
473 stvx v15,0,r9
474 addi r10,r10,32
475 addi r9,r9,32
afdca0f2
UD
476
477 stvx v16,0,r10
5ef6ae4b
UD
478 stvx v17,0,r9
479 addi r10,r10,32
480 addi r9,r9,32
afdca0f2
UD
481
482 stvx v18,0,r10
e1ad4c53
RM
483 stvx v19,0,r9
484 addi r10,r10,32
5ef6ae4b 485 addi r9,r9,32
afdca0f2
UD
486
487 stvx v20,0,r10
5ef6ae4b
UD
488 stvx v21,0,r9
489 addi r10,r10,32
490 addi r9,r9,32
afdca0f2
UD
491
492 stvx v22,0,r10
5ef6ae4b
UD
493 stvx v23,0,r9
494 addi r10,r10,32
495 addi r9,r9,32
afdca0f2
UD
496
497 stvx v24,0,r10
5ef6ae4b
UD
498 stvx v25,0,r9
499 addi r10,r10,32
500 addi r9,r9,32
afdca0f2
UD
501
502 stvx v26,0,r10
5ef6ae4b
UD
503 stvx v27,0,r9
504 addi r10,r10,32
505 addi r9,r9,32
afdca0f2
UD
506
507 stvx v28,0,r10
5ef6ae4b
UD
508 stvx v29,0,r9
509 addi r10,r10,32
510 addi r9,r9,32
afdca0f2
UD
511
512 stvx v30,0,r10
5ef6ae4b
UD
513 stvx v31,0,r9
514 addi r10,r10,32
515 addi r9,r9,32
afdca0f2 516
5ef6ae4b
UD
517 mfvscr v0
518 mfspr r0,VRSAVE
519 stvx v0,0,r10
fb9d5c73 520 stw r0,0(r9)
afdca0f2 521
5ef6ae4b 522L(has_no_vec):
afdca0f2 523/*
5ef6ae4b
UD
524 Store either a NULL or a quadword aligned pointer to the Vector register
525 array into *v_regs.
526*/
e1ad4c53 527 std r8,(SIGCONTEXT_V_REGS_PTR)(r3)
609b4783
UD
528
529 mr r31,r4
530 addi r5,r3,UCONTEXT_SIGMASK
531 addi r4,r4,UCONTEXT_SIGMASK
532 li r3,SIG_SETMASK
d980f41a 533 bl JUMPTARGET(__sigprocmask)
609b4783
UD
534 nop
535 cmpdi r3,0
536 bne L(error_exit)
537
538/*
539 * If this new ucontext refers to the point where we were interrupted
540 * by a signal, we have to use the rt_sigreturn system call to
541 * return to the context so we get both LR and CTR restored.
542 *
543 * Otherwise, the context we are restoring is either just after
544 * a procedure call (getcontext/swapcontext) or at the beginning
545 * of a procedure call (makecontext), so we don't need to restore
546 * msr and ctr. We don't restore r13 since it will be used as
547 * the TLS pointer. */
16cc1800 548 ld r0,(SIGCONTEXT_GP_REGS+(PT_MSR*8))(r31)
609b4783
UD
549 cmpdi r0,0
550 bne L(do_sigret)
afdca0f2 551
5ef6ae4b
UD
552 ld r8,.LC__dl_hwcap@toc(r2)
553 ld r10,(SIGCONTEXT_V_REGS_PTR)(r31)
ef690add 554# ifdef SHARED
5ef6ae4b 555/* Load _rtld-global._dl_hwcap. */
ef690add
UD
556 ld r8,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET(r8)
557# else
5ef6ae4b 558 ld r8,0(r8) /* Load extern _dl_hwcap. */
ef690add 559# endif
edba7a54 560 andis. r6,r8,(PPC_FEATURE_HAS_ALTIVEC >> 16)
5ef6ae4b 561 beq L(has_no_vec2)
afdca0f2 562
5ef6ae4b
UD
563 cmpdi r10,0
564 beq L(has_no_vec2)
565 lwz r0,(33*16)(r10)
afdca0f2 566
5ef6ae4b
UD
567 li r9,(16*32)
568 mtspr VRSAVE,r0
569 cmpwi r0,0
afdca0f2
UD
570 beq L(has_no_vec2)
571
5ef6ae4b
UD
572 lvx v19,r9,r10
573 la r9,(16)(r10)
afdca0f2
UD
574
575 lvx v0,0,r10
5ef6ae4b
UD
576 lvx v1,0,r9
577 addi r10,r10,32
578 addi r9,r9,32
afdca0f2 579
5ef6ae4b 580 mtvscr v19
afdca0f2 581 lvx v2,0,r10
5ef6ae4b
UD
582 lvx v3,0,r9
583 addi r10,r10,32
584 addi r9,r9,32
afdca0f2
UD
585
586 lvx v4,0,r10
5ef6ae4b
UD
587 lvx v5,0,r9
588 addi r10,r10,32
589 addi r9,r9,32
afdca0f2
UD
590
591 lvx v6,0,r10
5ef6ae4b
UD
592 lvx v7,0,r9
593 addi r10,r10,32
594 addi r9,r9,32
afdca0f2
UD
595
596 lvx v8,0,r10
5ef6ae4b
UD
597 lvx v9,0,r9
598 addi r10,r10,32
599 addi r9,r9,32
afdca0f2
UD
600
601 lvx v10,0,r10
5ef6ae4b
UD
602 lvx v11,0,r9
603 addi r10,r10,32
604 addi r9,r9,32
afdca0f2
UD
605
606 lvx v12,0,r10
5ef6ae4b
UD
607 lvx v13,0,r9
608 addi r10,r10,32
609 addi r9,r9,32
afdca0f2
UD
610
611 lvx v14,0,r10
5ef6ae4b
UD
612 lvx v15,0,r9
613 addi r10,r10,32
614 addi r9,r9,32
afdca0f2
UD
615
616 lvx v16,0,r10
5ef6ae4b
UD
617 lvx v17,0,r9
618 addi r10,r10,32
619 addi r9,r9,32
afdca0f2
UD
620
621 lvx v18,0,r10
e1ad4c53
RM
622 lvx v19,0,r9
623 addi r10,r10,32
5ef6ae4b 624 addi r9,r9,32
afdca0f2
UD
625
626 lvx v20,0,r10
5ef6ae4b
UD
627 lvx v21,0,r9
628 addi r10,r10,32
629 addi r9,r9,32
afdca0f2
UD
630
631 lvx v22,0,r10
5ef6ae4b
UD
632 lvx v23,0,r9
633 addi r10,r10,32
634 addi r9,r9,32
afdca0f2
UD
635
636 lvx v24,0,r10
5ef6ae4b
UD
637 lvx v25,0,r9
638 addi r10,r10,32
639 addi r9,r9,32
afdca0f2
UD
640
641 lvx v26,0,r10
5ef6ae4b
UD
642 lvx v27,0,r9
643 addi r10,r10,32
644 addi r9,r9,32
afdca0f2
UD
645
646 lvx v28,0,r10
5ef6ae4b
UD
647 lvx v29,0,r9
648 addi r10,r10,32
649 addi r9,r9,32
afdca0f2
UD
650
651 lvx v30,0,r10
5ef6ae4b
UD
652 lvx v31,0,r9
653 addi r10,r10,32
654 addi r9,r9,32
afdca0f2
UD
655
656 lvx v10,0,r10
5ef6ae4b
UD
657 lvx v11,0,r9
658 addi r10,r10,32
659 addi r9,r9,32
afdca0f2 660
5ef6ae4b 661L(has_no_vec2):
609b4783
UD
662
663 lfd fp0,(SIGCONTEXT_FP_REGS+(32*8))(r31)
afdca0f2 664 lfd fp31,(SIGCONTEXT_FP_REGS+(PT_R31*8))(r31)
609b4783 665 lfd fp30,(SIGCONTEXT_FP_REGS+(PT_R30*8))(r31)
db8fed87 666
edba7a54
UD
667# ifdef _ARCH_PWR6
668 /* Use the extended four-operand version of the mtfsf insn. */
bddec78c
UD
669 .machine push
670 .machine "power6"
db8fed87
MS
671
672 mtfsf 0xff,fp0,1,0
673
674 .machine pop
675# else
edba7a54
UD
676 /* Availability of DFP indicates a 64-bit FPSCR. */
677 andi. r6,r8,PPC_FEATURE_HAS_DFP
678 beq 7f
db8fed87
MS
679
680 .machine push
681 .machine "power6"
682
edba7a54 683 mtfsf 0xff,fp0,1,0
db8fed87
MS
684
685 .machine pop
686
edba7a54
UD
687 b 8f
688 /* Continue to operate on the FPSCR as if it were 32-bits. */
6897:
609b4783 690 mtfsf 0xff,fp0
edba7a54
UD
6918:
692#endif /* _ARCH_PWR6 */
db8fed87 693
afdca0f2 694 lfd fp29,(SIGCONTEXT_FP_REGS+(PT_R29*8))(r31)
609b4783 695 lfd fp28,(SIGCONTEXT_FP_REGS+(PT_R28*8))(r31)
afdca0f2 696 lfd fp27,(SIGCONTEXT_FP_REGS+(PT_R27*8))(r31)
609b4783 697 lfd fp26,(SIGCONTEXT_FP_REGS+(PT_R26*8))(r31)
afdca0f2 698 lfd fp25,(SIGCONTEXT_FP_REGS+(PT_R25*8))(r31)
609b4783 699 lfd fp24,(SIGCONTEXT_FP_REGS+(PT_R24*8))(r31)
afdca0f2 700 lfd fp23,(SIGCONTEXT_FP_REGS+(PT_R23*8))(r31)
609b4783 701 lfd fp22,(SIGCONTEXT_FP_REGS+(PT_R22*8))(r31)
afdca0f2 702 lfd fp21,(SIGCONTEXT_FP_REGS+(PT_R21*8))(r31)
609b4783 703 lfd fp20,(SIGCONTEXT_FP_REGS+(PT_R20*8))(r31)
afdca0f2 704 lfd fp19,(SIGCONTEXT_FP_REGS+(PT_R19*8))(r31)
609b4783 705 lfd fp18,(SIGCONTEXT_FP_REGS+(PT_R18*8))(r31)
afdca0f2 706 lfd fp17,(SIGCONTEXT_FP_REGS+(PT_R17*8))(r31)
609b4783 707 lfd fp16,(SIGCONTEXT_FP_REGS+(PT_R16*8))(r31)
afdca0f2 708 lfd fp15,(SIGCONTEXT_FP_REGS+(PT_R15*8))(r31)
609b4783 709 lfd fp14,(SIGCONTEXT_FP_REGS+(PT_R14*8))(r31)
afdca0f2 710 lfd fp13,(SIGCONTEXT_FP_REGS+(PT_R13*8))(r31)
609b4783 711 lfd fp12,(SIGCONTEXT_FP_REGS+(PT_R12*8))(r31)
afdca0f2 712 lfd fp11,(SIGCONTEXT_FP_REGS+(PT_R11*8))(r31)
609b4783 713 lfd fp10,(SIGCONTEXT_FP_REGS+(PT_R10*8))(r31)
afdca0f2 714 lfd fp9,(SIGCONTEXT_FP_REGS+(PT_R9*8))(r31)
609b4783 715 lfd fp8,(SIGCONTEXT_FP_REGS+(PT_R8*8))(r31)
afdca0f2 716 lfd fp7,(SIGCONTEXT_FP_REGS+(PT_R7*8))(r31)
609b4783 717 lfd fp6,(SIGCONTEXT_FP_REGS+(PT_R6*8))(r31)
afdca0f2 718 lfd fp5,(SIGCONTEXT_FP_REGS+(PT_R5*8))(r31)
609b4783 719 lfd fp4,(SIGCONTEXT_FP_REGS+(PT_R4*8))(r31)
afdca0f2 720 lfd fp3,(SIGCONTEXT_FP_REGS+(PT_R3*8))(r31)
609b4783 721 lfd fp2,(SIGCONTEXT_FP_REGS+(PT_R2*8))(r31)
afdca0f2 722 lfd fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r31)
609b4783 723 lfd fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r31)
afdca0f2
UD
724
725 ld r0,(SIGCONTEXT_GP_REGS+(PT_LNK*8))(r31)
609b4783
UD
726 ld r1,(SIGCONTEXT_GP_REGS+(PT_R1*8))(r31)
727 mtlr r0
728 ld r2,(SIGCONTEXT_GP_REGS+(PT_R2*8))(r31)
729 ld r0,(SIGCONTEXT_GP_REGS+(PT_XER*8))(r31)
730 ld r3,(SIGCONTEXT_GP_REGS+(PT_R3*8))(r31)
731 mtxer r0
732 ld r4,(SIGCONTEXT_GP_REGS+(PT_R4*8))(r31)
733 ld r0,(SIGCONTEXT_GP_REGS+(PT_CCR*8))(r31)
734 ld r5,(SIGCONTEXT_GP_REGS+(PT_R5*8))(r31)
609b4783
UD
735 ld r6,(SIGCONTEXT_GP_REGS+(PT_R6*8))(r31)
736 ld r7,(SIGCONTEXT_GP_REGS+(PT_R7*8))(r31)
737 ld r8,(SIGCONTEXT_GP_REGS+(PT_R8*8))(r31)
738 ld r9,(SIGCONTEXT_GP_REGS+(PT_R9*8))(r31)
16cc1800 739 mtcr r0
609b4783
UD
740 ld r10,(SIGCONTEXT_GP_REGS+(PT_R10*8))(r31)
741 ld r11,(SIGCONTEXT_GP_REGS+(PT_R11*8))(r31)
742 ld r12,(SIGCONTEXT_GP_REGS+(PT_R12*8))(r31)
743 /* Don't reload the thread ID or TLS pointer (r13). */
744 ld r14,(SIGCONTEXT_GP_REGS+(PT_R14*8))(r31)
745 ld r15,(SIGCONTEXT_GP_REGS+(PT_R15*8))(r31)
746 ld r16,(SIGCONTEXT_GP_REGS+(PT_R16*8))(r31)
747 ld r17,(SIGCONTEXT_GP_REGS+(PT_R17*8))(r31)
748 ld r18,(SIGCONTEXT_GP_REGS+(PT_R18*8))(r31)
749 ld r19,(SIGCONTEXT_GP_REGS+(PT_R19*8))(r31)
750 ld r20,(SIGCONTEXT_GP_REGS+(PT_R20*8))(r31)
751 ld r21,(SIGCONTEXT_GP_REGS+(PT_R21*8))(r31)
752 ld r22,(SIGCONTEXT_GP_REGS+(PT_R22*8))(r31)
753 ld r23,(SIGCONTEXT_GP_REGS+(PT_R23*8))(r31)
754 ld r24,(SIGCONTEXT_GP_REGS+(PT_R24*8))(r31)
755 ld r25,(SIGCONTEXT_GP_REGS+(PT_R25*8))(r31)
756 ld r26,(SIGCONTEXT_GP_REGS+(PT_R26*8))(r31)
757 ld r27,(SIGCONTEXT_GP_REGS+(PT_R27*8))(r31)
758 ld r28,(SIGCONTEXT_GP_REGS+(PT_R28*8))(r31)
759 ld r29,(SIGCONTEXT_GP_REGS+(PT_R29*8))(r31)
760 ld r30,(SIGCONTEXT_GP_REGS+(PT_R30*8))(r31)
afdca0f2 761
609b4783 762 /* Now we branch to the "Next Instruction Pointer" from the saved
afdca0f2 763 context. With the powerpc64 instruction set there is no good way to
609b4783 764 do this (from user state) without clobbering either the LR or CTR.
afdca0f2 765 The makecontext and swapcontext functions depend on the callers
609b4783
UD
766 LR being preserved so we use the CTR. */
767 ld r0,(SIGCONTEXT_GP_REGS+(PT_NIP*8))(r31)
768 mtctr r0
769 ld r0,(SIGCONTEXT_GP_REGS+(PT_R0*8))(r31)
770 ld r31,(SIGCONTEXT_GP_REGS+(PT_R31*8))(r31)
771 bctr
afdca0f2 772
609b4783 773L(error_exit):
afdca0f2 774 ld r0,128+FRAME_LR_SAVE(r1)
609b4783
UD
775 addi r1,r1,128
776 mtlr r0
777 ld r31,-8(r1)
778 blr
779
afdca0f2
UD
780 /* At this point we assume that the ucontext was created by a
781 rt_signal and we should use rt_sigreturn to restore the original
782 state. As of the 2.4.21 kernel the ucontext is the first thing
783 (offset 0) in the rt_signal frame and rt_sigreturn expects the
784 ucontext address in R1. Normally the rt-signal trampoline handles
785 this by popping dummy frame before the rt_signal syscall. In our
786 case the stack may not be in its original (signal handler return with
787 R1 pointing at the dummy frame) state. We do have the ucontext
609b4783
UD
788 address in R3, so simply copy R3 to R1 before the syscall. */
789L(do_sigret):
790 mr r1,r3,
791 li r0,SYS_ify(rt_sigreturn)
792 sc
793 /* No return. */
794
795PSEUDO_END(__swapcontext)
796
5ef6ae4b 797versioned_symbol (libc, __swapcontext, swapcontext, GLIBC_2_3_4)