00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00036 #include <fpu_context.h>
00037 #include <arch/register.h>
00038 #include <print.h>
00039
00040
00041 void fpu_context_save(fpu_context_t *fctx){
00042
00043 asm volatile(
00044
00045 "stf.spill [%0]=f32,0x80\n"
00046 "stf.spill [%1]=f33,0x80\n"
00047 "stf.spill [%2]=f34,0x80\n"
00048 "stf.spill [%3]=f35,0x80\n"
00049 "stf.spill [%4]=f36,0x80\n"
00050 "stf.spill [%5]=f37,0x80\n"
00051 "stf.spill [%6]=f38,0x80\n"
00052 "stf.spill [%7]=f39,0x80\n;;"
00053
00054 "stf.spill [%0]=f40,0x80\n"
00055 "stf.spill [%1]=f41,0x80\n"
00056 "stf.spill [%2]=f42,0x80\n"
00057 "stf.spill [%3]=f43,0x80\n"
00058 "stf.spill [%4]=f44,0x80\n"
00059 "stf.spill [%5]=f45,0x80\n"
00060 "stf.spill [%6]=f46,0x80\n"
00061 "stf.spill [%7]=f47,0x80\n;;"
00062
00063 "stf.spill [%0]=f48,0x80\n"
00064 "stf.spill [%1]=f49,0x80\n"
00065 "stf.spill [%2]=f50,0x80\n"
00066 "stf.spill [%3]=f51,0x80\n"
00067 "stf.spill [%4]=f52,0x80\n"
00068 "stf.spill [%5]=f53,0x80\n"
00069 "stf.spill [%6]=f54,0x80\n"
00070 "stf.spill [%7]=f55,0x80\n;;"
00071
00072 "stf.spill [%0]=f56,0x80\n"
00073 "stf.spill [%1]=f57,0x80\n"
00074 "stf.spill [%2]=f58,0x80\n"
00075 "stf.spill [%3]=f59,0x80\n"
00076 "stf.spill [%4]=f60,0x80\n"
00077 "stf.spill [%5]=f61,0x80\n"
00078 "stf.spill [%6]=f62,0x80\n"
00079 "stf.spill [%7]=f63,0x80\n;;"
00080
00081 "stf.spill [%0]=f64,0x80\n"
00082 "stf.spill [%1]=f65,0x80\n"
00083 "stf.spill [%2]=f66,0x80\n"
00084 "stf.spill [%3]=f67,0x80\n"
00085 "stf.spill [%4]=f68,0x80\n"
00086 "stf.spill [%5]=f69,0x80\n"
00087 "stf.spill [%6]=f70,0x80\n"
00088 "stf.spill [%7]=f71,0x80\n;;"
00089
00090 "stf.spill [%0]=f72,0x80\n"
00091 "stf.spill [%1]=f73,0x80\n"
00092 "stf.spill [%2]=f74,0x80\n"
00093 "stf.spill [%3]=f75,0x80\n"
00094 "stf.spill [%4]=f76,0x80\n"
00095 "stf.spill [%5]=f77,0x80\n"
00096 "stf.spill [%6]=f78,0x80\n"
00097 "stf.spill [%7]=f79,0x80\n;;"
00098
00099 "stf.spill [%0]=f80,0x80\n"
00100 "stf.spill [%1]=f81,0x80\n"
00101 "stf.spill [%2]=f82,0x80\n"
00102 "stf.spill [%3]=f83,0x80\n"
00103 "stf.spill [%4]=f84,0x80\n"
00104 "stf.spill [%5]=f85,0x80\n"
00105 "stf.spill [%6]=f86,0x80\n"
00106 "stf.spill [%7]=f87,0x80\n;;"
00107
00108 "stf.spill [%0]=f88,0x80\n"
00109 "stf.spill [%1]=f89,0x80\n"
00110 "stf.spill [%2]=f90,0x80\n"
00111 "stf.spill [%3]=f91,0x80\n"
00112 "stf.spill [%4]=f92,0x80\n"
00113 "stf.spill [%5]=f93,0x80\n"
00114 "stf.spill [%6]=f94,0x80\n"
00115 "stf.spill [%7]=f95,0x80\n;;"
00116
00117
00118 "stf.spill [%0]=f96,0x80\n"
00119 "stf.spill [%1]=f97,0x80\n"
00120 "stf.spill [%2]=f98,0x80\n"
00121 "stf.spill [%3]=f99,0x80\n"
00122 "stf.spill [%4]=f100,0x80\n"
00123 "stf.spill [%5]=f101,0x80\n"
00124 "stf.spill [%6]=f102,0x80\n"
00125 "stf.spill [%7]=f103,0x80\n;;"
00126
00127 "stf.spill [%0]=f104,0x80\n"
00128 "stf.spill [%1]=f105,0x80\n"
00129 "stf.spill [%2]=f106,0x80\n"
00130 "stf.spill [%3]=f107,0x80\n"
00131 "stf.spill [%4]=f108,0x80\n"
00132 "stf.spill [%5]=f109,0x80\n"
00133 "stf.spill [%6]=f110,0x80\n"
00134 "stf.spill [%7]=f111,0x80\n;;"
00135
00136 "stf.spill [%0]=f112,0x80\n"
00137 "stf.spill [%1]=f113,0x80\n"
00138 "stf.spill [%2]=f114,0x80\n"
00139 "stf.spill [%3]=f115,0x80\n"
00140 "stf.spill [%4]=f116,0x80\n"
00141 "stf.spill [%5]=f117,0x80\n"
00142 "stf.spill [%6]=f118,0x80\n"
00143 "stf.spill [%7]=f119,0x80\n;;"
00144
00145 "stf.spill [%0]=f120,0x80\n"
00146 "stf.spill [%1]=f121,0x80\n"
00147 "stf.spill [%2]=f122,0x80\n"
00148 "stf.spill [%3]=f123,0x80\n"
00149 "stf.spill [%4]=f124,0x80\n"
00150 "stf.spill [%5]=f125,0x80\n"
00151 "stf.spill [%6]=f126,0x80\n"
00152 "stf.spill [%7]=f127,0x80\n;;"
00153
00154
00155 :
00156 :"r" (&((fctx->fr)[0])),"r" (&((fctx->fr)[1])),"r" (&((fctx->fr)[2])),"r" (&((fctx->fr)[3])),
00157 "r" (&((fctx->fr)[4])),"r" (&((fctx->fr)[5])),"r" (&((fctx->fr)[6])),"r" (&((fctx->fr)[7]))
00158 );
00159
00160 }
00161
00162
00163 void fpu_context_restore(fpu_context_t *fctx)
00164 {
00165
00166 asm volatile(
00167 "ldf.fill f32=[%0],0x80\n"
00168 "ldf.fill f33=[%1],0x80\n"
00169 "ldf.fill f34=[%2],0x80\n"
00170 "ldf.fill f35=[%3],0x80\n"
00171 "ldf.fill f36=[%4],0x80\n"
00172 "ldf.fill f37=[%5],0x80\n"
00173 "ldf.fill f38=[%6],0x80\n"
00174 "ldf.fill f39=[%7],0x80\n;;"
00175
00176 "ldf.fill f40=[%0],0x80\n"
00177 "ldf.fill f41=[%1],0x80\n"
00178 "ldf.fill f42=[%2],0x80\n"
00179 "ldf.fill f43=[%3],0x80\n"
00180 "ldf.fill f44=[%4],0x80\n"
00181 "ldf.fill f45=[%5],0x80\n"
00182 "ldf.fill f46=[%6],0x80\n"
00183 "ldf.fill f47=[%7],0x80\n;;"
00184
00185 "ldf.fill f48=[%0],0x80\n"
00186 "ldf.fill f49=[%1],0x80\n"
00187 "ldf.fill f50=[%2],0x80\n"
00188 "ldf.fill f51=[%3],0x80\n"
00189 "ldf.fill f52=[%4],0x80\n"
00190 "ldf.fill f53=[%5],0x80\n"
00191 "ldf.fill f54=[%6],0x80\n"
00192 "ldf.fill f55=[%7],0x80\n;;"
00193
00194 "ldf.fill f56=[%0],0x80\n"
00195 "ldf.fill f57=[%1],0x80\n"
00196 "ldf.fill f58=[%2],0x80\n"
00197 "ldf.fill f59=[%3],0x80\n"
00198 "ldf.fill f60=[%4],0x80\n"
00199 "ldf.fill f61=[%5],0x80\n"
00200 "ldf.fill f62=[%6],0x80\n"
00201 "ldf.fill f63=[%7],0x80\n;;"
00202
00203 "ldf.fill f64=[%0],0x80\n"
00204 "ldf.fill f65=[%1],0x80\n"
00205 "ldf.fill f66=[%2],0x80\n"
00206 "ldf.fill f67=[%3],0x80\n"
00207 "ldf.fill f68=[%4],0x80\n"
00208 "ldf.fill f69=[%5],0x80\n"
00209 "ldf.fill f70=[%6],0x80\n"
00210 "ldf.fill f71=[%7],0x80\n;;"
00211
00212 "ldf.fill f72=[%0],0x80\n"
00213 "ldf.fill f73=[%1],0x80\n"
00214 "ldf.fill f74=[%2],0x80\n"
00215 "ldf.fill f75=[%3],0x80\n"
00216 "ldf.fill f76=[%4],0x80\n"
00217 "ldf.fill f77=[%5],0x80\n"
00218 "ldf.fill f78=[%6],0x80\n"
00219 "ldf.fill f79=[%7],0x80\n;;"
00220
00221 "ldf.fill f80=[%0],0x80\n"
00222 "ldf.fill f81=[%1],0x80\n"
00223 "ldf.fill f82=[%2],0x80\n"
00224 "ldf.fill f83=[%3],0x80\n"
00225 "ldf.fill f84=[%4],0x80\n"
00226 "ldf.fill f85=[%5],0x80\n"
00227 "ldf.fill f86=[%6],0x80\n"
00228 "ldf.fill f87=[%7],0x80\n;;"
00229
00230 "ldf.fill f88=[%0],0x80\n"
00231 "ldf.fill f89=[%1],0x80\n"
00232 "ldf.fill f90=[%2],0x80\n"
00233 "ldf.fill f91=[%3],0x80\n"
00234 "ldf.fill f92=[%4],0x80\n"
00235 "ldf.fill f93=[%5],0x80\n"
00236 "ldf.fill f94=[%6],0x80\n"
00237 "ldf.fill f95=[%7],0x80\n;;"
00238
00239
00240 "ldf.fill f96=[%0],0x80\n"
00241 "ldf.fill f97=[%1],0x80\n"
00242 "ldf.fill f98=[%2],0x80\n"
00243 "ldf.fill f99=[%3],0x80\n"
00244 "ldf.fill f100=[%4],0x80\n"
00245 "ldf.fill f101=[%5],0x80\n"
00246 "ldf.fill f102=[%6],0x80\n"
00247 "ldf.fill f103=[%7],0x80\n;;"
00248
00249 "ldf.fill f104=[%0],0x80\n"
00250 "ldf.fill f105=[%1],0x80\n"
00251 "ldf.fill f106=[%2],0x80\n"
00252 "ldf.fill f107=[%3],0x80\n"
00253 "ldf.fill f108=[%4],0x80\n"
00254 "ldf.fill f109=[%5],0x80\n"
00255 "ldf.fill f110=[%6],0x80\n"
00256 "ldf.fill f111=[%7],0x80\n;;"
00257
00258 "ldf.fill f112=[%0],0x80\n"
00259 "ldf.fill f113=[%1],0x80\n"
00260 "ldf.fill f114=[%2],0x80\n"
00261 "ldf.fill f115=[%3],0x80\n"
00262 "ldf.fill f116=[%4],0x80\n"
00263 "ldf.fill f117=[%5],0x80\n"
00264 "ldf.fill f118=[%6],0x80\n"
00265 "ldf.fill f119=[%7],0x80\n;;"
00266
00267 "ldf.fill f120=[%0],0x80\n"
00268 "ldf.fill f121=[%1],0x80\n"
00269 "ldf.fill f122=[%2],0x80\n"
00270 "ldf.fill f123=[%3],0x80\n"
00271 "ldf.fill f124=[%4],0x80\n"
00272 "ldf.fill f125=[%5],0x80\n"
00273 "ldf.fill f126=[%6],0x80\n"
00274 "ldf.fill f127=[%7],0x80\n;;"
00275
00276
00277 :
00278 :"r" (&((fctx->fr)[0])),"r" (&((fctx->fr)[1])),"r" (&((fctx->fr)[2])),"r" (&((fctx->fr)[3])),
00279 "r" (&((fctx->fr)[4])),"r" (&((fctx->fr)[5])),"r" (&((fctx->fr)[6])),"r" (&((fctx->fr)[7]))
00280 );
00281 }
00282
00283 void fpu_enable(void)
00284 {
00285 __u64 a = 0 ;
00286 asm volatile(
00287 "rsm %0;;"
00288 "srlz.i\n"
00289 "srlz.d;;\n"
00290 :
00291 :"i" (PSR_DFH_MASK)
00292 );
00293 asm volatile
00294 (
00295 "mov %0=ar.fpsr;;\n"
00296 "or %0=%0,%1;;\n"
00297 "mov ar.fpsr=%0;;\n"
00298 : "+r" (a)
00299 : "r" (0x38)
00300 );
00301
00302 }
00303
00304 void fpu_disable(void)
00305 {
00306
00307 __u64 a = 0 ;
00308 asm volatile(
00309 "ssm %0;;\n"
00310 "srlz.i\n"
00311 "srlz.d;;\n"
00312 :
00313 :"i" (PSR_DFH_MASK)
00314 );
00315 asm volatile
00316 (
00317 "mov %0=ar.fpsr;;\n"
00318 "or %0=%0,%1;;\n"
00319 "mov ar.fpsr=%0;;\n"
00320 : "+r" (a)
00321 : "r" (0x38)
00322 );
00323
00324 }
00325
00326 void fpu_init(void)
00327 {
00328 __u64 a = 0 ;
00329 asm volatile
00330 (
00331 "mov %0=ar.fpsr;;\n"
00332 "or %0=%0,%1;;\n"
00333 "mov ar.fpsr=%0;;\n"
00334 : "+r" (a)
00335 : "r" (0x38)
00336 );
00337
00338 asm volatile(
00339 "mov f2=f0\n"
00340 "mov f3=f0\n"
00341 "mov f4=f0\n"
00342 "mov f5=f0\n"
00343 "mov f6=f0\n"
00344 "mov f7=f0\n"
00345 "mov f8=f0\n"
00346 "mov f9=f0\n"
00347
00348 "mov f10=f0\n"
00349 "mov f11=f0\n"
00350 "mov f12=f0\n"
00351 "mov f13=f0\n"
00352 "mov f14=f0\n"
00353 "mov f15=f0\n"
00354 "mov f16=f0\n"
00355 "mov f17=f0\n"
00356 "mov f18=f0\n"
00357 "mov f19=f0\n"
00358
00359 "mov f20=f0\n"
00360 "mov f21=f0\n"
00361 "mov f22=f0\n"
00362 "mov f23=f0\n"
00363 "mov f24=f0\n"
00364 "mov f25=f0\n"
00365 "mov f26=f0\n"
00366 "mov f27=f0\n"
00367 "mov f28=f0\n"
00368 "mov f29=f0\n"
00369
00370 "mov f30=f0\n"
00371 "mov f31=f0\n"
00372 "mov f32=f0\n"
00373 "mov f33=f0\n"
00374 "mov f34=f0\n"
00375 "mov f35=f0\n"
00376 "mov f36=f0\n"
00377 "mov f37=f0\n"
00378 "mov f38=f0\n"
00379 "mov f39=f0\n"
00380
00381 "mov f40=f0\n"
00382 "mov f41=f0\n"
00383 "mov f42=f0\n"
00384 "mov f43=f0\n"
00385 "mov f44=f0\n"
00386 "mov f45=f0\n"
00387 "mov f46=f0\n"
00388 "mov f47=f0\n"
00389 "mov f48=f0\n"
00390 "mov f49=f0\n"
00391
00392 "mov f50=f0\n"
00393 "mov f51=f0\n"
00394 "mov f52=f0\n"
00395 "mov f53=f0\n"
00396 "mov f54=f0\n"
00397 "mov f55=f0\n"
00398 "mov f56=f0\n"
00399 "mov f57=f0\n"
00400 "mov f58=f0\n"
00401 "mov f59=f0\n"
00402
00403 "mov f60=f0\n"
00404 "mov f61=f0\n"
00405 "mov f62=f0\n"
00406 "mov f63=f0\n"
00407 "mov f64=f0\n"
00408 "mov f65=f0\n"
00409 "mov f66=f0\n"
00410 "mov f67=f0\n"
00411 "mov f68=f0\n"
00412 "mov f69=f0\n"
00413
00414 "mov f70=f0\n"
00415 "mov f71=f0\n"
00416 "mov f72=f0\n"
00417 "mov f73=f0\n"
00418 "mov f74=f0\n"
00419 "mov f75=f0\n"
00420 "mov f76=f0\n"
00421 "mov f77=f0\n"
00422 "mov f78=f0\n"
00423 "mov f79=f0\n"
00424
00425 "mov f80=f0\n"
00426 "mov f81=f0\n"
00427 "mov f82=f0\n"
00428 "mov f83=f0\n"
00429 "mov f84=f0\n"
00430 "mov f85=f0\n"
00431 "mov f86=f0\n"
00432 "mov f87=f0\n"
00433 "mov f88=f0\n"
00434 "mov f89=f0\n"
00435
00436 "mov f90=f0\n"
00437 "mov f91=f0\n"
00438 "mov f92=f0\n"
00439 "mov f93=f0\n"
00440 "mov f94=f0\n"
00441 "mov f95=f0\n"
00442 "mov f96=f0\n"
00443 "mov f97=f0\n"
00444 "mov f98=f0\n"
00445 "mov f99=f0\n"
00446
00447 "mov f100=f0\n"
00448 "mov f101=f0\n"
00449 "mov f102=f0\n"
00450 "mov f103=f0\n"
00451 "mov f104=f0\n"
00452 "mov f105=f0\n"
00453 "mov f106=f0\n"
00454 "mov f107=f0\n"
00455 "mov f108=f0\n"
00456 "mov f109=f0\n"
00457
00458 "mov f110=f0\n"
00459 "mov f111=f0\n"
00460 "mov f112=f0\n"
00461 "mov f113=f0\n"
00462 "mov f114=f0\n"
00463 "mov f115=f0\n"
00464 "mov f116=f0\n"
00465 "mov f117=f0\n"
00466 "mov f118=f0\n"
00467 "mov f119=f0\n"
00468
00469 "mov f120=f0\n"
00470 "mov f121=f0\n"
00471 "mov f122=f0\n"
00472 "mov f123=f0\n"
00473 "mov f124=f0\n"
00474 "mov f125=f0\n"
00475 "mov f126=f0\n"
00476 "mov f127=f0\n"
00477
00478 );
00479
00480 }
00481
00482