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.
142 lines
3.0 KiB
142 lines
3.0 KiB
// See LICENSE for license details.
|
|
|
|
#include "encoding.h"
|
|
|
|
#ifdef __riscv64
|
|
# define STORE sd
|
|
# define LOAD ld
|
|
# define REGBYTES 8
|
|
#else
|
|
# define STORE sw
|
|
# define LOAD lw
|
|
# define REGBYTES 4
|
|
#endif
|
|
|
|
.macro save_tf
|
|
# 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)
|
|
|
|
# get sr, epc, badvaddr, cause
|
|
csrr x3,sup0 # x1
|
|
csrr x4,sup1 # x2
|
|
csrr x5,status
|
|
csrr x6,epc
|
|
csrr x7,badvaddr
|
|
csrr x8,cause
|
|
STORE x3,1*REGBYTES(x2)
|
|
STORE x4,2*REGBYTES(x2)
|
|
STORE x5,32*REGBYTES(x2)
|
|
STORE x6,33*REGBYTES(x2)
|
|
STORE x7,34*REGBYTES(x2)
|
|
STORE x8,35*REGBYTES(x2)
|
|
|
|
la gp, _gp
|
|
|
|
# get faulting insn, if it wasn't a fetch-related trap
|
|
li x5,-1
|
|
STORE x5,36*REGBYTES(x2)
|
|
1:
|
|
.endm
|
|
|
|
.text
|
|
.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)
|
|
|
|
csrw status, a1 # restore sr (disable interrupts)
|
|
csrw sup0, a2
|
|
csrw sup1, a3
|
|
|
|
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)
|
|
csrr x1, sup0
|
|
csrw epc, x2
|
|
csrr x2, sup1
|
|
sret
|
|
|
|
.global trap_entry
|
|
trap_entry:
|
|
csrw sup0, x1
|
|
csrw sup1, x2
|
|
|
|
# when coming from kernel, continue below its stack
|
|
csrr x1, status
|
|
and x1, x1, SR_PS
|
|
add x2, sp, -320
|
|
bnez x1, 1f
|
|
la x2, stack_top-320
|
|
|
|
1:save_tf
|
|
move sp,x2
|
|
move a0,x2
|
|
j handle_trap
|
|
|
|
.bss
|
|
.align 4
|
|
.global stack_bot
|
|
.global stack_top
|
|
stack_bot:
|
|
.skip 4096
|
|
stack_top:
|
|
|