RISC-V Proxy Kernel
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

147 lines
3.4 KiB

// See LICENSE for license details.
#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
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
.globl pop_tf
pop_tf: # write the trap frame onto the stack
# restore gprs
LOAD a1,32*REGBYTES(a0)
LOAD a2,1*REGBYTES(a0)
LOAD a3,2*REGBYTES(a0)
mtpcr a1,ASM_CR(PCR_SR) # restore sr (disable interrupts)
mtpcr a2,ASM_CR(PCR_K0)
mtpcr a3,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
.global 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
.bss
.global stack_bot
.global stack_top
stack_bot:
.skip 4096
stack_top: