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