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