Add missing export of fallocate64 on 32-bit platforms.
[glibc.git] / sysdeps / unix / sysv / linux / powerpc / powerpc32 / setcontext-common.S
blob127c9e4581aa5dd8225782372f80c8a0018016e3
1 /* Jump to a new context powerpc32 common.
2    Copyright (C) 2005, 2006, 2008, 2009 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 /* This is the common implementation of setcontext for powerpc32.
21    It not complete in itself should be included in to a framework that
22    defines:
23      __CONTEXT_FUNC_NAME
24    and if appropriate:
25      __CONTEXT_ENABLE_FPRS
26      __CONTEXT_ENABLE_VRS
27    Any archecture that implements the Vector unit is assumed to also
28    implement the floating unit.  */
30 /* Stack frame offsets.  */
31 #define _FRAME_BACKCHAIN        0
32 #define _FRAME_LR_SAVE          4
33 #define _FRAME_PARM_SAVE1       8
34 #define _FRAME_PARM_SAVE2       12
35 #define _FRAME_PARM_SAVE3       16
36 #define _FRAME_PARM_SAVE4       20
38 #ifdef __CONTEXT_ENABLE_VRS
39         .machine        "altivec"
40 #endif
41 ENTRY(__CONTEXT_FUNC_NAME)
42         mflr    r0
43         stwu    r1,-16(r1)
44         cfi_adjust_cfa_offset (16)
45         stw     r0,20(r1)
46         cfi_offset (lr, _FRAME_LR_SAVE)
47         stw     r31,12(r1)
48         cfi_offset(r31,-4)
49         lwz     r31,_UC_REGS_PTR(r3)
51         /*
52          * If this ucontext refers to the point where we were interrupted
53          * by a signal, we have to use the rt_sigreturn system call to
54          * return to the context so we get both LR and CTR restored.
55          *
56          * Otherwise, the context we are restoring is either just after
57          * a procedure call (getcontext/swapcontext) or at the beginning
58          * of a procedure call (makecontext), so we don't need to restore
59          * r0, xer, ctr.  We don't restore r2 since it will be used as
60          * the TLS pointer.
61          */
62         lwz     r0,_UC_GREGS+(PT_MSR*4)(r31)
63         cmpwi   r0,0
64         bne     4f      /* L(do_sigret) */
66         /* Restore the signal mask */
67         li      r5,0
68         addi    r4,r3,_UC_SIGMASK
69         li      r3,SIG_SETMASK
70         bl      __sigprocmask@local
71         cmpwi   r3,0
72         bne     3f      /* L(error_exit) */
74 #ifdef PIC
75         mflr    r8
76 # ifdef HAVE_ASM_PPC_REL16
77         bcl     20,31,1f
78 1:      mflr    r7
79         addis   r7,r7,_GLOBAL_OFFSET_TABLE_-1b@ha
80         addi    r7,r7,_GLOBAL_OFFSET_TABLE_-1b@l
81 # else
82         bl      _GLOBAL_OFFSET_TABLE_@local-4
83         mflr    r7
84 # endif
85 # ifdef SHARED
86         lwz     r7,_rtld_global_ro@got(r7)
87         mtlr    r8
88         lwz     r7,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET+4(r7)
89 # else
90         lwz     r7,_dl_hwcap@got(r7)
91         mtlr    r8
92         lwz     r7,4(r7)
93 # endif
94 #else
95         lis     r7,(_dl_hwcap+4)@ha
96         lwz     r7,(_dl_hwcap+4)@l(r7)
97 #endif
99 #ifdef __CONTEXT_ENABLE_FPRS
100 # ifdef __CONTEXT_ENABLE_VRS
101         andis.  r6,r7,(PPC_FEATURE_HAS_ALTIVEC >> 16)
102         la      r10,(_UC_VREGS)(r31)
103         beq     2f      /* L(has_no_vec) */
105         lwz   r0,(32*16)(r10)
106         li    r9,(32*16)
107         cmpwi r0,0
108         mtspr VRSAVE,r0
109         beq     2f      /* L(has_no_vec) */
111         lvx   v19,r9,r10
112         la    r9,(16)(r10)
114         lvx   v0,0,r10
115         lvx   v1,0,r9
116         addi  r10,r10,32
117         addi  r9,r9,32
119         mtvscr  v19
120         lvx   v2,0,r10
121         lvx   v3,0,r9
122         addi  r10,r10,32
123         addi  r9,r9,32
125         lvx   v4,0,r10
126         lvx   v5,0,r9
127         addi  r10,r10,32
128         addi  r9,r9,32
130         lvx   v6,0,r10
131         lvx   v7,0,r9
132         addi  r10,r10,32
133         addi  r9,r9,32
135         lvx   v8,0,r10
136         lvx   v9,0,r9
137         addi  r10,r10,32
138         addi  r9,r9,32
140         lvx   v10,0,r10
141         lvx   v11,0,r9
142         addi  r10,r10,32
143         addi  r9,r9,32
145         lvx   v12,0,r10
146         lvx   v13,0,r9
147         addi  r10,r10,32
148         addi  r9,r9,32
150         lvx   v14,0,r10
151         lvx   v15,0,r9
152         addi  r10,r10,32
153         addi  r9,r9,32
155         lvx   v16,0,r10
156         lvx   v17,0,r9
157         addi  r10,r10,32
158         addi  r9,r9,32
160         lvx   v18,0,r10
161         lvx   v19,0,r9
162         addi  r10,r10,32
163         addi  r9,r9,32
165         lvx   v20,0,r10
166         lvx   v21,0,r9
167         addi  r10,r10,32
168         addi  r9,r9,32
170         lvx   v22,0,r10
171         lvx   v23,0,r9
172         addi  r10,r10,32
173         addi  r9,r9,32
175         lvx   v24,0,r10
176         lvx   v25,0,r9
177         addi  r10,r10,32
178         addi  r9,r9,32
180         lvx   v26,0,r10
181         lvx   v27,0,r9
182         addi  r10,r10,32
183         addi  r9,r9,32
185         lvx   v28,0,r10
186         lvx   v29,0,r9
187         addi  r10,r10,32
188         addi  r9,r9,32
190         lvx   v30,0,r10
191         lvx   v31,0,r9
192         addi  r10,r10,32
193         addi  r9,r9,32
195         lvx   v10,0,r10
196         lvx   v11,0,r9
198 2: /* L(has_no_vec): */
199 # endif /* __CONTEXT_ENABLE_VRS */
200         /* Restore the floating-point registers */
201         lfd     fp31,_UC_FREGS+(32*8)(r31)
202         lfd     fp0,_UC_FREGS+(0*8)(r31)
203 # ifdef _ARCH_PWR6
204         /* Use the extended four-operand version of the mtfsf insn.  */
205         mtfsf   0xff,fp31,1,0
206 # else
207         .machine push
208         .machine "power6"
209         /* Availability of DFP indicates a 64-bit FPSCR.  */
210         andi.   r6,r7,PPC_FEATURE_HAS_DFP
211         beq     7f
212         /* Use the extended four-operand version of the mtfsf insn.  */
213         mtfsf   0xff,fp31,1,0
214         b       8f
215         /* Continue to operate on the FPSCR as if it were 32-bits.  */
216 7:      mtfsf   0xff,fp31
217 8:      .machine pop
218 # endif /* _ARCH_PWR6 */
219         lfd     fp1,_UC_FREGS+(1*8)(r31)
220         lfd     fp2,_UC_FREGS+(2*8)(r31)
221         lfd     fp3,_UC_FREGS+(3*8)(r31)
222         lfd     fp4,_UC_FREGS+(4*8)(r31)
223         lfd     fp5,_UC_FREGS+(5*8)(r31)
224         lfd     fp6,_UC_FREGS+(6*8)(r31)
225         lfd     fp7,_UC_FREGS+(7*8)(r31)
226         lfd     fp8,_UC_FREGS+(8*8)(r31)
227         lfd     fp9,_UC_FREGS+(9*8)(r31)
228         lfd     fp10,_UC_FREGS+(10*8)(r31)
229         lfd     fp11,_UC_FREGS+(11*8)(r31)
230         lfd     fp12,_UC_FREGS+(12*8)(r31)
231         lfd     fp13,_UC_FREGS+(13*8)(r31)
232         lfd     fp14,_UC_FREGS+(14*8)(r31)
233         lfd     fp15,_UC_FREGS+(15*8)(r31)
234         lfd     fp16,_UC_FREGS+(16*8)(r31)
235         lfd     fp17,_UC_FREGS+(17*8)(r31)
236         lfd     fp18,_UC_FREGS+(18*8)(r31)
237         lfd     fp19,_UC_FREGS+(19*8)(r31)
238         lfd     fp20,_UC_FREGS+(20*8)(r31)
239         lfd     fp21,_UC_FREGS+(21*8)(r31)
240         lfd     fp22,_UC_FREGS+(22*8)(r31)
241         lfd     fp23,_UC_FREGS+(23*8)(r31)
242         lfd     fp24,_UC_FREGS+(24*8)(r31)
243         lfd     fp25,_UC_FREGS+(25*8)(r31)
244         lfd     fp26,_UC_FREGS+(26*8)(r31)
245         lfd     fp27,_UC_FREGS+(27*8)(r31)
246         lfd     fp28,_UC_FREGS+(28*8)(r31)
247         lfd     fp29,_UC_FREGS+(29*8)(r31)
248         lfd     fp30,_UC_FREGS+(30*8)(r31)
249         lfd     fp31,_UC_FREGS+(31*8)(r31)
250 #endif /* __CONTEXT_ENABLE_FPRS */
252         /* Restore LR and CCR, and set CTR to the NIP value */
253         lwz     r3,_UC_GREGS+(PT_LNK*4)(r31)
254         lwz     r4,_UC_GREGS+(PT_NIP*4)(r31)
255         lwz     r5,_UC_GREGS+(PT_CCR*4)(r31)
256         mtlr    r3
257         mtctr   r4
258         mtcr    r5
260         /* Restore the general registers */
261         lwz     r1,_UC_GREGS+(PT_R1*4)(r31)
262         lwz     r3,_UC_GREGS+(PT_R3*4)(r31)
263         lwz     r4,_UC_GREGS+(PT_R4*4)(r31)
264         lwz     r5,_UC_GREGS+(PT_R5*4)(r31)
265         lwz     r6,_UC_GREGS+(PT_R6*4)(r31)
266         lwz     r7,_UC_GREGS+(PT_R7*4)(r31)
267         lwz     r8,_UC_GREGS+(PT_R8*4)(r31)
268         lwz     r9,_UC_GREGS+(PT_R9*4)(r31)
269         lwz     r10,_UC_GREGS+(PT_R10*4)(r31)
270         lwz     r11,_UC_GREGS+(PT_R11*4)(r31)
271         lwz     r12,_UC_GREGS+(PT_R12*4)(r31)
272         lwz     r13,_UC_GREGS+(PT_R13*4)(r31)
273         lwz     r14,_UC_GREGS+(PT_R14*4)(r31)
274         lwz     r15,_UC_GREGS+(PT_R15*4)(r31)
275         lwz     r16,_UC_GREGS+(PT_R16*4)(r31)
276         lwz     r17,_UC_GREGS+(PT_R17*4)(r31)
277         lwz     r18,_UC_GREGS+(PT_R18*4)(r31)
278         lwz     r19,_UC_GREGS+(PT_R19*4)(r31)
279         lwz     r20,_UC_GREGS+(PT_R20*4)(r31)
280         lwz     r21,_UC_GREGS+(PT_R21*4)(r31)
281         lwz     r22,_UC_GREGS+(PT_R22*4)(r31)
282         lwz     r23,_UC_GREGS+(PT_R23*4)(r31)
283         lwz     r24,_UC_GREGS+(PT_R24*4)(r31)
284         lwz     r25,_UC_GREGS+(PT_R25*4)(r31)
285         lwz     r26,_UC_GREGS+(PT_R26*4)(r31)
286         lwz     r27,_UC_GREGS+(PT_R27*4)(r31)
287         lwz     r28,_UC_GREGS+(PT_R28*4)(r31)
288         lwz     r29,_UC_GREGS+(PT_R29*4)(r31)
289         lwz     r30,_UC_GREGS+(PT_R30*4)(r31)
290         lwz     r31,_UC_GREGS+(PT_R31*4)(r31)
292         bctr
294 3: /* L(error_exit): */
295         lwz     r31,12(r1)
296         lwz     r0,20(r1)
297         addi    r1,r1,16
298         mtlr    r0
299         blr
302 4: /* L(do_sigret): */
303         addi    r1,r3,-0xd0
304         li      r0,SYS_ify(rt_sigreturn)
305         sc
306         /* NOTREACHED */
308 END (__CONTEXT_FUNC_NAME)