|
|
|
@ -16,43 +16,49 @@ |
|
|
|
save_tf: # write the trap frame onto the stack |
|
|
|
|
|
|
|
# save gprs |
|
|
|
STORE $1,1*REGBYTES($k1) |
|
|
|
STORE $2,2*REGBYTES($k1) |
|
|
|
STORE $3,3*REGBYTES($k1) |
|
|
|
STORE $4,4*REGBYTES($k1) |
|
|
|
STORE $5,5*REGBYTES($k1) |
|
|
|
STORE $6,6*REGBYTES($k1) |
|
|
|
STORE $7,7*REGBYTES($k1) |
|
|
|
STORE $8,8*REGBYTES($k1) |
|
|
|
STORE $9,9*REGBYTES($k1) |
|
|
|
STORE $10,10*REGBYTES($k1) |
|
|
|
STORE $11,11*REGBYTES($k1) |
|
|
|
STORE $12,12*REGBYTES($k1) |
|
|
|
STORE $13,13*REGBYTES($k1) |
|
|
|
STORE $14,14*REGBYTES($k1) |
|
|
|
STORE $15,15*REGBYTES($k1) |
|
|
|
STORE $16,16*REGBYTES($k1) |
|
|
|
STORE $17,17*REGBYTES($k1) |
|
|
|
STORE $18,18*REGBYTES($k1) |
|
|
|
STORE $19,19*REGBYTES($k1) |
|
|
|
STORE $20,20*REGBYTES($k1) |
|
|
|
STORE $21,21*REGBYTES($k1) |
|
|
|
STORE $22,22*REGBYTES($k1) |
|
|
|
STORE $23,23*REGBYTES($k1) |
|
|
|
STORE $24,24*REGBYTES($k1) |
|
|
|
STORE $25,25*REGBYTES($k1) |
|
|
|
STORE $28,28*REGBYTES($k1) |
|
|
|
STORE $29,29*REGBYTES($k1) |
|
|
|
STORE $30,30*REGBYTES($k1) |
|
|
|
STORE $k0,31*REGBYTES($k1) # $ra is actually in $k0 |
|
|
|
STORE $2,2*REGBYTES($1) |
|
|
|
mfpcr $2,$PCR_K1 |
|
|
|
STORE $2,1*REGBYTES($1) # $x1 is actually in $PCR_K1 |
|
|
|
STORE $3,3*REGBYTES($1) |
|
|
|
STORE $4,4*REGBYTES($1) |
|
|
|
STORE $5,5*REGBYTES($1) |
|
|
|
STORE $6,6*REGBYTES($1) |
|
|
|
STORE $7,7*REGBYTES($1) |
|
|
|
STORE $8,8*REGBYTES($1) |
|
|
|
STORE $9,9*REGBYTES($1) |
|
|
|
STORE $10,10*REGBYTES($1) |
|
|
|
STORE $11,11*REGBYTES($1) |
|
|
|
STORE $12,12*REGBYTES($1) |
|
|
|
STORE $13,13*REGBYTES($1) |
|
|
|
STORE $14,14*REGBYTES($1) |
|
|
|
STORE $15,15*REGBYTES($1) |
|
|
|
STORE $16,16*REGBYTES($1) |
|
|
|
STORE $17,17*REGBYTES($1) |
|
|
|
STORE $18,18*REGBYTES($1) |
|
|
|
STORE $19,19*REGBYTES($1) |
|
|
|
STORE $20,20*REGBYTES($1) |
|
|
|
STORE $21,21*REGBYTES($1) |
|
|
|
STORE $22,22*REGBYTES($1) |
|
|
|
STORE $23,23*REGBYTES($1) |
|
|
|
STORE $24,24*REGBYTES($1) |
|
|
|
STORE $25,25*REGBYTES($1) |
|
|
|
STORE $26,26*REGBYTES($1) |
|
|
|
STORE $27,27*REGBYTES($1) |
|
|
|
STORE $28,28*REGBYTES($1) |
|
|
|
STORE $29,29*REGBYTES($1) |
|
|
|
STORE $30,30*REGBYTES($1) |
|
|
|
mfpcr $2,$PCR_K0 |
|
|
|
STORE $2,31*REGBYTES($1) # $ra is actually in $PCR_K0 |
|
|
|
|
|
|
|
# get sr, epc, badvaddr |
|
|
|
mfpcr $t0,$PCR_SR # sr |
|
|
|
STORE $t0,32*REGBYTES($k1) |
|
|
|
mfpcr $t0,$PCR_EPC # epc |
|
|
|
STORE $t0,33*REGBYTES($k1) |
|
|
|
mfpcr $t0,$PCR_BADVADDR # badvaddr |
|
|
|
STORE $t0,34*REGBYTES($k1) |
|
|
|
# get sr, epc, badvaddr, cr29 (tid) |
|
|
|
mfpcr $2,$PCR_SR # sr |
|
|
|
STORE $2,32*REGBYTES($1) |
|
|
|
mfpcr $2,$PCR_EPC # epc |
|
|
|
STORE $2,33*REGBYTES($1) |
|
|
|
mfpcr $2,$PCR_BADVADDR # badvaddr |
|
|
|
STORE $2,34*REGBYTES($1) |
|
|
|
mfcr $2,$29 # cr29 (tid) |
|
|
|
STORE $2,35*REGBYTES($1) |
|
|
|
jr $ra |
|
|
|
.end save_tf |
|
|
|
|
|
|
|
@ -63,40 +69,50 @@ pop_tf: # write the trap frame onto the stack |
|
|
|
LOAD $t0,32*REGBYTES($a0) # restore sr (should disable interrupts) |
|
|
|
mtpcr $t0,$PCR_SR |
|
|
|
|
|
|
|
move $k0,$a0 |
|
|
|
LOAD $1,1*REGBYTES($k0) |
|
|
|
LOAD $2,2*REGBYTES($k0) |
|
|
|
LOAD $3,3*REGBYTES($k0) |
|
|
|
LOAD $4,4*REGBYTES($k0) |
|
|
|
LOAD $5,5*REGBYTES($k0) |
|
|
|
LOAD $6,6*REGBYTES($k0) |
|
|
|
LOAD $7,7*REGBYTES($k0) |
|
|
|
LOAD $8,8*REGBYTES($k0) |
|
|
|
LOAD $9,9*REGBYTES($k0) |
|
|
|
LOAD $10,10*REGBYTES($k0) |
|
|
|
LOAD $11,11*REGBYTES($k0) |
|
|
|
LOAD $12,12*REGBYTES($k0) |
|
|
|
LOAD $13,13*REGBYTES($k0) |
|
|
|
LOAD $14,14*REGBYTES($k0) |
|
|
|
LOAD $15,15*REGBYTES($k0) |
|
|
|
LOAD $16,16*REGBYTES($k0) |
|
|
|
LOAD $17,17*REGBYTES($k0) |
|
|
|
LOAD $18,18*REGBYTES($k0) |
|
|
|
LOAD $19,19*REGBYTES($k0) |
|
|
|
LOAD $20,20*REGBYTES($k0) |
|
|
|
LOAD $21,21*REGBYTES($k0) |
|
|
|
LOAD $22,22*REGBYTES($k0) |
|
|
|
LOAD $23,23*REGBYTES($k0) |
|
|
|
LOAD $24,24*REGBYTES($k0) |
|
|
|
LOAD $25,25*REGBYTES($k0) |
|
|
|
LOAD $28,28*REGBYTES($k0) |
|
|
|
LOAD $29,29*REGBYTES($k0) |
|
|
|
LOAD $30,30*REGBYTES($k0) |
|
|
|
LOAD $31,31*REGBYTES($k0) |
|
|
|
LOAD $1,1*REGBYTES($a0) |
|
|
|
mtpcr $1,$PCR_K0 |
|
|
|
LOAD $1,2*REGBYTES($a0) |
|
|
|
mtpcr $1,$PCR_K1 |
|
|
|
move $1,$a0 |
|
|
|
LOAD $3,3*REGBYTES($1) |
|
|
|
LOAD $4,4*REGBYTES($1) |
|
|
|
LOAD $5,5*REGBYTES($1) |
|
|
|
LOAD $6,6*REGBYTES($1) |
|
|
|
LOAD $7,7*REGBYTES($1) |
|
|
|
LOAD $8,8*REGBYTES($1) |
|
|
|
LOAD $9,9*REGBYTES($1) |
|
|
|
LOAD $10,10*REGBYTES($1) |
|
|
|
LOAD $11,11*REGBYTES($1) |
|
|
|
LOAD $12,12*REGBYTES($1) |
|
|
|
LOAD $13,13*REGBYTES($1) |
|
|
|
LOAD $14,14*REGBYTES($1) |
|
|
|
LOAD $15,15*REGBYTES($1) |
|
|
|
LOAD $16,16*REGBYTES($1) |
|
|
|
LOAD $17,17*REGBYTES($1) |
|
|
|
LOAD $18,18*REGBYTES($1) |
|
|
|
LOAD $19,19*REGBYTES($1) |
|
|
|
LOAD $20,20*REGBYTES($1) |
|
|
|
LOAD $21,21*REGBYTES($1) |
|
|
|
LOAD $22,22*REGBYTES($1) |
|
|
|
LOAD $23,23*REGBYTES($1) |
|
|
|
LOAD $24,24*REGBYTES($1) |
|
|
|
LOAD $25,25*REGBYTES($1) |
|
|
|
LOAD $26,26*REGBYTES($1) |
|
|
|
LOAD $27,27*REGBYTES($1) |
|
|
|
LOAD $28,28*REGBYTES($1) |
|
|
|
LOAD $29,29*REGBYTES($1) |
|
|
|
LOAD $30,30*REGBYTES($1) |
|
|
|
LOAD $31,31*REGBYTES($1) |
|
|
|
|
|
|
|
# restore cr29 (tid) |
|
|
|
LOAD $2,35*REGBYTES($1) |
|
|
|
mtcr $2,$29 |
|
|
|
|
|
|
|
# gtfo! |
|
|
|
LOAD $k0,33*REGBYTES($k0) |
|
|
|
mtpcr $k0,$PCR_EPC |
|
|
|
LOAD $2,33*REGBYTES($1) |
|
|
|
mtpcr $2,$PCR_EPC |
|
|
|
mfpcr $1,$PCR_K0 |
|
|
|
mfpcr $2,$PCR_K1 |
|
|
|
eret |
|
|
|
.end pop_tf |
|
|
|
|
|
|
|
@ -104,11 +120,12 @@ pop_tf: # write the trap frame onto the stack |
|
|
|
|
|
|
|
#define TRAP_TABLE_ENTRY(x) \ |
|
|
|
.align 7; \ |
|
|
|
law $k1,stack_top-320; \ |
|
|
|
move $k0,$ra; \ |
|
|
|
mtpcr $ra,$PCR_K0; \ |
|
|
|
mtpcr $1,$PCR_K1; \ |
|
|
|
law $1,stack_top-320; \ |
|
|
|
jal save_tf; \ |
|
|
|
move $sp,$k1; \ |
|
|
|
move $a0,$k1; \ |
|
|
|
move $sp,$1; \ |
|
|
|
move $a0,$1; \ |
|
|
|
ei; \ |
|
|
|
jal x; \ |
|
|
|
unimp |
|
|
|
|