2.5-18.1
[glibc.git] / sysdeps / unix / sysv / linux / powerpc / powerpc64 / setcontext.S
blob48e9af363d480b5e00e780890c1b8ba9c71e2249
1 /* Switch to context.
2    Copyright (C) 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
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.
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.
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA
18    02110-1301 USA.  */
20 #include <sysdep.h>
21 #include <rtld-global-offsets.h>
22 #include <shlib-compat.h>
23 #include <kernel-features.h>
25 #define __ASSEMBLY__
26 #include <asm/ptrace.h>
27 #include "ucontext_i.h"
28 #include <asm/errno.h>
30 #if SHLIB_COMPAT (libc, GLIBC_2_3, GLIBC_2_3_4)
31 ENTRY(__novec_setcontext)
32         CALL_MCOUNT 1
33 #ifdef __ASSUME_NEW_RT_SIGRETURN_SYSCALL
34   mflr  r0
35   std   r31,-8(1)
36   cfi_offset(r31,-8)
37   std   r0,FRAME_LR_SAVE(r1)
38   cfi_offset (lr, FRAME_LR_SAVE)
39   stdu  r1,-128(r1)
40   cfi_adjust_cfa_offset (128)
41   mr    r31,r3
44  * If this ucontext refers to the point where we were interrupted
45  * by a signal, we have to use the rt_sigreturn system call to
46  * return to the context so we get both LR and CTR restored.
47  *
48  * Otherwise, the context we are restoring is either just after
49  * a procedure call (getcontext/swapcontext) or at the beginning
50  * of a procedure call (makecontext), so we don't need to restore
51  * msr and ctr.  We don't restore r13 since it will be used as
52  * the TLS pointer.  */
53   ld      r0,(SIGCONTEXT_GP_REGS+(PT_MSR*8))(r31)
54   cmpdi r0,0
55   bne     L(nv_do_sigret)
57   li    r5,0
58   addi  r4,r3,UCONTEXT_SIGMASK
59   li    r3,SIG_SETMASK
60   bl    JUMPTARGET(__sigprocmask)
61   nop
62   cmpdi r3,0
63   bne   L(nv_error_exit)
65   lfd  fp0,(SIGCONTEXT_FP_REGS+(32*8))(r31)
66   lfd  fp31,(SIGCONTEXT_FP_REGS+(PT_R31*8))(r31)
67   lfd  fp30,(SIGCONTEXT_FP_REGS+(PT_R30*8))(r31)
68   mtfsf  0xff,fp0
69   lfd  fp29,(SIGCONTEXT_FP_REGS+(PT_R29*8))(r31)
70   lfd  fp28,(SIGCONTEXT_FP_REGS+(PT_R28*8))(r31)
71   lfd  fp27,(SIGCONTEXT_FP_REGS+(PT_R27*8))(r31)
72   lfd  fp26,(SIGCONTEXT_FP_REGS+(PT_R26*8))(r31)
73   lfd  fp25,(SIGCONTEXT_FP_REGS+(PT_R25*8))(r31)
74   lfd  fp24,(SIGCONTEXT_FP_REGS+(PT_R24*8))(r31)
75   lfd  fp23,(SIGCONTEXT_FP_REGS+(PT_R23*8))(r31)
76   lfd  fp22,(SIGCONTEXT_FP_REGS+(PT_R22*8))(r31)
77   lfd  fp21,(SIGCONTEXT_FP_REGS+(PT_R21*8))(r31)
78   lfd  fp20,(SIGCONTEXT_FP_REGS+(PT_R20*8))(r31)
79   lfd  fp19,(SIGCONTEXT_FP_REGS+(PT_R19*8))(r31)
80   lfd  fp18,(SIGCONTEXT_FP_REGS+(PT_R18*8))(r31)
81   lfd  fp17,(SIGCONTEXT_FP_REGS+(PT_R17*8))(r31)
82   lfd  fp16,(SIGCONTEXT_FP_REGS+(PT_R16*8))(r31)
83   lfd  fp15,(SIGCONTEXT_FP_REGS+(PT_R15*8))(r31)
84   lfd  fp14,(SIGCONTEXT_FP_REGS+(PT_R14*8))(r31)
85   lfd  fp13,(SIGCONTEXT_FP_REGS+(PT_R13*8))(r31)
86   lfd  fp12,(SIGCONTEXT_FP_REGS+(PT_R12*8))(r31)
87   lfd  fp11,(SIGCONTEXT_FP_REGS+(PT_R11*8))(r31)
88   lfd  fp10,(SIGCONTEXT_FP_REGS+(PT_R10*8))(r31)
89   lfd  fp9,(SIGCONTEXT_FP_REGS+(PT_R9*8))(r31)
90   lfd  fp8,(SIGCONTEXT_FP_REGS+(PT_R8*8))(r31)
91   lfd  fp7,(SIGCONTEXT_FP_REGS+(PT_R7*8))(r31)
92   lfd  fp6,(SIGCONTEXT_FP_REGS+(PT_R6*8))(r31)
93   lfd  fp5,(SIGCONTEXT_FP_REGS+(PT_R5*8))(r31)
94   lfd  fp4,(SIGCONTEXT_FP_REGS+(PT_R4*8))(r31)
95   lfd  fp3,(SIGCONTEXT_FP_REGS+(PT_R3*8))(r31)
96   lfd  fp2,(SIGCONTEXT_FP_REGS+(PT_R2*8))(r31)
97   lfd  fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r31)
98   lfd  fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r31)
100   ld   r0,(SIGCONTEXT_GP_REGS+(PT_LNK*8))(r31)
101   ld   r1,(SIGCONTEXT_GP_REGS+(PT_R1*8))(r31)
102   mtlr r0
103   ld   r2,(SIGCONTEXT_GP_REGS+(PT_R2*8))(r31)
104   ld   r0,(SIGCONTEXT_GP_REGS+(PT_XER*8))(r31)
105   ld   r3,(SIGCONTEXT_GP_REGS+(PT_R3*8))(r31)
106   mtxer r0
107   ld   r4,(SIGCONTEXT_GP_REGS+(PT_R4*8))(r31)
108   ld   r0,(SIGCONTEXT_GP_REGS+(PT_CCR*8))(r31)
109   ld   r5,(SIGCONTEXT_GP_REGS+(PT_R5*8))(r31)
110   mtcr r0
111   ld   r6,(SIGCONTEXT_GP_REGS+(PT_R6*8))(r31)
112   ld   r7,(SIGCONTEXT_GP_REGS+(PT_R7*8))(r31)
113   ld   r8,(SIGCONTEXT_GP_REGS+(PT_R8*8))(r31)
114   ld   r9,(SIGCONTEXT_GP_REGS+(PT_R9*8))(r31)
115   ld   r10,(SIGCONTEXT_GP_REGS+(PT_R10*8))(r31)
116   ld   r11,(SIGCONTEXT_GP_REGS+(PT_R11*8))(r31)
117   ld   r12,(SIGCONTEXT_GP_REGS+(PT_R12*8))(r31)
118   /* Don't reload the thread ID or TLS pointer (r13).  */
119   ld   r14,(SIGCONTEXT_GP_REGS+(PT_R14*8))(r31)
120   ld   r15,(SIGCONTEXT_GP_REGS+(PT_R15*8))(r31)
121   ld   r16,(SIGCONTEXT_GP_REGS+(PT_R16*8))(r31)
122   ld   r17,(SIGCONTEXT_GP_REGS+(PT_R17*8))(r31)
123   ld   r18,(SIGCONTEXT_GP_REGS+(PT_R18*8))(r31)
124   ld   r19,(SIGCONTEXT_GP_REGS+(PT_R19*8))(r31)
125   ld   r20,(SIGCONTEXT_GP_REGS+(PT_R20*8))(r31)
126   ld   r21,(SIGCONTEXT_GP_REGS+(PT_R21*8))(r31)
127   ld   r22,(SIGCONTEXT_GP_REGS+(PT_R22*8))(r31)
128   ld   r23,(SIGCONTEXT_GP_REGS+(PT_R23*8))(r31)
129   ld   r24,(SIGCONTEXT_GP_REGS+(PT_R24*8))(r31)
130   ld   r25,(SIGCONTEXT_GP_REGS+(PT_R25*8))(r31)
131   ld   r26,(SIGCONTEXT_GP_REGS+(PT_R26*8))(r31)
132   ld   r27,(SIGCONTEXT_GP_REGS+(PT_R27*8))(r31)
133   ld   r28,(SIGCONTEXT_GP_REGS+(PT_R28*8))(r31)
134   ld   r29,(SIGCONTEXT_GP_REGS+(PT_R29*8))(r31)
135   ld   r30,(SIGCONTEXT_GP_REGS+(PT_R30*8))(r31)
137   /* Now we branch to the "Next Instruction Pointer" from the saved
138      context.  With the powerpc64 instruction set there is no good way to
139      do this (from user state) without clobbering either the LR or CTR.
140      The makecontext and swapcontext functions depend on the callers
141      LR being preserved so we use the CTR.  */
142   ld   r0,(SIGCONTEXT_GP_REGS+(PT_NIP*8))(r31)
143   mtctr r0
144   ld   r0,(SIGCONTEXT_GP_REGS+(PT_R0*8))(r31)
145   ld   r31,(SIGCONTEXT_GP_REGS+(PT_R31*8))(r31)
146   bctr
148 L(nv_error_exit):
149   ld   r0,128+FRAME_LR_SAVE(r1)
150   addi r1,r1,128
151   mtlr r0
152         ld   r31,-8(r1)
153   blr
155   /* At this point we assume that the ucontext was created by a
156      rt_signal and we should use rt_sigreturn to restore the original
157      state.  As of the 2.4.21 kernel the ucontext is the first thing
158      (offset 0) in the rt_signal frame and rt_sigreturn expects the
159      ucontext address in R1.  Normally the rt-signal trampoline handles
160      this by popping dummy frame before the rt_signal syscall.  In our
161      case the stack may not be in its original (signal handler return with
162      R1 pointing at the dummy frame) state.  We do have the ucontext
163      address in R3, so simply copy R3 to R1 before the syscall.  */
164 L(nv_do_sigret):
165   mr   r1,r3,
166   li   r0,SYS_ify(rt_sigreturn)
167   sc
168   /* No return.  */
169 #else
170   /* If the kernel is not at least 2.4.21 then generate a ENOSYS stub.  */
171   mflr r0
172   std  r0,FRAME_LR_SAVE(r1)
173   cfi_offset(lr,FRAME_LR_SAVE)
174   stdu r1,-128(r1)
175   cfi_adjust_cfa_offset(128)
176   li   r3,ENOSYS
177   bl   JUMPTARGET(__syscall_error)
178   nop
179   li   r3,-1
180   ld   r0,128+FRAME_LR_SAVE(r1)
181   addi r1,r1,128
182   mtlr r0
183   blr
184 #endif
186 PSEUDO_END(__novec_setcontext)
188 compat_symbol (libc, __novec_setcontext, setcontext, GLIBC_2_3)
190 #endif
192         .section        ".toc","aw"
193 .LC__dl_hwcap:
194 #ifdef SHARED
195         .tc _rtld_global_ro[TC],_rtld_global_ro
196 #else
197         .tc _dl_hwcap[TC],_dl_hwcap
198 #endif
199         .section ".text"
201         .machine        "altivec"
202 ENTRY(__setcontext)
203         CALL_MCOUNT 1
204 #ifdef __ASSUME_NEW_RT_SIGRETURN_SYSCALL
205   mflr  r0
206   std   r31,-8(1)
207   cfi_offset(r31,-8)
208   std   r0,FRAME_LR_SAVE(r1)
209   cfi_offset (lr, FRAME_LR_SAVE)
210   stdu  r1,-128(r1)
211   cfi_adjust_cfa_offset (128)
212   mr    r31,r3
215  * If this ucontext refers to the point where we were interrupted
216  * by a signal, we have to use the rt_sigreturn system call to
217  * return to the context so we get both LR and CTR restored.
219  * Otherwise, the context we are restoring is either just after
220  * a procedure call (getcontext/swapcontext) or at the beginning
221  * of a procedure call (makecontext), so we don't need to restore
222  * msr and ctr.  We don't restore r13 since it will be used as
223  * the TLS pointer.  */
224   ld      r0,(SIGCONTEXT_GP_REGS+(PT_MSR*8))(r31)
225   cmpdi r0,0
226   bne     L(do_sigret)
228   li    r5,0
229   addi  r4,r3,UCONTEXT_SIGMASK
230   li    r3,SIG_SETMASK
231   bl    JUMPTARGET(__sigprocmask)
232   nop
233   cmpdi r3,0
234   bne   L(error_exit)
236   ld    r5,.LC__dl_hwcap@toc(r2)
237   ld    r10,(SIGCONTEXT_V_REGS_PTR)(r31)
238 # ifdef SHARED
239 /* Load _rtld-global._dl_hwcap.  */
240   ld    r5,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET(r5)
241 # else
242   ld    r5,0(r5) /* Load extern _dl_hwcap.  */
243 # endif
244   andis.  r5,r5,(PPC_FEATURE_HAS_ALTIVEC >> 16)
245   beq   L(has_no_vec)
247   cmpdi r10,0
248   beq   L(has_no_vec)
249   lwz   r0,(33*16)(r10)
251   li    r9,(16*32)
252   mtspr VRSAVE,r0
253   cmpwi r0,0
254   beq   L(has_no_vec)
256   lvx   v19,r9,r10
257   la    r9,(16)(r10)
259   lvx   v0,0,r10
260   lvx   v1,0,r9
261   addi  r10,r10,32
262   addi  r9,r9,32
264   mtvscr  v19
265   lvx   v2,0,r10
266   lvx   v3,0,r9
267   addi  r10,r10,32
268   addi  r9,r9,32
270   lvx   v4,0,r10
271   lvx   v5,0,r9
272   addi  r10,r10,32
273   addi  r9,r9,32
275   lvx   v6,0,r10
276   lvx   v7,0,r9
277   addi  r10,r10,32
278   addi  r9,r9,32
280   lvx   v8,0,r10
281   lvx   v9,0,r9
282   addi  r10,r10,32
283   addi  r9,r9,32
285   lvx   v10,0,r10
286   lvx   v11,0,r9
287   addi  r10,r10,32
288   addi  r9,r9,32
290   lvx   v12,0,r10
291   lvx   v13,0,r9
292   addi  r10,r10,32
293   addi  r9,r9,32
295   lvx   v14,0,r10
296   lvx   v15,0,r9
297   addi  r10,r10,32
298   addi  r9,r9,32
300   lvx   v16,0,r10
301   lvx   v17,0,r9
302   addi  r10,r10,32
303   addi  r9,r9,32
305   lvx   v18,0,r10
306   lvx   v19,0,r9
307   addi  r10,r10,32
308   addi  r9,r9,32
310   lvx   v20,0,r10
311   lvx   v21,0,r9
312   addi  r10,r10,32
313   addi  r9,r9,32
315   lvx   v22,0,r10
316   lvx   v23,0,r9
317   addi  r10,r10,32
318   addi  r9,r9,32
320   lvx   v24,0,r10
321   lvx   v25,0,r9
322   addi  r10,r10,32
323   addi  r9,r9,32
325   lvx   v26,0,r10
326   lvx   v27,0,r9
327   addi  r10,r10,32
328   addi  r9,r9,32
330   lvx   v28,0,r10
331   lvx   v29,0,r9
332   addi  r10,r10,32
333   addi  r9,r9,32
335   lvx   v30,0,r10
336   lvx   v31,0,r9
337   addi  r10,r10,32
338   addi  r9,r9,32
340   lvx   v10,0,r10
341   lvx   v11,0,r9
342   addi  r10,r10,32
343   addi  r9,r9,32
345 L(has_no_vec):
346   lfd  fp0,(SIGCONTEXT_FP_REGS+(32*8))(r31)
347   lfd  fp31,(SIGCONTEXT_FP_REGS+(PT_R31*8))(r31)
348   lfd  fp30,(SIGCONTEXT_FP_REGS+(PT_R30*8))(r31)
349   mtfsf  0xff,fp0
350   lfd  fp29,(SIGCONTEXT_FP_REGS+(PT_R29*8))(r31)
351   lfd  fp28,(SIGCONTEXT_FP_REGS+(PT_R28*8))(r31)
352   lfd  fp27,(SIGCONTEXT_FP_REGS+(PT_R27*8))(r31)
353   lfd  fp26,(SIGCONTEXT_FP_REGS+(PT_R26*8))(r31)
354   lfd  fp25,(SIGCONTEXT_FP_REGS+(PT_R25*8))(r31)
355   lfd  fp24,(SIGCONTEXT_FP_REGS+(PT_R24*8))(r31)
356   lfd  fp23,(SIGCONTEXT_FP_REGS+(PT_R23*8))(r31)
357   lfd  fp22,(SIGCONTEXT_FP_REGS+(PT_R22*8))(r31)
358   lfd  fp21,(SIGCONTEXT_FP_REGS+(PT_R21*8))(r31)
359   lfd  fp20,(SIGCONTEXT_FP_REGS+(PT_R20*8))(r31)
360   lfd  fp19,(SIGCONTEXT_FP_REGS+(PT_R19*8))(r31)
361   lfd  fp18,(SIGCONTEXT_FP_REGS+(PT_R18*8))(r31)
362   lfd  fp17,(SIGCONTEXT_FP_REGS+(PT_R17*8))(r31)
363   lfd  fp16,(SIGCONTEXT_FP_REGS+(PT_R16*8))(r31)
364   lfd  fp15,(SIGCONTEXT_FP_REGS+(PT_R15*8))(r31)
365   lfd  fp14,(SIGCONTEXT_FP_REGS+(PT_R14*8))(r31)
366   lfd  fp13,(SIGCONTEXT_FP_REGS+(PT_R13*8))(r31)
367   lfd  fp12,(SIGCONTEXT_FP_REGS+(PT_R12*8))(r31)
368   lfd  fp11,(SIGCONTEXT_FP_REGS+(PT_R11*8))(r31)
369   lfd  fp10,(SIGCONTEXT_FP_REGS+(PT_R10*8))(r31)
370   lfd  fp9,(SIGCONTEXT_FP_REGS+(PT_R9*8))(r31)
371   lfd  fp8,(SIGCONTEXT_FP_REGS+(PT_R8*8))(r31)
372   lfd  fp7,(SIGCONTEXT_FP_REGS+(PT_R7*8))(r31)
373   lfd  fp6,(SIGCONTEXT_FP_REGS+(PT_R6*8))(r31)
374   lfd  fp5,(SIGCONTEXT_FP_REGS+(PT_R5*8))(r31)
375   lfd  fp4,(SIGCONTEXT_FP_REGS+(PT_R4*8))(r31)
376   lfd  fp3,(SIGCONTEXT_FP_REGS+(PT_R3*8))(r31)
377   lfd  fp2,(SIGCONTEXT_FP_REGS+(PT_R2*8))(r31)
378   lfd  fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r31)
379   lfd  fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r31)
381   ld   r0,(SIGCONTEXT_GP_REGS+(PT_LNK*8))(r31)
382   ld   r1,(SIGCONTEXT_GP_REGS+(PT_R1*8))(r31)
383   mtlr r0
384   ld   r2,(SIGCONTEXT_GP_REGS+(PT_R2*8))(r31)
385   ld   r0,(SIGCONTEXT_GP_REGS+(PT_XER*8))(r31)
386   ld   r3,(SIGCONTEXT_GP_REGS+(PT_R3*8))(r31)
387   mtxer r0
388   ld   r4,(SIGCONTEXT_GP_REGS+(PT_R4*8))(r31)
389   ld   r0,(SIGCONTEXT_GP_REGS+(PT_CCR*8))(r31)
390   ld   r5,(SIGCONTEXT_GP_REGS+(PT_R5*8))(r31)
391   ld   r6,(SIGCONTEXT_GP_REGS+(PT_R6*8))(r31)
392   ld   r7,(SIGCONTEXT_GP_REGS+(PT_R7*8))(r31)
393   ld   r8,(SIGCONTEXT_GP_REGS+(PT_R8*8))(r31)
394   ld   r9,(SIGCONTEXT_GP_REGS+(PT_R9*8))(r31)
395   mtcr r0
396   ld   r10,(SIGCONTEXT_GP_REGS+(PT_R10*8))(r31)
397   ld   r11,(SIGCONTEXT_GP_REGS+(PT_R11*8))(r31)
398   ld   r12,(SIGCONTEXT_GP_REGS+(PT_R12*8))(r31)
399   /* Don't reload the thread ID or TLS pointer (r13).  */
400   ld   r14,(SIGCONTEXT_GP_REGS+(PT_R14*8))(r31)
401   ld   r15,(SIGCONTEXT_GP_REGS+(PT_R15*8))(r31)
402   ld   r16,(SIGCONTEXT_GP_REGS+(PT_R16*8))(r31)
403   ld   r17,(SIGCONTEXT_GP_REGS+(PT_R17*8))(r31)
404   ld   r18,(SIGCONTEXT_GP_REGS+(PT_R18*8))(r31)
405   ld   r19,(SIGCONTEXT_GP_REGS+(PT_R19*8))(r31)
406   ld   r20,(SIGCONTEXT_GP_REGS+(PT_R20*8))(r31)
407   ld   r21,(SIGCONTEXT_GP_REGS+(PT_R21*8))(r31)
408   ld   r22,(SIGCONTEXT_GP_REGS+(PT_R22*8))(r31)
409   ld   r23,(SIGCONTEXT_GP_REGS+(PT_R23*8))(r31)
410   ld   r24,(SIGCONTEXT_GP_REGS+(PT_R24*8))(r31)
411   ld   r25,(SIGCONTEXT_GP_REGS+(PT_R25*8))(r31)
412   ld   r26,(SIGCONTEXT_GP_REGS+(PT_R26*8))(r31)
413   ld   r27,(SIGCONTEXT_GP_REGS+(PT_R27*8))(r31)
414   ld   r28,(SIGCONTEXT_GP_REGS+(PT_R28*8))(r31)
415   ld   r29,(SIGCONTEXT_GP_REGS+(PT_R29*8))(r31)
416   ld   r30,(SIGCONTEXT_GP_REGS+(PT_R30*8))(r31)
418   /* Now we branch to the "Next Instruction Pointer" from the saved
419      context.  With the powerpc64 instruction set there is no good way to
420      do this (from user state) without clobbering either the LR or CTR.
421      The makecontext and swapcontext functions depend on the callers
422      LR being preserved so we use the CTR.  */
423   ld   r0,(SIGCONTEXT_GP_REGS+(PT_NIP*8))(r31)
424   mtctr r0
425   ld   r0,(SIGCONTEXT_GP_REGS+(PT_R0*8))(r31)
426   ld   r31,(SIGCONTEXT_GP_REGS+(PT_R31*8))(r31)
427   bctr
429 L(error_exit):
430   ld   r0,128+FRAME_LR_SAVE(r1)
431   addi r1,r1,128
432   mtlr r0
433         ld   r31,-8(r1)
434   blr
436   /* At this point we assume that the ucontext was created by a
437      rt_signal and we should use rt_sigreturn to restore the original
438      state.  As of the 2.4.21 kernel the ucontext is the first thing
439      (offset 0) in the rt_signal frame and rt_sigreturn expects the
440      ucontext address in R1.  Normally the rt-signal trampoline handles
441      this by popping dummy frame before the rt_signal syscall.  In our
442      case the stack may not be in its original (signal handler return with
443      R1 pointing at the dummy frame) state.  We do have the ucontext
444      address in R3, so simply copy R3 to R1 before the syscall.  */
445 L(do_sigret):
446   mr   r1,r3,
447   li   r0,SYS_ify(rt_sigreturn)
448   sc
449   /* No return.  */
450 #else
451   /* If the kernel is not at least 2.4.21 then generate a ENOSYS stub.  */
452   mflr r0
453   std  r0,FRAME_LR_SAVE(r1)
454   cfi_offset (lr, FRAME_LR_SAVE)
455   stdu r1,-128(r1)
456   cfi_adjust_cfa_offset (128)
457   li   r3,ENOSYS
458   bl   JUMPTARGET(__syscall_error)
459   nop
460   li   r3,-1
461   ld   r0,128+FRAME_LR_SAVE(r1)
462   addi r1,r1,128
463   mtlr r0
464   blr
465 #endif
467 PSEUDO_END(__setcontext)
469 versioned_symbol (libc, __setcontext, setcontext, GLIBC_2_3_4)