Rev 443 | Rev 445 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 443 | Rev 444 | ||
---|---|---|---|
Line 253... | Line 253... | ||
253 | br.ret.sptk.many rp |
253 | br.ret.sptk.many rp |
254 | 254 | ||
255 | .global heavyweight_handler_finalize |
255 | .global heavyweight_handler_finalize |
256 | heavyweight_handler_finalize: |
256 | heavyweight_handler_finalize: |
257 | /* 16. RSE switch to interrupted context */ |
257 | /* 16. RSE switch to interrupted context */ |
- | 258 | ||
- | 259 | /********************************************************************************************/ |
|
- | 260 | ||
- | 261 | ||
- | 262 | ||
- | 263 | .auto |
|
- | 264 | cover /*Allocate zerro size frame (Step 1(from Intel Docs))*/ |
|
- | 265 | ||
- | 266 | add r31 = STACK_SCRATCH_AREA_SIZE, r12;; |
|
- | 267 | ||
- | 268 | mov r28 = ar.bspstore /*Calculate loadrs (step 2)*/ |
|
- | 269 | ld8 r29 = [r31], +8 |
|
- | 270 | sub r27 = r29 , r28 |
|
- | 271 | shl r27 = r27, 16 |
|
- | 272 | ||
- | 273 | mov r24 = ar.rsc |
|
- | 274 | and r30 = ~3, r24 |
|
- | 275 | or r24 = r30 , r27 |
|
- | 276 | mov ar.rsc = r24 /* place RSE in enforced lazy mode */ |
|
- | 277 | ||
- | 278 | ||
- | 279 | ||
- | 280 | loadrs /*(Step 3)*/ |
|
- | 281 | ||
- | 282 | ||
- | 283 | /*Read saved registers*/ |
|
- | 284 | ld8 r28 = [r31], +8 /*ar.bspstore*/ |
|
- | 285 | ld8 r27 = [r31], +8 /*ar.rnat*/ |
|
- | 286 | ld8 r26 = [r31], +8 /*cr.ifs*/ |
|
- | 287 | ld8 r25 = [r31], +8 /*ar.pfs*/ |
|
- | 288 | ld8 r24 = [r31], +8 /*ar.rsc*/ |
|
- | 289 | ||
- | 290 | ||
- | 291 | mov ar.bspstore = r28 /*(Step 4)*/ |
|
- | 292 | mov ar.rnat = r27 /*(Step 5)*/ |
|
- | 293 | ||
- | 294 | mov ar.pfs = r25 /*(Step 6)*/ |
|
- | 295 | mov cr.ifs = r26 |
|
- | 296 | ||
- | 297 | mov ar.rsc = r24 /*(Step 7)*/ |
|
- | 298 | ||
- | 299 | ||
- | 300 | .explicit |
|
- | 301 | ||
- | 302 | ||
- | 303 | /********************************************************************************************/ |
|
- | 304 | ||
- | 305 | ||
258 | 306 | ||
259 | /* 17. restore interruption state from memory stack */ |
307 | /* 17. restore interruption state from memory stack */ |
- | 308 | ||
- | 309 | ld8 r28 = [r31] , +8 ;; /* load cr.ifa */ |
|
- | 310 | ld8 r27 = [r31] , +8 ;; /* load cr.isr */ |
|
- | 311 | ld8 r26 = [r31] , +8 ;; /* load cr.iipa */ |
|
- | 312 | ld8 r25 = [r31] , +8 ;; /* load cr.ipsr */ |
|
- | 313 | ld8 r24 = [r31] , +8 ;; /* load cr.iip */ |
|
- | 314 | ||
- | 315 | ||
- | 316 | mov cr.iip = r24 |
|
- | 317 | mov cr.ipsr = r25 |
|
- | 318 | mov cr.iipa = r26 |
|
- | 319 | mov cr.isr = r27 |
|
- | 320 | mov cr.ifa = r28 |
|
- | 321 | ||
- | 322 | ||
260 | 323 | ||
261 | /* 18. restore predicate registers from memory stack */ |
324 | /* 18. restore predicate registers from memory stack */ |
262 | - | ||
263 | /* 19. return from interruption */ |
- | |
264 | rfi |
- | |
265 | 325 | ||
266 | 326 | ||
- | 327 | ld8 r29 = [r31] , -8 ;; /* load predicate registers */ |
|
- | 328 | mov pr =r29 ;; |
|
- | 329 | ||
- | 330 | add r12 = STACK_FRAME_SIZE,r12;; |
|
- | 331 | ||
- | 332 | /* 19. return from interruption */ |
|
- | 333 | rfi;; |
|
267 | 334 | ||
268 | 335 | ||
269 | dump_gregs: |
336 | dump_gregs: |
270 | mov r16 = REG_DUMP;; |
337 | mov r16 = REG_DUMP;; |
271 | st8 [r16] = r0;; |
338 | st8 [r16] = r0;; |