mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			226 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			226 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
# See LICENSE for license details.
 | 
						|
 | 
						|
#include "encoding.h"
 | 
						|
 | 
						|
#if __riscv_xlen == 64
 | 
						|
# define LREG ld
 | 
						|
# define SREG sd
 | 
						|
# define REGBYTES 8
 | 
						|
#else
 | 
						|
# define LREG lw
 | 
						|
# define SREG sw
 | 
						|
# define REGBYTES 4
 | 
						|
#endif
 | 
						|
 | 
						|
  .section ".text.init"
 | 
						|
  .globl _start
 | 
						|
_start:
 | 
						|
  li  x1, 0
 | 
						|
  li  x2, 0
 | 
						|
  li  x3, 0
 | 
						|
  li  x4, 0
 | 
						|
  li  x5, 0
 | 
						|
  li  x6, 0
 | 
						|
  li  x7, 0
 | 
						|
  li  x8, 0
 | 
						|
  li  x9, 0
 | 
						|
  li  x10,0
 | 
						|
  li  x11,0
 | 
						|
  li  x12,0
 | 
						|
  li  x13,0
 | 
						|
  li  x14,0
 | 
						|
  li  x15,0
 | 
						|
  li  x16,0
 | 
						|
  li  x17,0
 | 
						|
  li  x18,0
 | 
						|
  li  x19,0
 | 
						|
  li  x20,0
 | 
						|
  li  x21,0
 | 
						|
  li  x22,0
 | 
						|
  li  x23,0
 | 
						|
  li  x24,0
 | 
						|
  li  x25,0
 | 
						|
  li  x26,0
 | 
						|
  li  x27,0
 | 
						|
  li  x28,0
 | 
						|
  li  x29,0
 | 
						|
  li  x30,0
 | 
						|
  li  x31,0
 | 
						|
 | 
						|
  # enable FPU and accelerator if present
 | 
						|
  li t0, MSTATUS_FS | MSTATUS_XS
 | 
						|
  csrs mstatus, t0
 | 
						|
 | 
						|
  # make sure XLEN agrees with compilation choice
 | 
						|
  li t0, 1
 | 
						|
  slli t0, t0, 31
 | 
						|
#if __riscv_xlen == 64
 | 
						|
  bgez t0, 1f
 | 
						|
#else
 | 
						|
  bltz t0, 1f
 | 
						|
#endif
 | 
						|
2:
 | 
						|
  li a0, 1
 | 
						|
  sw a0, tohost, t0
 | 
						|
  j 2b
 | 
						|
1:
 | 
						|
 | 
						|
#ifdef __riscv_flen
 | 
						|
  # initialize FPU if we have one
 | 
						|
  la t0, 1f
 | 
						|
  csrw mtvec, t0
 | 
						|
 | 
						|
  fssr    x0
 | 
						|
  fmv.s.x f0, x0
 | 
						|
  fmv.s.x f1, x0
 | 
						|
  fmv.s.x f2, x0
 | 
						|
  fmv.s.x f3, x0
 | 
						|
  fmv.s.x f4, x0
 | 
						|
  fmv.s.x f5, x0
 | 
						|
  fmv.s.x f6, x0
 | 
						|
  fmv.s.x f7, x0
 | 
						|
  fmv.s.x f8, x0
 | 
						|
  fmv.s.x f9, x0
 | 
						|
  fmv.s.x f10,x0
 | 
						|
  fmv.s.x f11,x0
 | 
						|
  fmv.s.x f12,x0
 | 
						|
  fmv.s.x f13,x0
 | 
						|
  fmv.s.x f14,x0
 | 
						|
  fmv.s.x f15,x0
 | 
						|
  fmv.s.x f16,x0
 | 
						|
  fmv.s.x f17,x0
 | 
						|
  fmv.s.x f18,x0
 | 
						|
  fmv.s.x f19,x0
 | 
						|
  fmv.s.x f20,x0
 | 
						|
  fmv.s.x f21,x0
 | 
						|
  fmv.s.x f22,x0
 | 
						|
  fmv.s.x f23,x0
 | 
						|
  fmv.s.x f24,x0
 | 
						|
  fmv.s.x f25,x0
 | 
						|
  fmv.s.x f26,x0
 | 
						|
  fmv.s.x f27,x0
 | 
						|
  fmv.s.x f28,x0
 | 
						|
  fmv.s.x f29,x0
 | 
						|
  fmv.s.x f30,x0
 | 
						|
  fmv.s.x f31,x0
 | 
						|
1:
 | 
						|
#endif
 | 
						|
 | 
						|
  # initialize trap vector
 | 
						|
  la t0, trap_entry
 | 
						|
  csrw mtvec, t0
 | 
						|
 | 
						|
  # initialize global pointer
 | 
						|
.option push
 | 
						|
.option norelax
 | 
						|
  la gp, __global_pointer$
 | 
						|
.option pop
 | 
						|
 | 
						|
  la  tp, _end + 63
 | 
						|
  and tp, tp, -64
 | 
						|
 | 
						|
  # get core id
 | 
						|
  csrr a0, mhartid
 | 
						|
  # for now, assume only 1 core
 | 
						|
  li a1, 1
 | 
						|
1:bgeu a0, a1, 1b
 | 
						|
 | 
						|
  # give each core 128KB of stack + TLS
 | 
						|
