Rev 1023 | Rev 1702 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1023 | Rev 1053 | ||
---|---|---|---|
Line 29... | Line 29... | ||
29 | 29 | ||
30 | #include <fpu_context.h> |
30 | #include <fpu_context.h> |
31 | #include <arch/register.h> |
31 | #include <arch/register.h> |
32 | #include <print.h> |
32 | #include <print.h> |
33 | 33 | ||
- | 34 | ||
34 | void fpu_context_save(fpu_context_t *fctx){ |
35 | void fpu_context_save(fpu_context_t *fctx){ |
35 | asm volatile( |
- | |
36 | "stf.spill [%2]=f2,0x80\n" |
- | |
37 | "stf.spill [%3]=f3,0x80\n" |
- | |
38 | "stf.spill [%4]=f4,0x80\n" |
- | |
39 | "stf.spill [%5]=f5,0x80\n" |
- | |
40 | "stf.spill [%6]=f6,0x80\n" |
- | |
41 | "stf.spill [%7]=f7,0x80\n;;" |
- | |
42 | - | ||
43 | "stf.spill [%0]=f8,0x80\n" |
- | |
44 | "stf.spill [%1]=f9,0x80\n" |
- | |
45 | "stf.spill [%2]=f10,0x80\n" |
- | |
46 | "stf.spill [%3]=f11,0x80\n" |
- | |
47 | "stf.spill [%4]=f12,0x80\n" |
- | |
48 | "stf.spill [%5]=f13,0x80\n" |
- | |
49 | "stf.spill [%6]=f14,0x80\n" |
- | |
50 | "stf.spill [%7]=f15,0x80\n;;" |
- | |
51 | - | ||
52 | "stf.spill [%0]=f16,0x80\n" |
- | |
53 | "stf.spill [%1]=f17,0x80\n" |
- | |
54 | "stf.spill [%2]=f18,0x80\n" |
- | |
55 | "stf.spill [%3]=f19,0x80\n" |
- | |
56 | "stf.spill [%4]=f20,0x80\n" |
- | |
57 | "stf.spill [%5]=f21,0x80\n" |
- | |
58 | "stf.spill [%6]=f22,0x80\n" |
- | |
59 | "stf.spill [%7]=f23,0x80\n;;" |
- | |
60 | - | ||
61 | "stf.spill [%0]=f24,0x80\n" |
- | |
62 | "stf.spill [%1]=f25,0x80\n" |
- | |
63 | "stf.spill [%2]=f26,0x80\n" |
- | |
64 | "stf.spill [%3]=f27,0x80\n" |
- | |
65 | "stf.spill [%4]=f28,0x80\n" |
- | |
66 | "stf.spill [%5]=f29,0x80\n" |
- | |
67 | "stf.spill [%6]=f30,0x80\n" |
- | |
68 | "stf.spill [%7]=f31,0x80\n;;" |
- | |
69 | 36 | ||
- | 37 | asm volatile( |
|
70 | 38 | ||
71 | "stf.spill [%0]=f32,0x80\n" |
39 | "stf.spill [%0]=f32,0x80\n" |
72 | "stf.spill [%1]=f33,0x80\n" |
40 | "stf.spill [%1]=f33,0x80\n" |
73 | "stf.spill [%2]=f34,0x80\n" |
41 | "stf.spill [%2]=f34,0x80\n" |
74 | "stf.spill [%3]=f35,0x80\n" |
42 | "stf.spill [%3]=f35,0x80\n" |
Line 186... | Line 154... | ||
186 | } |
154 | } |
187 | 155 | ||
188 | 156 | ||
189 | void fpu_context_restore(fpu_context_t *fctx) |
157 | void fpu_context_restore(fpu_context_t *fctx) |
190 | { |
158 | { |
191 | asm volatile( |
- | |
192 | "ldf.fill f2=[%2],0x80\n" |
- | |
193 | "ldf.fill f3=[%3],0x80\n" |
- | |
194 | "ldf.fill f4=[%4],0x80\n" |
- | |
195 | "ldf.fill f5=[%5],0x80\n" |
- | |
196 | "ldf.fill f6=[%6],0x80\n" |
- | |
197 | "ldf.fill f7=[%7],0x80\n;;" |
- | |
198 | - | ||
199 | "ldf.fill f8=[%0],0x80\n" |
- | |
200 | "ldf.fill f9=[%1],0x80\n" |
- | |
201 | "ldf.fill f10=[%2],0x80\n" |
- | |
202 | "ldf.fill f11=[%3],0x80\n" |
- | |
203 | "ldf.fill f12=[%4],0x80\n" |
- | |
204 | "ldf.fill f13=[%5],0x80\n" |
- | |
205 | "ldf.fill f14=[%6],0x80\n" |
- | |
206 | "ldf.fill f15=[%7],0x80\n;;" |
- | |
207 | - | ||
208 | "ldf.fill f16=[%0],0x80\n" |
- | |
209 | "ldf.fill f17=[%1],0x80\n" |
- | |
210 | "ldf.fill f18=[%2],0x80\n" |
- | |
211 | "ldf.fill f19=[%3],0x80\n" |
- | |
212 | "ldf.fill f20=[%4],0x80\n" |
- | |
213 | "ldf.fill f21=[%5],0x80\n" |
- | |
214 | "ldf.fill f22=[%6],0x80\n" |
- | |
215 | "ldf.fill f23=[%7],0x80\n;;" |
- | |
216 | - | ||
217 | "ldf.fill f24=[%0],0x80\n" |
- | |
218 | "ldf.fill f25=[%1],0x80\n" |
- | |
219 | "ldf.fill f26=[%2],0x80\n" |
- | |
220 | "ldf.fill f27=[%3],0x80\n" |
- | |
221 | "ldf.fill f28=[%4],0x80\n" |
- | |
222 | "ldf.fill f29=[%5],0x80\n" |
- | |
223 | "ldf.fill f30=[%6],0x80\n" |
- | |
224 | "ldf.fill f31=[%7],0x80\n;;" |
- | |
225 | - | ||
226 | 159 | ||
- | 160 | asm volatile( |
|
227 | "ldf.fill f32=[%0],0x80\n" |
161 | "ldf.fill f32=[%0],0x80\n" |
228 | "ldf.fill f33=[%1],0x80\n" |
162 | "ldf.fill f33=[%1],0x80\n" |
229 | "ldf.fill f34=[%2],0x80\n" |
163 | "ldf.fill f34=[%2],0x80\n" |
230 | "ldf.fill f35=[%3],0x80\n" |
164 | "ldf.fill f35=[%3],0x80\n" |
231 | "ldf.fill f36=[%4],0x80\n" |
165 | "ldf.fill f36=[%4],0x80\n" |
Line 336... | Line 270... | ||
336 | 270 | ||
337 | : |
271 | : |
338 | :"r" (&((fctx->fr)[0])),"r" (&((fctx->fr)[1])),"r" (&((fctx->fr)[2])),"r" (&((fctx->fr)[3])), |
272 | :"r" (&((fctx->fr)[0])),"r" (&((fctx->fr)[1])),"r" (&((fctx->fr)[2])),"r" (&((fctx->fr)[3])), |
339 | "r" (&((fctx->fr)[4])),"r" (&((fctx->fr)[5])),"r" (&((fctx->fr)[6])),"r" (&((fctx->fr)[7])) |
273 | "r" (&((fctx->fr)[4])),"r" (&((fctx->fr)[5])),"r" (&((fctx->fr)[6])),"r" (&((fctx->fr)[7])) |
340 | ); |
274 | ); |
341 | - | ||
342 | - | ||
343 | } |
275 | } |
344 | 276 | ||
345 | void fpu_disable(void) |
277 | void fpu_enable(void) |
346 | { |
278 | { |
- | 279 | __u64 a = 0 ; |
|
347 | asm volatile( |
280 | asm volatile( |
348 | "ssm %0;;\n" |
281 | "rsm %0;;" |
349 | "srlz.i\n" |
282 | "srlz.i\n" |
350 | "srlz.d;;\n" |
283 | "srlz.d;;\n" |
351 | : |
284 | : |
352 | :"i" (PSR_DFL_MASK|PSR_DFH_MASK) |
285 | :"i" (PSR_DFH_MASK) |
- | 286 | ); |
|
- | 287 | asm volatile |
|
- | 288 | ( |
|
- | 289 | "mov %0=ar.fpsr;;\n" |
|
- | 290 | "or %0=%0,%1;;\n" |
|
- | 291 | "mov ar.fpsr=%0;;\n" |
|
- | 292 | : "+r" (a) |
|
- | 293 | : "r" (0x38) |
|
353 | ); |
294 | ); |
354 | 295 | ||
355 | } |
296 | } |
356 | 297 | ||
357 | void fpu_enable(void) |
298 | void fpu_disable(void) |
358 | { |
299 | { |
- | 300 | ||
- | 301 | __u64 a = 0 ; |
|
359 | asm volatile( |
302 | asm volatile( |
360 | "rsm %0;;\n" |
303 | "ssm %0;;\n" |
361 | "srlz.i\n" |
304 | "srlz.i\n" |
362 | "srlz.d;;\n" |
305 | "srlz.d;;\n" |
363 | : |
306 | : |
364 | :"i" (PSR_DFL_MASK|PSR_DFH_MASK) |
307 | :"i" (PSR_DFH_MASK) |
- | 308 | ); |
|
- | 309 | asm volatile |
|
- | 310 | ( |
|
- | 311 | "mov %0=ar.fpsr;;\n" |
|
- | 312 | "or %0=%0,%1;;\n" |
|
- | 313 | "mov ar.fpsr=%0;;\n" |
|
- | 314 | : "+r" (a) |
|
- | 315 | : "r" (0x38) |
|
365 | ); |
316 | ); |
366 | 317 | ||
367 | } |
318 | } |
368 | 319 | ||
369 | void fpu_init(void) |
320 | void fpu_init(void) |
370 | { |
321 | { |
371 | __u64 a = 0; |
322 | __u64 a = 0 ; |
372 | fpu_enable(); |
- | |
373 | asm volatile |
323 | asm volatile |
374 | ( |
324 | ( |
375 | "mov %0=ar.fpsr;;\n" |
325 | "mov %0=ar.fpsr;;\n" |
376 | "or %0=%0,%1;;\n" |
326 | "or %0=%0,%1;;\n" |
377 | "mov ar.fpsr=%0;;\n" |
327 | "mov ar.fpsr=%0;;\n" |
378 | : "+r" (a) |
328 | : "+r" (a) |
379 | : "r" (0x38) |
329 | : "r" (0x38) |
380 | ); |
330 | ); |
381 | 331 | ||
382 | asm volatile( |
332 | asm volatile( |
383 | "mov f2=f0\n" |
333 | "mov f2=f0\n" |
384 | "mov f3=f0\n" |
334 | "mov f3=f0\n" |
385 | "mov f4=f0\n" |
335 | "mov f4=f0\n" |
386 | "mov f5=f0\n" |
336 | "mov f5=f0\n" |
Line 519... | Line 469... | ||
519 | "mov f126=f0\n" |
469 | "mov f126=f0\n" |
520 | "mov f127=f0\n" |
470 | "mov f127=f0\n" |
521 | 471 | ||
522 | ); |
472 | ); |
523 | 473 | ||
524 | fpu_enable(); |
- | |
525 | } |
474 | } |
526 | 475 |