diff options
author | Andrew Waterman <waterman@s144.Millennium.Berkeley.EDU> | 2011-04-12 01:42:20 -0700 |
---|---|---|
committer | Andrew Waterman <waterman@s144.Millennium.Berkeley.EDU> | 2011-04-12 01:42:20 -0700 |
commit | 27afdf1a005c2e24af79107095aae3155e68b254 (patch) | |
tree | a5140912c1a50b8b9d4f6528244db3699c114446 /pk/entry.S | |
parent | 7e6145731f4d52e9b6a6383c650c8de68da7aa34 (diff) | |
download | pk-27afdf1a005c2e24af79107095aae3155e68b254.zip pk-27afdf1a005c2e24af79107095aae3155e68b254.tar.gz pk-27afdf1a005c2e24af79107095aae3155e68b254.tar.bz2 |
[sim,pk] fixed minor pk bugs and trap codes
Diffstat (limited to 'pk/entry.S')
-rw-r--r-- | pk/entry.S | 237 |
1 files changed, 120 insertions, 117 deletions
@@ -10,132 +10,135 @@ # define REGBYTES 4 #endif - .text - .ent save_tf -save_tf: # write the trap frame onto the stack + .text + .ent save_tf +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) + # 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) - 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) + # 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) - # get insn - and $x4,$x4,~1 - lh $x3,0($x4) - lh $x4,2($x4) - sh $x3, 36*REGBYTES($x2) - sh $x4,2+36*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) +1: + ret + .end save_tf - ret - .end save_tf + .globl pop_tf + .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) - .globl pop_tf - .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 $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) + eret + .end pop_tf - # gtfo! - 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 + .global trap_entry + .ent trap_entry trap_entry: - mtpcr $ra,ASM_CR(PCR_K0) - mtpcr $x2,ASM_CR(PCR_K1) - la $x2,stack_top-320 - jal save_tf - move $sp,$x2 - move $a0,$x2 - ei - jal handle_trap - .end trap_entry + mtpcr $ra,ASM_CR(PCR_K0) + mtpcr $x2,ASM_CR(PCR_K1) + la $x2,stack_top-320 + jal save_tf + move $sp,$x2 + move $a0,$x2 + ei + jal handle_trap + .end trap_entry - .bss - .global stack_bot - .global stack_top + .bss + .global stack_bot + .global stack_top stack_bot: - .skip 4096 + .skip 4096 stack_top: |