Merge branch 'master' of github.com:ucb-bar/riscv-tests
[riscv-tests.git] / benchmarks / common / crt.S
1 #include "pcr.h"
2
3 .data
4 .globl _heapend
5 .globl environ
6 _heapend:
7 .word 0
8 environ:
9 .word 0
10
11 .text
12 .globl _start
13
14 _start:
15 li x1, 0
16 li x2, 0
17 li x3, 0
18 li x4, 0
19 li x5, 0
20 li x6, 0
21 li x7, 0
22 li x8, 0
23 li x9, 0
24 li x10,0
25 li x11,0
26 li x12,0
27 li x13,0
28 li x14,0
29 li x15,0
30 li x16,0
31 li x17,0
32 li x18,0
33 li x19,0
34 li x20,0
35 li x21,0
36 li x22,0
37 li x23,0
38 li x24,0
39 li x25,0
40 li x26,0
41 li x27,0
42 li x28,0
43 li x29,0
44 li x30,0
45 li x31,0
46
47 #ifdef __riscv64
48 setpcr status, SR_S64
49 setpcr status, SR_U64
50 #endif
51
52 # enable fp
53 setpcr status, SR_EF
54
55 # enable vec
56 setpcr t0, status, SR_EV
57
58 ## if that didn't stick, we don't have an FPU, so don't initialize it
59 and t0, t0, SR_EF
60 beqz t0, 1f
61
62 fssr x0
63 fmv.s.x f0, x0
64 fmv.s.x f1, x0
65 fmv.s.x f2, x0
66 fmv.s.x f3, x0
67 fmv.s.x f4, x0
68 fmv.s.x f5, x0
69 fmv.s.x f6, x0
70 fmv.s.x f7, x0
71 fmv.s.x f8, x0
72 fmv.s.x f9, x0
73 fmv.s.x f10,x0
74 fmv.s.x f11,x0
75 fmv.s.x f12,x0
76 fmv.s.x f13,x0
77 fmv.s.x f14,x0
78 fmv.s.x f15,x0
79 fmv.s.x f16,x0
80 fmv.s.x f17,x0
81 fmv.s.x f18,x0
82 fmv.s.x f19,x0
83 fmv.s.x f20,x0
84 fmv.s.x f21,x0
85 fmv.s.x f22,x0
86 fmv.s.x f23,x0
87 fmv.s.x f24,x0
88 fmv.s.x f25,x0
89 fmv.s.x f26,x0
90 fmv.s.x f27,x0
91 fmv.s.x f28,x0
92 fmv.s.x f29,x0
93 fmv.s.x f30,x0
94 fmv.s.x f31,x0
95 1:
96
97 lui a0, %hi(trap_entry)
98 add a0, a0, %lo(trap_entry)
99 mtpcr a0, evec
100
101 lui a0, %hi(main)
102 add a0, a0, %lo(main)
103 mtpcr a0, epc
104
105 # only allow core 0 to proceed
106 1:mfpcr a0, hartid
107 bnez a0, 1b
108
109 la sp,stacktop
110
111 # jmp to main as a user program
112 eret
113 1:b 1b
114
115 .align 4
116 .globl trap_entry
117 trap_entry: # only check for SYS_exit, otherwise crash out
118 li a3, 1337 # magic "bad things" happened error code
119 mfpcr a1, cause
120 li a2, 6 # syscall exception number
121 bne a1, a2, exit_error
122 handle_syscall:
123 li a1, 93 # SYS_exit number
124 bne v0, a1, exit_error
125 li a1, 1 # successful exit code
126 move a3, a0
127 bne a3, a1, exit_error
128 mtpcr a1, tohost # exit successfully (tohost == 1)
129 1:b 1b
130 exit_error:
131 sll a3, a3, 1
132 or a3, a3, 1
133 mtpcr a3, tohost
134 1:b 1b
135
136 .bss
137 .globl stacktop
138
139 .align 4
140 .skip 131072
141 stacktop: