62,8 → 62,6 |
* This goal is achieved by using procedure calls after RSE becomes operational. |
* |
* Some steps are skipped (enabling and disabling interrupts). |
* Some steps are not fully supported yet (e.g. dealing with floating-point |
* context). |
* |
* @param offs Offset from the beginning of IVT. |
* @param handler Interrupt handler address. |
83,11 → 81,11 |
* Note that r24-r31 from bank 0 can be used only as long as PSR.ic = 0. |
*/ |
|
/*Set up FPU as in interrupred*/ |
/* Set up FPU as in interrupted context. */ |
mov r24=psr |
mov r25=cr.ipsr |
mov r26=(PSR_DFH_MASK) |
mov r27=(~(PSR_DFH_MASK));; |
mov r26 = PSR_DFH_MASK |
mov r27 = ~PSR_DFH_MASK ;; |
and r26=r25,r26 |
and r24=r24,r27;; |
or r24=r24,r26;; |
251,16 → 249,16 |
mov cr.iipa = r26 |
mov cr.isr = r27 |
mov cr.ifa = r28 |
/*Set up FPU as in exception*/ |
|
/* Set up FPU as in exception. */ |
mov r24=psr |
mov r26=(PSR_DFH_MASK) |
mov r27=(~(PSR_DFH_MASK));; |
mov r26 = PSR_DFH_MASK |
mov r27 = ~PSR_DFH_MASK ;; |
and r25=r25,r27 |
and r24=r24,r26;; |
or r25=r25,r24;; |
mov cr.ipsr = r25 |
|
|
/* 18. restore predicate registers from memory stack */ |
ld8 r29 = [r31], +8 ;; /* load predicate registers */ |
mov pr = r29 |
307,7 → 305,6 |
mov loc16 = b7 |
|
/* 8. preserve general and floating-point registers */ |
/* TODO: save floating-point context */ |
mov loc17 = r1 |
mov loc18 = r2 |
mov loc19 = r3 |
340,22 → 337,14 |
mov loc45 = r30 |
mov loc46 = r31 |
|
mov r24=96 + STACK_SCRATCH_AREA_SIZE |
mov r25=112 + STACK_SCRATCH_AREA_SIZE |
mov r26=0 + STACK_SCRATCH_AREA_SIZE |
mov r27=16 + STACK_SCRATCH_AREA_SIZE |
mov r28=32 + STACK_SCRATCH_AREA_SIZE |
mov r29=48 + STACK_SCRATCH_AREA_SIZE |
mov r30=64 + STACK_SCRATCH_AREA_SIZE |
mov r31=80 + STACK_SCRATCH_AREA_SIZE;; |
add r24=r12,r24 |
add r25=r12,r25 |
add r26=r12,r26 |
add r27=r12,r27 |
add r28=r12,r28 |
add r29=r12,r29 |
add r30=r12,r30 |
add r31=r12,r31;; |
add r24 = 96 + STACK_SCRATCH_AREA_SIZE, r12 |
add r25 = 112 + STACK_SCRATCH_AREA_SIZE, r12 |
add r26 = 0 + STACK_SCRATCH_AREA_SIZE, r12 |
add r27 = 16 + STACK_SCRATCH_AREA_SIZE, r12 |
add r28 = 32 + STACK_SCRATCH_AREA_SIZE, r12 |
add r29 = 48 + STACK_SCRATCH_AREA_SIZE, r12 |
add r30 = 64 + STACK_SCRATCH_AREA_SIZE, r12 |
add r31 = 80 + STACK_SCRATCH_AREA_SIZE, r12 ;; |
|
stf.spill [r26]=f2,0x80 |
stf.spill [r27]=f3,0x80 |
391,8 → 380,7 |
stf.spill [r30]=f30,0x80 |
stf.spill [r31]=f31,0x80;; |
|
/* preserve Floating point status register */ |
mov loc47 = ar.fpsr |
mov loc47 = ar.fpsr /* preserve floating point status register */ |
|
/* 9. skipped (will not enable interrupts) */ |
/* |
418,25 → 406,15 |
*/ |
|
/* 13. restore general and floating-point registers */ |
/* TODO: restore floating-point context */ |
mov r24=96 + STACK_SCRATCH_AREA_SIZE |
mov r25=112 + STACK_SCRATCH_AREA_SIZE |
mov r26=0 + STACK_SCRATCH_AREA_SIZE |
mov r27=16 + STACK_SCRATCH_AREA_SIZE |
mov r28=32 + STACK_SCRATCH_AREA_SIZE |
mov r29=48 + STACK_SCRATCH_AREA_SIZE |
mov r30=64 + STACK_SCRATCH_AREA_SIZE |
mov r31=80 + STACK_SCRATCH_AREA_SIZE;; |
add r24=r12,r24 |
add r25=r12,r25 |
add r26=r12,r26 |
add r27=r12,r27 |
add r28=r12,r28 |
add r29=r12,r29 |
add r30=r12,r30 |
add r31=r12,r31;; |
add r24 = 96 + STACK_SCRATCH_AREA_SIZE, r12 |
add r25 = 112 + STACK_SCRATCH_AREA_SIZE, r12 |
add r26 = 0 + STACK_SCRATCH_AREA_SIZE, r12 |
add r27 = 16 + STACK_SCRATCH_AREA_SIZE, r12 |
add r28 = 32 + STACK_SCRATCH_AREA_SIZE, r12 |
add r29 = 48 + STACK_SCRATCH_AREA_SIZE, r12 |
add r30 = 64 + STACK_SCRATCH_AREA_SIZE, r12 |
add r31 = 80 + STACK_SCRATCH_AREA_SIZE, r12 ;; |
|
|
ldf.fill f2=[r26],0x80 |
ldf.fill f3=[r27],0x80 |
ldf.fill f4=[r28],0x80 |
471,7 → 449,6 |
ldf.fill f30=[r30],0x80 |
ldf.fill f31=[r31],0x80;; |
|
|
mov r1 = loc17 |
mov r2 = loc18 |
mov r3 = loc19 |
504,8 → 481,7 |
mov r30 = loc45 |
mov r31 = loc46 |
|
/* restore Floating point status register */ |
mov ar.fpsr = loc47 |
mov ar.fpsr = loc47 /* restore floating point status register */ |
|
/* 14. restore branch and application registers */ |
mov ar.unat = loc3 |
607,7 → 583,3 |
HEAVYWEIGHT_HANDLER 0x7d00 |
HEAVYWEIGHT_HANDLER 0x7e00 |
HEAVYWEIGHT_HANDLER 0x7f00 |
|
|
|
|