112771Sqtt2@cornell.edu#include "riscv_test.h"
212771Sqtt2@cornell.edu
312771Sqtt2@cornell.edu#if __riscv_xlen == 64
412771Sqtt2@cornell.edu# define STORE    sd
512771Sqtt2@cornell.edu# define LOAD     ld
612771Sqtt2@cornell.edu# define REGBYTES 8
712771Sqtt2@cornell.edu#else
812771Sqtt2@cornell.edu# define STORE    sw
912771Sqtt2@cornell.edu# define LOAD     lw
1012771Sqtt2@cornell.edu# define REGBYTES 4
1112771Sqtt2@cornell.edu#endif
1212771Sqtt2@cornell.edu
1312771Sqtt2@cornell.edu#define STACK_TOP (_end + 4096)
1412771Sqtt2@cornell.edu
1512771Sqtt2@cornell.edu  .section ".text.init","ax",@progbits
1612771Sqtt2@cornell.edu  .globl _start
1712771Sqtt2@cornell.edu_start:
1812771Sqtt2@cornell.edu  j handle_reset
1912771Sqtt2@cornell.edu
2012771Sqtt2@cornell.edu  /* NMI vector */
2112771Sqtt2@cornell.edunmi_vector:
2212771Sqtt2@cornell.edu  j wtf
2312771Sqtt2@cornell.edu
2412771Sqtt2@cornell.edutrap_vector:
2512771Sqtt2@cornell.edu  j wtf
2612771Sqtt2@cornell.edu
2712771Sqtt2@cornell.eduhandle_reset:
2812771Sqtt2@cornell.edu  la t0, trap_vector
2912771Sqtt2@cornell.edu  csrw mtvec, t0
3012771Sqtt2@cornell.edu  la sp, STACK_TOP - SIZEOF_TRAPFRAME_T
3112771Sqtt2@cornell.edu  csrr t0, mhartid
3212771Sqtt2@cornell.edu  slli t0, t0, 12
3312771Sqtt2@cornell.edu  add sp, sp, t0
3412771Sqtt2@cornell.edu  csrw mscratch, sp
3512771Sqtt2@cornell.edu  la a0, userstart
3612771Sqtt2@cornell.edu  j vm_boot
3712771Sqtt2@cornell.edu
3812771Sqtt2@cornell.edu  .globl  pop_tf
3912771Sqtt2@cornell.edupop_tf:
4012771Sqtt2@cornell.edu  LOAD  t0,33*REGBYTES(a0)
4112771Sqtt2@cornell.edu  csrw  sepc,t0
4212771Sqtt2@cornell.edu  LOAD  x1,1*REGBYTES(a0)
4312771Sqtt2@cornell.edu  LOAD  x2,2*REGBYTES(a0)
4412771Sqtt2@cornell.edu  LOAD  x3,3*REGBYTES(a0)
4512771Sqtt2@cornell.edu  LOAD  x4,4*REGBYTES(a0)
4612771Sqtt2@cornell.edu  LOAD  x5,5*REGBYTES(a0)
4712771Sqtt2@cornell.edu  LOAD  x6,6*REGBYTES(a0)
4812771Sqtt2@cornell.edu  LOAD  x7,7*REGBYTES(a0)
4912771Sqtt2@cornell.edu  LOAD  x8,8*REGBYTES(a0)
5012771Sqtt2@cornell.edu  LOAD  x9,9*REGBYTES(a0)
5112771Sqtt2@cornell.edu  LOAD  x11,11*REGBYTES(a0)
5212771Sqtt2@cornell.edu  LOAD  x12,12*REGBYTES(a0)
5312771Sqtt2@cornell.edu  LOAD  x13,13*REGBYTES(a0)
5412771Sqtt2@cornell.edu  LOAD  x14,14*REGBYTES(a0)
5512771Sqtt2@cornell.edu  LOAD  x15,15*REGBYTES(a0)
5612771Sqtt2@cornell.edu  LOAD  x16,16*REGBYTES(a0)
5712771Sqtt2@cornell.edu  LOAD  x17,17*REGBYTES(a0)
5812771Sqtt2@cornell.edu  LOAD  x18,18*REGBYTES(a0)
5912771Sqtt2@cornell.edu  LOAD  x19,19*REGBYTES(a0)
6012771Sqtt2@cornell.edu  LOAD  x20,20*REGBYTES(a0)
6112771Sqtt2@cornell.edu  LOAD  x21,21*REGBYTES(a0)
6212771Sqtt2@cornell.edu  LOAD  x22,22*REGBYTES(a0)
6312771Sqtt2@cornell.edu  LOAD  x23,23*REGBYTES(a0)
6412771Sqtt2@cornell.edu  LOAD  x24,24*REGBYTES(a0)
6512771Sqtt2@cornell.edu  LOAD  x25,25*REGBYTES(a0)
6612771Sqtt2@cornell.edu  LOAD  x26,26*REGBYTES(a0)
6712771Sqtt2@cornell.edu  LOAD  x27,27*REGBYTES(a0)
6812771Sqtt2@cornell.edu  LOAD  x28,28*REGBYTES(a0)
6912771Sqtt2@cornell.edu  LOAD  x29,29*REGBYTES(a0)
7012771Sqtt2@cornell.edu  LOAD  x30,30*REGBYTES(a0)
7112771Sqtt2@cornell.edu  LOAD  x31,31*REGBYTES(a0)
7212771Sqtt2@cornell.edu  LOAD  a0,10*REGBYTES(a0)
7312771Sqtt2@cornell.edu  sret
7412771Sqtt2@cornell.edu
7512771Sqtt2@cornell.edu  .global  trap_entry
7612771Sqtt2@cornell.edutrap_entry:
7712771Sqtt2@cornell.edu  csrrw sp, sscratch, sp
7812771Sqtt2@cornell.edu
7912771Sqtt2@cornell.edu  # save gprs
8012771Sqtt2@cornell.edu  STORE  x1,1*REGBYTES(sp)
8112771Sqtt2@cornell.edu  STORE  x3,3*REGBYTES(sp)
8212771Sqtt2@cornell.edu  STORE  x4,4*REGBYTES(sp)
8312771Sqtt2@cornell.edu  STORE  x5,5*REGBYTES(sp)
8412771Sqtt2@cornell.edu  STORE  x6,6*REGBYTES(sp)
8512771Sqtt2@cornell.edu  STORE  x7,7*REGBYTES(sp)
8612771Sqtt2@cornell.edu  STORE  x8,8*REGBYTES(sp)
8712771Sqtt2@cornell.edu  STORE  x9,9*REGBYTES(sp)
8812771Sqtt2@cornell.edu  STORE  x10,10*REGBYTES(sp)
8912771Sqtt2@cornell.edu  STORE  x11,11*REGBYTES(sp)
9012771Sqtt2@cornell.edu  STORE  x12,12*REGBYTES(sp)
9112771Sqtt2@cornell.edu  STORE  x13,13*REGBYTES(sp)
9212771Sqtt2@cornell.edu  STORE  x14,14*REGBYTES(sp)
9312771Sqtt2@cornell.edu  STORE  x15,15*REGBYTES(sp)
9412771Sqtt2@cornell.edu  STORE  x16,16*REGBYTES(sp)
9512771Sqtt2@cornell.edu  STORE  x17,17*REGBYTES(sp)
9612771Sqtt2@cornell.edu  STORE  x18,18*REGBYTES(sp)
9712771Sqtt2@cornell.edu  STORE  x19,19*REGBYTES(sp)
9812771Sqtt2@cornell.edu  STORE  x20,20*REGBYTES(sp)
9912771Sqtt2@cornell.edu  STORE  x21,21*REGBYTES(sp)
10012771Sqtt2@cornell.edu  STORE  x22,22*REGBYTES(sp)
10112771Sqtt2@cornell.edu  STORE  x23,23*REGBYTES(sp)
10212771Sqtt2@cornell.edu  STORE  x24,24*REGBYTES(sp)
10312771Sqtt2@cornell.edu  STORE  x25,25*REGBYTES(sp)
10412771Sqtt2@cornell.edu  STORE  x26,26*REGBYTES(sp)
10512771Sqtt2@cornell.edu  STORE  x27,27*REGBYTES(sp)
10612771Sqtt2@cornell.edu  STORE  x28,28*REGBYTES(sp)
10712771Sqtt2@cornell.edu  STORE  x29,29*REGBYTES(sp)
10812771Sqtt2@cornell.edu  STORE  x30,30*REGBYTES(sp)
10912771Sqtt2@cornell.edu  STORE  x31,31*REGBYTES(sp)
11012771Sqtt2@cornell.edu
11112771Sqtt2@cornell.edu  csrrw  t0,sscratch,sp
11212771Sqtt2@cornell.edu  STORE  t0,2*REGBYTES(sp)
11312771Sqtt2@cornell.edu
11412771Sqtt2@cornell.edu  # get sr, epc, badvaddr, cause
11512771Sqtt2@cornell.edu  csrr   t0,sstatus
11612771Sqtt2@cornell.edu  STORE  t0,32*REGBYTES(sp)
11712771Sqtt2@cornell.edu  csrr   t0,sepc
11812771Sqtt2@cornell.edu  STORE  t0,33*REGBYTES(sp)
11912771Sqtt2@cornell.edu  csrr   t0,sbadaddr
12012771Sqtt2@cornell.edu  STORE  t0,34*REGBYTES(sp)
12112771Sqtt2@cornell.edu  csrr   t0,scause
12212771Sqtt2@cornell.edu  STORE  t0,35*REGBYTES(sp)
12312771Sqtt2@cornell.edu
12412771Sqtt2@cornell.edu  move  a0, sp
12512771Sqtt2@cornell.edu  j handle_trap
126