summaryrefslogtreecommitdiff
path: root/tests/test-progs/asmtest/src/riscv/env/v/entry.S
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test-progs/asmtest/src/riscv/env/v/entry.S')
-rw-r--r--tests/test-progs/asmtest/src/riscv/env/v/entry.S125
1 files changed, 125 insertions, 0 deletions
diff --git a/tests/test-progs/asmtest/src/riscv/env/v/entry.S b/tests/test-progs/asmtest/src/riscv/env/v/entry.S
new file mode 100644
index 000000000..97196620f
--- /dev/null
+++ b/tests/test-progs/asmtest/src/riscv/env/v/entry.S
@@ -0,0 +1,125 @@
+#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