mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			126 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
#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
 |