|
|
|
@ -15,60 +15,60 @@ |
|
|
|
save_tf: # write the trap frame onto the stack |
|
|
|
|
|
|
|
# save gprs |
|
|
|
STORE $x3,3*REGBYTES($x2) |
|
|
|
STORE $x4,4*REGBYTES($x2) |
|
|
|
STORE $x5,5*REGBYTES($x2) |
|
|
|
STORE $x6,6*REGBYTES($x2) |
|
|
|
STORE $x7,7*REGBYTES($x2) |
|
|
|
STORE $x8,8*REGBYTES($x2) |
|
|
|
STORE $x9,9*REGBYTES($x2) |
|
|
|
STORE $x10,10*REGBYTES($x2) |
|
|
|
STORE $x11,11*REGBYTES($x2) |
|
|
|
STORE $x12,12*REGBYTES($x2) |
|
|
|
STORE $x13,13*REGBYTES($x2) |
|
|
|
STORE $x14,14*REGBYTES($x2) |
|
|
|
STORE $x15,15*REGBYTES($x2) |
|
|
|
STORE $x16,16*REGBYTES($x2) |
|
|
|
STORE $x17,17*REGBYTES($x2) |
|
|
|
STORE $x18,18*REGBYTES($x2) |
|
|
|
STORE $x19,19*REGBYTES($x2) |
|
|
|
STORE $x20,20*REGBYTES($x2) |
|
|
|
STORE $x21,21*REGBYTES($x2) |
|
|
|
STORE $x22,22*REGBYTES($x2) |
|
|
|
STORE $x23,23*REGBYTES($x2) |
|
|
|
STORE $x24,24*REGBYTES($x2) |
|
|
|
STORE $x25,25*REGBYTES($x2) |
|
|
|
STORE $x26,26*REGBYTES($x2) |
|
|
|
STORE $x27,27*REGBYTES($x2) |
|
|
|
STORE $x28,28*REGBYTES($x2) |
|
|
|
STORE $x29,29*REGBYTES($x2) |
|
|
|
STORE $x30,30*REGBYTES($x2) |
|
|
|
STORE $x31,31*REGBYTES($x2) |
|
|
|
STORE x3,3*REGBYTES(x2) |
|
|
|
STORE x4,4*REGBYTES(x2) |
|
|
|
STORE x5,5*REGBYTES(x2) |
|
|
|
STORE x6,6*REGBYTES(x2) |
|
|
|
STORE x7,7*REGBYTES(x2) |
|
|
|
STORE x8,8*REGBYTES(x2) |
|
|
|
STORE x9,9*REGBYTES(x2) |
|
|
|
STORE x10,10*REGBYTES(x2) |
|
|
|
STORE x11,11*REGBYTES(x2) |
|
|
|
STORE x12,12*REGBYTES(x2) |
|
|
|
STORE x13,13*REGBYTES(x2) |
|
|
|
STORE x14,14*REGBYTES(x2) |
|
|
|
STORE x15,15*REGBYTES(x2) |
|
|
|
STORE x16,16*REGBYTES(x2) |
|
|
|
STORE x17,17*REGBYTES(x2) |
|
|
|
STORE x18,18*REGBYTES(x2) |
|
|
|
STORE x19,19*REGBYTES(x2) |
|
|
|
STORE x20,20*REGBYTES(x2) |
|
|
|
STORE x21,21*REGBYTES(x2) |
|
|
|
STORE x22,22*REGBYTES(x2) |
|
|
|
STORE x23,23*REGBYTES(x2) |
|
|
|
STORE x24,24*REGBYTES(x2) |
|
|
|
STORE x25,25*REGBYTES(x2) |
|
|
|
STORE x26,26*REGBYTES(x2) |
|
|
|
STORE x27,27*REGBYTES(x2) |
|
|
|
STORE x28,28*REGBYTES(x2) |
|
|
|
STORE x29,29*REGBYTES(x2) |
|
|
|
STORE x30,30*REGBYTES(x2) |
|
|
|
STORE x31,31*REGBYTES(x2) |
|
|
|
|
|
|
|
mfpcr $x3,ASM_CR(PCR_K0) |
|
|
|
STORE $x3,1*REGBYTES($x2) # $x1 is in $PCR_K0 |
|
|
|
mfpcr $x3,ASM_CR(PCR_K1) |
|
|
|
STORE $x3,2*REGBYTES($x2) # $x2 is in $PCR_K1 |
|
|
|
mfpcr x3,ASM_CR(PCR_K0) |
|
|
|
STORE x3,1*REGBYTES(x2) # x1 is in PCR_K0 |
|
|
|
mfpcr x3,ASM_CR(PCR_K1) |
|
|
|
STORE x3,2*REGBYTES(x2) # x2 is in PCR_K1 |
|
|
|
|
|
|
|
# get sr, epc, badvaddr, cause |
|
|
|
mfpcr $x3,ASM_CR(PCR_SR) # sr |
|
|
|
STORE $x3,32*REGBYTES($x2) |
|
|
|
mfpcr $x4,ASM_CR(PCR_EPC) # epc |
|
|
|
STORE $x4,33*REGBYTES($x2) |
|
|
|
mfpcr $x3,ASM_CR(PCR_BADVADDR) # badvaddr |
|
|
|
STORE $x3,34*REGBYTES($x2) |
|
|
|
mfpcr $x3,ASM_CR(PCR_CAUSE) # cause |
|
|
|
STORE $x3,35*REGBYTES($x2) |
|
|
|
mfpcr x3,ASM_CR(PCR_SR) # sr |
|
|
|
STORE x3,32*REGBYTES(x2) |
|
|
|
mfpcr x4,ASM_CR(PCR_EPC) # epc |
|
|
|
STORE x4,33*REGBYTES(x2) |
|
|
|
mfpcr x3,ASM_CR(PCR_BADVADDR) # badvaddr |
|
|
|
STORE x3,34*REGBYTES(x2) |
|
|
|
mfpcr x3,ASM_CR(PCR_CAUSE) # cause |
|
|
|
STORE x3,35*REGBYTES(x2) |
|
|
|
|
|
|
|
# get faulting insn, if it wasn't a fetch-related trap |
|
|
|
li $x5, CAUSE_MISALIGNED_FETCH |
|
|
|
li $x6, CAUSE_FAULT_FETCH |
|
|
|
beq $x3, $x5, 1f |
|
|
|
beq $x3, $x6, 1f |
|
|
|
lh $x3,0($x4) |
|
|
|
lh $x4,2($x4) |
|
|
|
sh $x3, 36*REGBYTES($x2) |
|
|
|
sh $x4,2+36*REGBYTES($x2) |
|
|
|
li x5, CAUSE_MISALIGNED_FETCH |
|
|
|
li x6, CAUSE_FAULT_FETCH |
|
|
|
beq x3, x5, 1f |
|
|
|
beq x3, x6, 1f |
|
|
|
lh x3,0(x4) |
|
|
|
lh x4,2(x4) |
|
|
|
sh x3, 36*REGBYTES(x2) |
|
|
|
sh x4,2+36*REGBYTES(x2) |
|
|
|
1: |
|
|
|
ret |
|
|
|
.end save_tf |
|
|
|
@ -77,68 +77,68 @@ save_tf: # write the trap frame onto the stack |
|
|
|
.ent pop_tf |
|
|
|
pop_tf: # write the trap frame onto the stack |
|
|
|
# restore gprs |
|
|
|
LOAD $t0,32*REGBYTES($a0) # restore sr (should disable interrupts) |
|
|
|
mtpcr $t0,ASM_CR(PCR_SR) |
|
|
|
LOAD t0,32*REGBYTES(a0) # restore sr (should disable interrupts) |
|
|
|
mtpcr t0,ASM_CR(PCR_SR) |
|
|
|
|
|
|
|
LOAD $x1,1*REGBYTES($a0) |
|
|
|
mtpcr $x1,ASM_CR(PCR_K0) |
|
|
|
LOAD $x1,2*REGBYTES($a0) |
|
|
|
mtpcr $x1,ASM_CR(PCR_K1) |
|
|
|
move $x1,$a0 |
|
|
|
LOAD $x3,3*REGBYTES($x1) |
|
|
|
LOAD $x4,4*REGBYTES($x1) |
|
|
|
LOAD $x5,5*REGBYTES($x1) |
|
|
|
LOAD $x6,6*REGBYTES($x1) |
|
|
|
LOAD $x7,7*REGBYTES($x1) |
|
|
|
LOAD $x8,8*REGBYTES($x1) |
|
|
|
LOAD $x9,9*REGBYTES($x1) |
|
|
|
LOAD $x10,10*REGBYTES($x1) |
|
|
|
LOAD $x11,11*REGBYTES($x1) |
|
|
|
LOAD $x12,12*REGBYTES($x1) |
|
|
|
LOAD $x13,13*REGBYTES($x1) |
|
|
|
LOAD $x14,14*REGBYTES($x1) |
|
|
|
LOAD $x15,15*REGBYTES($x1) |
|
|
|
LOAD $x16,16*REGBYTES($x1) |
|
|
|
LOAD $x17,17*REGBYTES($x1) |
|
|
|
LOAD $x18,18*REGBYTES($x1) |
|
|
|
LOAD $x19,19*REGBYTES($x1) |
|
|
|
LOAD $x20,20*REGBYTES($x1) |
|
|
|
LOAD $x21,21*REGBYTES($x1) |
|
|
|
LOAD $x22,22*REGBYTES($x1) |
|
|
|
LOAD $x23,23*REGBYTES($x1) |
|
|
|
LOAD $x24,24*REGBYTES($x1) |
|
|
|
LOAD $x25,25*REGBYTES($x1) |
|
|
|
LOAD $x26,26*REGBYTES($x1) |
|
|
|
LOAD $x27,27*REGBYTES($x1) |
|
|
|
LOAD $x28,28*REGBYTES($x1) |
|
|
|
LOAD $x29,29*REGBYTES($x1) |
|
|
|
LOAD $x30,30*REGBYTES($x1) |
|
|
|
LOAD $x31,31*REGBYTES($x1) |
|
|
|
LOAD x1,1*REGBYTES(a0) |
|
|
|
mtpcr x1,ASM_CR(PCR_K0) |
|
|
|
LOAD x1,2*REGBYTES(a0) |
|
|
|
mtpcr x1,ASM_CR(PCR_K1) |
|
|
|
move x1,a0 |
|
|
|
LOAD x3,3*REGBYTES(x1) |
|
|
|
LOAD x4,4*REGBYTES(x1) |
|
|
|
LOAD x5,5*REGBYTES(x1) |
|
|
|
LOAD x6,6*REGBYTES(x1) |
|
|
|
LOAD x7,7*REGBYTES(x1) |
|
|
|
LOAD x8,8*REGBYTES(x1) |
|
|
|
LOAD x9,9*REGBYTES(x1) |
|
|
|
LOAD x10,10*REGBYTES(x1) |
|
|
|
LOAD x11,11*REGBYTES(x1) |
|
|
|
LOAD x12,12*REGBYTES(x1) |
|
|
|
LOAD x13,13*REGBYTES(x1) |
|
|
|
LOAD x14,14*REGBYTES(x1) |
|
|
|
LOAD x15,15*REGBYTES(x1) |
|
|
|
LOAD x16,16*REGBYTES(x1) |
|
|
|
LOAD x17,17*REGBYTES(x1) |
|
|
|
LOAD x18,18*REGBYTES(x1) |
|
|
|
LOAD x19,19*REGBYTES(x1) |
|
|
|
LOAD x20,20*REGBYTES(x1) |
|
|
|
LOAD x21,21*REGBYTES(x1) |
|
|
|
LOAD x22,22*REGBYTES(x1) |
|
|
|
LOAD x23,23*REGBYTES(x1) |
|
|
|
LOAD x24,24*REGBYTES(x1) |
|
|
|
LOAD x25,25*REGBYTES(x1) |
|
|
|
LOAD x26,26*REGBYTES(x1) |
|
|
|
LOAD x27,27*REGBYTES(x1) |
|
|
|
LOAD x28,28*REGBYTES(x1) |
|
|
|
LOAD x29,29*REGBYTES(x1) |
|
|
|
LOAD x30,30*REGBYTES(x1) |
|
|
|
LOAD x31,31*REGBYTES(x1) |
|
|
|
|
|
|
|
# gtfo! |
|
|
|
LOAD $x2,33*REGBYTES($x1) |
|
|
|
mtpcr $x2,ASM_CR(PCR_EPC) |
|
|
|
mfpcr $x1,ASM_CR(PCR_K0) |
|
|
|
mfpcr $x2,ASM_CR(PCR_K1) |
|
|
|
LOAD x2,33*REGBYTES(x1) |
|
|
|
mtpcr x2,ASM_CR(PCR_EPC) |
|
|
|
mfpcr x1,ASM_CR(PCR_K0) |
|
|
|
mfpcr x2,ASM_CR(PCR_K1) |
|
|
|
eret |
|
|
|
.end pop_tf |
|
|
|
|
|
|
|
.global trap_entry |
|
|
|
.ent trap_entry |
|
|
|
trap_entry: |
|
|
|
mtpcr $ra,ASM_CR(PCR_K0) |
|
|
|
mtpcr $x2,ASM_CR(PCR_K1) |
|
|
|
mtpcr ra,ASM_CR(PCR_K0) |
|
|
|
mtpcr x2,ASM_CR(PCR_K1) |
|
|
|
|
|
|
|
# when coming from kernel, continue below its stack |
|
|
|
mfpcr $ra,ASM_CR(PCR_SR) |
|
|
|
and $ra,$ra,SR_PS |
|
|
|
add $x2, $sp, -320 |
|
|
|
bnez $ra, 1f |
|
|
|
la $x2,stack_top-320 |
|
|
|
mfpcr ra,ASM_CR(PCR_SR) |
|
|
|
and ra,ra,SR_PS |
|
|
|
add x2, sp, -320 |
|
|
|
bnez ra, 1f |
|
|
|
la x2,stack_top-320 |
|
|
|
|
|
|
|
1:jal save_tf |
|
|
|
move $sp,$x2 |
|
|
|
move $a0,$x2 |
|
|
|
move sp,x2 |
|
|
|
move a0,x2 |
|
|
|
jal handle_trap |
|
|
|
.end trap_entry |
|
|
|
|
|
|
|
|