diff options
Diffstat (limited to 'pk/entry.S')
-rw-r--r-- | pk/entry.S | 150 |
1 files changed, 0 insertions, 150 deletions
diff --git a/pk/entry.S b/pk/entry.S deleted file mode 100644 index 6f0d1a0..0000000 --- a/pk/entry.S +++ /dev/null @@ -1,150 +0,0 @@ -#include "pcr.h" - -#ifdef __riscv64 -# define STORE sd -# define LOAD ld -# define REGBYTES 8 -#else -# define STORE sw -# define LOAD lw -# define REGBYTES 4 -#endif - - .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) - - 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 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 - - .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) - - # 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 -trap_entry: - 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 - -1:jal save_tf - move $sp,$x2 - move $a0,$x2 - jal handle_trap - .end trap_entry - - .bss - .global stack_bot - .global stack_top -stack_bot: - .skip 4096 -stack_top: |