]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - lib/libkse/arch/ia64/ia64/context.S
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / lib / libkse / arch / ia64 / ia64 / context.S
1 /*
2  * Copyright (c) 2003 Marcel Moolenaar
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #include <machine/asm.h>
28 __FBSDID("$FreeBSD$");
29
30 #include <sys/syscall.h>
31
32 #define SIZEOF_SPECIAL  (18*8)
33
34 /*
35  * int _ia64_restore_context(mcontext_t *mc, intptr_t val, intptr_t *loc);
36  */
37 ENTRY(_ia64_restore_context, 3)
38 {       .mmi
39         invala
40         mov             ar.rsc=0xc
41         add             r32=16,r32
42         ;;
43 }
44 {       .mmi
45         loadrs
46         ld8             r12=[r32]               // sp
47         add             r31=8,r32
48         ;;
49 }
50 {       .mii
51         ld8             r16=[r31],16            // unat (before)
52         add             r30=16,r32
53         add             r14=SIZEOF_SPECIAL,r32
54         ;;
55 }
56 {       .mmi
57         ld8             r17=[r30],16            // rp
58         ld8             r18=[r31],16            // pr
59         mov             r2=r33
60         ;;
61 }
62 {       .mmi
63         ld8             r19=[r30],16            // pfs
64         ld8             r20=[r31],32            // bspstore
65         mov             rp=r17
66         ;;
67 }
68 {       .mmi
69         ld8             r21=[r30],32            // rnat
70         ld8             r22=[r31],16            // rsc
71         mov             pr=r18,0x1fffe
72         ;;
73 }
74 {       .mmi
75         ld8             r23=[r30]               // fpsr
76         ld8             r24=[r31]               // psr          -- not used
77         mov             r3=r34
78         ;;
79 }
80 {       .mmi
81         ld8             r17=[r14],8             // unat (after)
82         mov             ar.bspstore=r20
83         cmp.ne          p15,p0=r0,r3
84         ;;
85 }
86 {       .mmi
87         mov             ar.rnat=r21
88         mov             ar.unat=r17
89         add             r15=8,r14
90         ;;
91 }
92 {       .mmi
93         ld8.fill        r4=[r14],16             // r4
94         ld8.fill        r5=[r15],16             // r5
95         mov             ar.pfs=r19
96         ;;
97 }
98 {       .mmi
99         ld8.fill        r6=[r14],16             // r6
100         ld8.fill        r7=[r15],16             // r7
101         nop             0
102         ;;
103 }
104 {       .mmi
105         mov             ar.unat=r16
106         mov             ar.rsc=r22
107         nop             0
108 }
109 {       .mmi
110         ld8             r17=[r14],16            // b1
111         ld8             r18=[r15],16            // b2
112         nop             0
113         ;;
114 }
115 {       .mmi
116         ld8             r19=[r14],16            // b3
117         ld8             r20=[r15],16            // b4
118         mov             b1=r17
119         ;;
120 }
121 {       .mmi
122         ld8             r16=[r14],24            // b5
123         ld8             r17=[r15],32            // lc
124         mov             b2=r18
125         ;;
126 }
127 {       .mmi
128         ldf.fill        f2=[r14],32
129         ldf.fill        f3=[r15],32
130         mov             b3=r19
131         ;;
132 }
133 {       .mmi
134         ldf.fill        f4=[r14],32
135         ldf.fill        f5=[r15],32
136         mov             b4=r20
137         ;;
138 }
139 {       .mmi
140         ldf.fill        f16=[r14],32
141         ldf.fill        f17=[r15],32
142         mov             b5=r16
143         ;;
144 }
145 {       .mmi
146         ldf.fill        f18=[r14],32
147         ldf.fill        f19=[r15],32
148         mov             ar.lc=r17
149         ;;
150 }
151         ldf.fill        f20=[r14],32
152         ldf.fill        f21=[r15],32
153         ;;
154         ldf.fill        f22=[r14],32
155         ldf.fill        f23=[r15],32
156         ;;
157         ldf.fill        f24=[r14],32
158         ldf.fill        f25=[r15],32
159         ;;
160         ldf.fill        f26=[r14],32
161         ldf.fill        f27=[r15],32
162         ;;
163         ldf.fill        f28=[r14],32
164         ldf.fill        f29=[r15],32
165         ;;
166         ldf.fill        f30=[r14],32+24
167         ldf.fill        f31=[r15],24+24
168         ;;
169         ld8             r8=[r14],16
170         ld8             r9=[r15],16
171         ;;
172         ld8             r10=[r14]
173         ld8             r11=[r15]
174         ;;
175 {       .mmb
176 (p15)   st8             [r3]=r2
177         mov             ar.fpsr=r23
178         br.ret.sptk     rp
179         ;;
180 }
181 END(_ia64_restore_context)
182
183 /*
184  * int _ia64_save_context(mcontext_t *mc);
185  */
186 ENTRY(_ia64_save_context, 1)
187 {       .mmi
188         mov             r14=ar.rsc
189         mov             r15=ar.fpsr
190         add             r31=8,r32
191         ;;
192 }
193 {       .mmi
194         st8             [r32]=r0,16
195         st8             [r31]=r0,16
196         nop             0
197         ;;
198 }
199 {       .mmi
200         mov             ar.rsc=0xc
201         mov             r16=ar.unat
202         nop             0
203         ;;
204 }
205 {       .mmi
206         flushrs
207         st8             [r32]=sp,16             // sp
208         mov             r17=rp
209         ;;
210 }
211 {       .mmi
212         st8             [r31]=r16,16            // unat (before)
213         st8             [r32]=r17,16            // rp
214         mov             r16=pr
215         ;;
216 }
217 {       .mmi
218         st8             [r31]=r16,16            // pr
219         mov             r17=ar.bsp
220         mov             r16=ar.pfs
221         ;;
222 }
223 {       .mmi
224         st8             [r32]=r16,16            // pfs
225         st8             [r31]=r17,16            // bspstore
226         nop             0
227         ;;
228 }
229 {       .mmi
230         mov             r16=ar.rnat
231         mov             ar.rsc=r14
232         add             r30=SIZEOF_SPECIAL-(6*8),r32
233         ;;
234 }
235 {       .mmi
236         st8             [r32]=r16,16            // rnat
237         st8             [r31]=r0,16             // __spare
238         nop             0
239         ;;
240 }
241 {       .mmi
242         st8             [r32]=r13,16            // tp           -- not used
243         st8             [r31]=r14,16            // rsc
244         mov             r16=b1
245         ;;
246 }
247 {       .mmi
248         st8             [r32]=r15,10*8          // fpr
249         st8             [r31]=r0,8*8            // psr
250         nop             0
251         ;;
252 }
253         /* callee_saved */
254 {       .mmi
255         .mem.offset     8,0
256         st8.spill       [r31]=r4,16             // r4
257         .mem.offset     16,0
258         st8.spill       [r32]=r5,16             // r5
259         mov             r17=b2
260         ;;
261 }
262 {       .mmi
263         .mem.offset     24,0
264         st8.spill       [r31]=r6,16             // r6
265         .mem.offset     32,0
266         st8.spill       [r32]=r7,16             // r7
267         mov             r18=b3
268         ;;
269 }
270 {       .mmi
271         st8             [r31]=r16,16            // b1
272         mov             r16=ar.unat
273         mov             r19=b4
274         ;;
275 }
276 {       .mmi
277         st8             [r30]=r16               // unat (after)
278         st8             [r32]=r17,16            // b2
279         mov             r16=b5
280         ;;
281 }
282 {       .mmi
283         st8             [r31]=r18,16            // b3
284         st8             [r32]=r19,16            // b4
285         mov             r17=ar.lc
286         ;;
287 }
288         st8             [r31]=r16,16            // b5
289         st8             [r32]=r17,16            // lc
290         ;;
291         st8             [r31]=r0,24             // __spare
292         stf.spill       [r32]=f2,32
293         ;;
294         stf.spill       [r31]=f3,32
295         stf.spill       [r32]=f4,32
296         ;;
297         stf.spill       [r31]=f5,32
298         stf.spill       [r32]=f16,32
299         ;;
300         stf.spill       [r31]=f17,32
301         stf.spill       [r32]=f18,32
302         ;;
303         stf.spill       [r31]=f19,32
304         stf.spill       [r32]=f20,32
305         ;;
306         stf.spill       [r31]=f21,32
307         stf.spill       [r32]=f22,32
308         ;;
309         stf.spill       [r31]=f23,32
310         stf.spill       [r32]=f24,32
311         ;;
312         stf.spill       [r31]=f25,32
313         stf.spill       [r32]=f26,32
314         ;;
315         stf.spill       [r31]=f27,32
316         stf.spill       [r32]=f28,32
317         ;;
318 {       .mmi
319         stf.spill       [r31]=f29,32
320         stf.spill       [r32]=f30,32+24
321         add             r14=1,r0
322         ;;
323 }
324 {       .mmi
325         stf.spill       [r31]=f31,24+24
326         st8             [r32]=r14,16            // r8
327         add             r8=0,r0
328         ;;
329 }
330         st8             [r31]=r0,16             // r9
331         st8             [r32]=r0                // r10
332         ;;
333 {       .mmb
334         st8             [r31]=r0                // r11
335         mf
336         br.ret.sptk     rp
337         ;;
338 }
339 END(_ia64_save_context)
340
341 /*
342  * void _ia64_break_setcontext(mcontext_t *mc);
343  */
344 ENTRY(_ia64_break_setcontext, 1)
345 {       .mmi
346         mov             r8=r32
347         break           0x180000
348         nop             0
349         ;;
350 }
351 END(_ia64_break_setcontext)