#define STKSHIFT 17
 | 
						|
  add sp, a0, 1
 | 
						|
  sll sp, sp, STKSHIFT
 | 
						|
  add sp, sp, tp
 | 
						|
  sll a2, a0, STKSHIFT
 | 
						|
  add tp, tp, a2
 | 
						|
 | 
						|
  j _init
 | 
						|
 | 
						|
  .align 2
 | 
						|
trap_entry:
 | 
						|
  addi sp, sp, -272
 | 
						|
 | 
						|
  SREG x1, 1*REGBYTES(sp)
 | 
						|
  SREG x2, 2*REGBYTES(sp)
 | 
						|
  SREG x3, 3*REGBYTES(sp)
 | 
						|
  SREG x4, 4*REGBYTES(sp)
 | 
						|
  SREG x5, 5*REGBYTES(sp)
 | 
						|
  SREG x6, 6*REGBYTES(sp)
 | 
						|
  SREG x7, 7*REGBYTES(sp)
 | 
						|
  SREG x8, 8*REGBYTES(sp)
 | 
						|
  SREG x9, 9*REGBYTES(sp)
 | 
						|
  SREG x10, 10*REGBYTES(sp)
 | 
						|
  SREG x11, 11*REGBYTES(sp)
 | 
						|
  SREG x12, 12*REGBYTES(sp)
 | 
						|
  SREG x13, 13*REGBYTES(sp)
 | 
						|
  SREG x14, 14*REGBYTES(sp)
 | 
						|
  SREG x15, 15*REGBYTES(sp)
 | 
						|
  SREG x16, 16*REGBYTES(sp)
 | 
						|
  SREG x17, 17*REGBYTES(sp)
 | 
						|
  SREG x18, 18*REGBYTES(sp)
 | 
						|
  SREG x19, 19*REGBYTES(sp)
 | 
						|
  SREG x20, 20*REGBYTES(sp)
 | 
						|
  SREG x21, 21*REGBYTES(sp)
 | 
						|
  SREG x22, 22*REGBYTES(sp)
 | 
						|
  SREG x23, 23*REGBYTES(sp)
 | 
						|
  SREG x24, 24*REGBYTES(sp)
 | 
						|
  SREG x25, 25*REGBYTES(sp)
 | 
						|
  SREG x26, 26*REGBYTES(sp)
 | 
						|
  SREG x27, 27*REGBYTES(sp)
 | 
						|
  SREG x28, 28*REGBYTES(sp)
 | 
						|
  SREG x29, 29*REGBYTES(sp)
 | 
						|
  SREG x30, 30*REGBYTES(sp)
 | 
						|
  SREG x31, 31*REGBYTES(sp)
 | 
						|
 | 
						|
  csrr a0, mcause
 | 
						|
  csrr a1, mepc
 | 
						|
  mv a2, sp
 | 
						|
  jal handle_trap
 | 
						|
  csrw mepc, a0
 | 
						|
 | 
						|
  # Remain in M-mode after eret
 | 
						|
  li t0, MSTATUS_MPP
 | 
						|
  csrs mstatus, t0
 | 
						|
 | 
						|
  LREG x1, 1*REGBYTES(sp)
 | 
						|
  LREG x2, 2*REGBYTES(sp)
 | 
						|
  LREG x3, 3*REGBYTES(sp)
 | 
						|
  LREG x4, 4*REGBYTES(sp)
 | 
						|
  LREG x5, 5*REGBYTES(sp)
 | 
						|
  LREG x6, 6*REGBYTES(sp)
 | 
						|
  LREG x7, 7*REGBYTES(sp)
 | 
						|
  LREG x8, 8*REGBYTES(sp)
 | 
						|
  LREG x9, 9*REGBYTES(sp)
 | 
						|
  LREG x10, 10*REGBYTES(sp)
 | 
						|
  LREG x11, 11*REGBYTES(sp)
 | 
						|
  LREG x12, 12*REGBYTES(sp)
 | 
						|
  LREG x13, 13*REGBYTES(sp)
 | 
						|
  LREG x14, 14*REGBYTES(sp)
 | 
						|
  LREG x15, 15*REGBYTES(sp)
 | 
						|
  LREG x16, 16*REGBYTES(sp)
 | 
						|
  LREG x17, 17*REGBYTES(sp)
 | 
						|
  LREG x18, 18*REGBYTES(sp)
 | 
						|
  LREG x19, 19*REGBYTES(sp)
 | 
						|
  LREG x20, 20*REGBYTES(sp)
 | 
						|
  LREG x21, 21*REGBYTES(sp)
 | 
						|
  LREG x22, 22*REGBYTES(sp)
 | 
						|
  LREG x23, 23*REGBYTES(sp)
 | 
						|
  LREG x24, 24*REGBYTES(sp)
 | 
						|
  LREG x25, 25*REGBYTES(sp)
 | 
						|
  LREG x26, 26*REGBYTES(sp)
 | 
						|
  LREG x27, 27*REGBYTES(sp)
 | 
						|
  LREG x28, 28*REGBYTES(sp)
 | 
						|
  LREG x29, 29*REGBYTES(sp)
 | 
						|
  LREG x30, 30*REGBYTES(sp)
 | 
						|
  LREG x31, 31*REGBYTES(sp)
 | 
						|
 | 
						|
  addi sp, sp, 272
 | 
						|
  mret
 | 
						|
 | 
						|
.section ".tohost","aw",@progbits
 | 
						|
.align 6
 | 
						|
.globl tohost
 | 
						|
tohost: .dword 0
 | 
						|
.align 6
 | 
						|
.globl fromhost
 | 
						|
fromhost: .dword 0
 |