| #include "riscv_test.h" |
| |
| #if __riscv_xlen == 64 |
| # define STORE sd |
| # define LOAD ld |
| # define REGBYTES 8 |
| #else |
| # define STORE sw |
| # define LOAD lw |
| # define REGBYTES 4 |
| #endif |
| |
| #define STACK_TOP (_end + 4096) |
| |
| .section ".text.init","ax",@progbits |
| .globl _start |
| _start: |
| j handle_reset |
| |
| /* NMI vector */ |
| nmi_vector: |
| j wtf |
| |
| trap_vector: |
| j wtf |
| |
| handle_reset: |
| la t0, trap_vector |
| csrw mtvec, t0 |
| la sp, STACK_TOP - SIZEOF_TRAPFRAME_T |
| csrr t0, mhartid |
| slli t0, t0, 12 |
| add sp, sp, t0 |
| csrw mscratch, sp |
| la a0, userstart |
| j vm_boot |
| |
| .globl pop_tf |
| pop_tf: |
| LOAD t0,33*REGBYTES(a0) |
| csrw sepc,t0 |
| LOAD x1,1*REGBYTES(a0) |
| LOAD x2,2*REGBYTES(a0) |
| LOAD x3,3*REGBYTES(a0) |
| LOAD x4,4*REGBYTES(a0) |
| LOAD x5,5*REGBYTES(a0) |
| LOAD x6,6*REGBYTES(a0) |
| LOAD x7,7*REGBYTES(a0) |
| LOAD x8,8*REGBYTES(a0) |
| LOAD x9,9*REGBYTES(a0) |
| LOAD x11,11*REGBYTES(a0) |
| LOAD x12,12*REGBYTES(a0) |
| LOAD x13,13*REGBYTES(a0) |
| LOAD x14,14*REGBYTES(a0) |
| LOAD x15,15*REGBYTES(a0) |
| LOAD x16,16*REGBYTES(a0) |
| LOAD x17,17*REGBYTES(a0) |
| LOAD x18,18*REGBYTES(a0) |
| LOAD x19,19*REGBYTES(a0) |
| LOAD x20,20*REGBYTES(a0) |
| LOAD x21,21*REGBYTES(a0) |
| LOAD x22,22*REGBYTES(a0) |
| LOAD x23,23*REGBYTES(a0) |
| LOAD x24,24*REGBYTES(a0) |
| LOAD x25,25*REGBYTES(a0) |
| LOAD x26,26*REGBYTES(a0) |
| LOAD x27,27*REGBYTES(a0) |
| LOAD x28,28*REGBYTES(a0) |
| LOAD x29,29*REGBYTES(a0) |
| LOAD x30,30*REGBYTES(a0) |
| LOAD x31,31*REGBYTES(a0) |
| LOAD a0,10*REGBYTES(a0) |
| sret |
| |
| .global trap_entry |
| trap_entry: |
| csrrw sp, sscratch, sp |
| |
| # save gprs |
| STORE x1,1*REGBYTES(sp) |
| STORE x3,3*REGBYTES(sp) |
| STORE x4,4*REGBYTES(sp) |
| STORE x5,5*REGBYTES(sp) |
| STORE x6,6*REGBYTES(sp) |
| STORE x7,7*REGBYTES(sp) |
| STORE x8,8*REGBYTES(sp) |
| STORE x9,9*REGBYTES(sp) |
| STORE x10,10*REGBYTES(sp) |
| STORE x11,11*REGBYTES(sp) |
| STORE x12,12*REGBYTES(sp) |
| STORE x13,13*REGBYTES(sp) |
| STORE x14,14*REGBYTES(sp) |
| STORE x15,15*REGBYTES(sp) |
| STORE x16,16*REGBYTES(sp) |
| STORE x17,17*REGBYTES(sp) |
| STORE x18,18*REGBYTES(sp) |
| STORE x19,19*REGBYTES(sp) |
| STORE x20,20*REGBYTES(sp) |
| STORE x21,21*REGBYTES(sp) |
| STORE x22,22*REGBYTES(sp) |
| STORE x23,23*REGBYTES(sp) |
| STORE x24,24*REGBYTES(sp) |
| STORE x25,25*REGBYTES(sp) |
| STORE x26,26*REGBYTES(sp) |
| STORE x27,27*REGBYTES(sp) |
| STORE x28,28*REGBYTES(sp) |
| STORE x29,29*REGBYTES(sp) |
| STORE x30,30*REGBYTES(sp) |
| STORE x31,31*REGBYTES(sp) |
| |
| csrrw t0,sscratch,sp |
| STORE t0,2*REGBYTES(sp) |
| |
| # get sr, epc, badvaddr, cause |
| csrr t0,sstatus |
| STORE t0,32*REGBYTES(sp) |
| csrr t0,sepc |
| STORE t0,33*REGBYTES(sp) |
| csrr t0,sbadaddr |
| STORE t0,34*REGBYTES(sp) |
| csrr t0,scause |
| STORE t0,35*REGBYTES(sp) |
| |
| move a0, sp |
| j handle_trap |