Skip to content

Commit 5ccece0

Browse files
committed
Updated start.s and entry.s to follow GD32
1 parent 6c5503c commit 5ccece0

File tree

5 files changed

+400
-71
lines changed

5 files changed

+400
-71
lines changed
Lines changed: 287 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,287 @@
1+
// See LICENSE for license details
2+
// Based on hw/mcu/gigadevice/gd32vf103/src/ext/Firmware/RISCV/env_Eclipse/entry.S.TODO
3+
4+
#ifndef ENTRY_S
5+
#define ENTRY_S
6+
7+
#include "riscv_encoding.h"
8+
#include "riscv_bits.h"
9+
#include "n200_eclic.h"
10+
#include "n200_timer.h"
11+
12+
###############################################
13+
###############################################
14+
# Disable Interrupt
15+
#
16+
.macro DISABLE_MIE
17+
csrc CSR_MSTATUS, MSTATUS_MIE
18+
.endm
19+
20+
21+
###############################################
22+
###############################################
23+
#Save caller registers
24+
.macro SAVE_CONTEXT
25+
26+
#ifdef __riscv_flen
27+
#if (__riscv_flen==64 )
28+
addi sp, sp, -20*REGBYTES - 20*FPREGBYTES
29+
#else
30+
addi sp, sp, -20*REGBYTES
31+
#endif
32+
#else
33+
addi sp, sp, -20*REGBYTES
34+
#endif
35+
STORE x1, 0*REGBYTES(sp)
36+
STORE x4, 1*REGBYTES(sp)
37+
STORE x5, 2*REGBYTES(sp)
38+
STORE x6, 3*REGBYTES(sp)
39+
STORE x7, 4*REGBYTES(sp)
40+
STORE x10, 5*REGBYTES(sp)
41+
STORE x11, 6*REGBYTES(sp)
42+
STORE x12, 7*REGBYTES(sp)
43+
STORE x13, 8*REGBYTES(sp)
44+
STORE x14, 9*REGBYTES(sp)
45+
STORE x15, 10*REGBYTES(sp)
46+
#ifndef __riscv_32e
47+
STORE x16, 11*REGBYTES(sp)
48+
STORE x17, 12*REGBYTES(sp)
49+
STORE x28, 13*REGBYTES(sp)
50+
STORE x29, 14*REGBYTES(sp)
51+
STORE x30, 15*REGBYTES(sp)
52+
STORE x31, 16*REGBYTES(sp)
53+
#endif
54+
55+
#ifdef __riscv_flen
56+
#if (__riscv_flen == 64)
57+
FPSTORE f0, (20*REGBYTES + 0*FPREGBYTES)(sp)
58+
FPSTORE f1, (20*REGBYTES + 1*FPREGBYTES)(sp)
59+
FPSTORE f2, (20*REGBYTES + 2*FPREGBYTES)(sp)
60+
FPSTORE f3, (20*REGBYTES + 3*FPREGBYTES)(sp)
61+
FPSTORE f4, (20*REGBYTES + 4*FPREGBYTES)(sp)
62+
FPSTORE f5, (20*REGBYTES + 5*FPREGBYTES)(sp)
63+
FPSTORE f6, (20*REGBYTES + 6*FPREGBYTES)(sp)
64+
FPSTORE f7, (20*REGBYTES + 7*FPREGBYTES)(sp)
65+
FPSTORE f10, (20*REGBYTES + 8*FPREGBYTES)(sp)
66+
FPSTORE f11, (20*REGBYTES + 9*FPREGBYTES)(sp)
67+
FPSTORE f12, (20*REGBYTES + 10*FPREGBYTES)(sp)
68+
FPSTORE f13, (20*REGBYTES + 11*FPREGBYTES)(sp)
69+
FPSTORE f14, (20*REGBYTES + 12*FPREGBYTES)(sp)
70+
FPSTORE f15, (20*REGBYTES + 13*FPREGBYTES)(sp)
71+
FPSTORE f16, (20*REGBYTES + 14*FPREGBYTES)(sp)
72+
FPSTORE f17, (20*REGBYTES + 15*FPREGBYTES)(sp)
73+
FPSTORE f28, (20*REGBYTES + 16*FPREGBYTES)(sp)
74+
FPSTORE f29, (20*REGBYTES + 17*FPREGBYTES)(sp)
75+
FPSTORE f30, (20*REGBYTES + 18*FPREGBYTES)(sp)
76+
FPSTORE f31, (20*REGBYTES + 19*FPREGBYTES)(sp)
77+
#endif
78+
#endif
79+
80+
81+
.endm
82+
83+
84+
###############################################
85+
###############################################
86+
#restore caller registers
87+
.macro RESTORE_CONTEXT
88+
LOAD x1, 0*REGBYTES(sp)
89+
LOAD x4, 1*REGBYTES(sp)
90+
LOAD x5, 2*REGBYTES(sp)
91+
LOAD x6, 3*REGBYTES(sp)
92+
LOAD x7, 4*REGBYTES(sp)
93+
LOAD x10, 5*REGBYTES(sp)
94+
LOAD x11, 6*REGBYTES(sp)
95+
LOAD x12, 7*REGBYTES(sp)
96+
LOAD x13, 8*REGBYTES(sp)
97+
LOAD x14, 9*REGBYTES(sp)
98+
LOAD x15, 10*REGBYTES(sp)
99+
#ifndef __riscv_32e
100+
LOAD x16, 11*REGBYTES(sp)
101+
LOAD x17, 12*REGBYTES(sp)
102+
LOAD x28, 13*REGBYTES(sp)
103+
LOAD x29, 14*REGBYTES(sp)
104+
LOAD x30, 15*REGBYTES(sp)
105+
LOAD x31, 16*REGBYTES(sp)
106+
#endif
107+
108+
109+
#ifdef __riscv_flen
110+
#if (__riscv_flen==64)
111+
/* Restore fp caller registers */
112+
FPLOAD f0, (20*REGBYTES + 0*FPREGBYTES)(sp)
113+
FPLOAD f1, (20*REGBYTES + 1*FPREGBYTES)(sp)
114+
FPLOAD f2, (20*REGBYTES + 2*FPREGBYTES)(sp)
115+
FPLOAD f3, (20*REGBYTES + 3*FPREGBYTES)(sp)
116+
FPLOAD f4, (20*REGBYTES + 4*FPREGBYTES)(sp)
117+
FPLOAD f5, (20*REGBYTES + 5*FPREGBYTES)(sp)
118+
FPLOAD f6, (20*REGBYTES + 6*FPREGBYTES)(sp)
119+
FPLOAD f7, (20*REGBYTES + 7*FPREGBYTES)(sp)
120+
FPLOAD f10, (20*REGBYTES + 8*FPREGBYTES)(sp)
121+
FPLOAD f11, (20*REGBYTES + 9*FPREGBYTES)(sp)
122+
FPLOAD f12, (20*REGBYTES + 10*FPREGBYTES)(sp)
123+
FPLOAD f13, (20*REGBYTES + 11*FPREGBYTES)(sp)
124+
FPLOAD f14, (20*REGBYTES + 12*FPREGBYTES)(sp)
125+
FPLOAD f15, (20*REGBYTES + 13*FPREGBYTES)(sp)
126+
FPLOAD f16, (20*REGBYTES + 14*FPREGBYTES)(sp)
127+
FPLOAD f17, (20*REGBYTES + 15*FPREGBYTES)(sp)
128+
FPLOAD f28, (20*REGBYTES + 16*FPREGBYTES)(sp)
129+
FPLOAD f29, (20*REGBYTES + 17*FPREGBYTES)(sp)
130+
FPLOAD f30, (20*REGBYTES + 18*FPREGBYTES)(sp)
131+
FPLOAD f31, (20*REGBYTES + 19*FPREGBYTES)(sp)
132+
#endif
133+
#endif
134+
135+
136+
#ifdef __riscv_flen
137+
#if(__riscv_flen == 64 )
138+
addi sp, sp, 20*REGBYTES + 20*FPREGBYTES
139+
#else
140+
addi sp, sp, 20*REGBYTES
141+
#endif
142+
#else
143+
// De-allocate the stack space
144+
addi sp, sp, 20*REGBYTES
145+
#endif
146+
.endm
147+
148+
###############################################
149+
###############################################
150+
#restore caller registers
151+
.macro RESTORE_CONTEXT_EXCPT_X5
152+
LOAD x1, 0*REGBYTES(sp)
153+
LOAD x6, 2*REGBYTES(sp)
154+
LOAD x7, 3*REGBYTES(sp)
155+
LOAD x10, 4*REGBYTES(sp)
156+
LOAD x11, 5*REGBYTES(sp)
157+
LOAD x12, 6*REGBYTES(sp)
158+
LOAD x13, 7*REGBYTES(sp)
159+
LOAD x14, 8*REGBYTES(sp)
160+
LOAD x15, 9*REGBYTES(sp)
161+
#ifndef __riscv_32e
162+
LOAD x16, 10*REGBYTES(sp)
163+
LOAD x17, 11*REGBYTES(sp)
164+
LOAD x28, 12*REGBYTES(sp)
165+
LOAD x29, 13*REGBYTES(sp)
166+
LOAD x30, 14*REGBYTES(sp)
167+
LOAD x31, 15*REGBYTES(sp)
168+
#endif
169+
.endm
170+
171+
###############################################
172+
###############################################
173+
#restore caller registers
174+
.macro RESTORE_CONTEXT_ONLY_X5
175+
LOAD x5, 1*REGBYTES(sp)
176+
.endm
177+
178+
###############################################
179+
###############################################
180+
# Save the mepc and mstatus
181+
#
182+
.macro SAVE_EPC_STATUS
183+
csrr x5, CSR_MEPC
184+
STORE x5, 16*REGBYTES(sp)
185+
csrr x5, CSR_MSTATUS
186+
STORE x5, 17*REGBYTES(sp)
187+
csrr x5, CSR_MSUBM
188+
STORE x5, 18*REGBYTES(sp)
189+
.endm
190+
191+
###############################################
192+
###############################################
193+
# Restore the mepc and mstatus
194+
#
195+
.macro RESTORE_EPC_STATUS
196+
LOAD x5, 16*REGBYTES(sp)
197+
csrw CSR_MEPC, x5
198+
LOAD x5, 17*REGBYTES(sp)
199+
csrw CSR_MSTATUS, x5
200+
LOAD x5, 18*REGBYTES(sp)
201+
csrw CSR_MSUBM, x5
202+
.endm
203+
204+
205+
206+
###############################################
207+
###############################################
208+
// Trap entry point
209+
//
210+
.section .text.trap
211+
.align 6// In CLIC mode, the trap entry must be 64bytes aligned
212+
.global trap_entry
213+
.weak trap_entry
214+
trap_entry:
215+
// Allocate the stack space
216+
// addi sp, sp, -19*REGBYTES
217+
218+
// Save the caller saving registers (context)
219+
SAVE_CONTEXT
220+
// Save the MEPC/Mstatus/Msubm reg
221+
SAVE_EPC_STATUS
222+
223+
// Set the function argument
224+
csrr a0, mcause
225+
mv a1, sp
226+
// Call the function
227+
call handle_trap
228+
229+
// Restore the MEPC/Mstatus/Msubm reg
230+
RESTORE_EPC_STATUS
231+
// Restore the caller saving registers (context)
232+
RESTORE_CONTEXT
233+
234+
// De-allocate the stack space
235+
// addi sp, sp, 19*REGBYTES
236+
// Return to regular code
237+
mret
238+
239+
240+
###############################################
241+
###############################################
242+
// IRQ entry point
243+
//
244+
.section .text.irq
245+
.align 2
246+
.global irq_entry
247+
.weak irq_entry
248+
irq_entry: // -------------> This label will be set to MTVT2 register
249+
// Allocate the stack space
250+
251+
252+
SAVE_CONTEXT// Save 16 regs
253+
254+
//------This special CSR read operation, which is actually use mcause as operand to directly store it to memory
255+
csrrwi x0, CSR_PUSHMCAUSE, 17
256+
//------This special CSR read operation, which is actually use mepc as operand to directly store it to memory
257+
csrrwi x0, CSR_PUSHMEPC, 18
258+
//------This special CSR read operation, which is actually use Msubm as operand to directly store it to memory
259+
csrrwi x0, CSR_PUSHMSUBM, 19
260+
261+
service_loop:
262+
//------This special CSR read/write operation, which is actually Claim the CLIC to find its pending highest
263+
// ID, if the ID is not 0, then automatically enable the mstatus.MIE, and jump to its vector-entry-label, and
264+
// update the link register
265+
csrrw ra, CSR_JALMNXTI, ra
266+
267+
//RESTORE_CONTEXT_EXCPT_X5
268+
269+
#---- Critical section with interrupts disabled -----------------------
270+
DISABLE_MIE # Disable interrupts
271+
272+
LOAD x5, 19*REGBYTES(sp)
273+
csrw CSR_MSUBM, x5
274+
LOAD x5, 18*REGBYTES(sp)
275+
csrw CSR_MEPC, x5
276+
LOAD x5, 17*REGBYTES(sp)
277+
csrw CSR_MCAUSE, x5
278+
279+
280+
RESTORE_CONTEXT
281+
282+
283+
// Return to regular code
284+
mret
285+
286+
287+
#endif

0 commit comments

Comments
 (0)