@@ -203,6 +203,110 @@ riscv_rt_macros::loop_global_asm!(" fmv.d.x f{}, x0", 32);
203203#[ cfg( all( riscvf, not( riscvd) ) ) ]
204204riscv_rt_macros:: loop_global_asm!( " fmv.w.x f{}, x0" , 32 ) ;
205205
206+ // SET UP INTERRUPTS, RESTORE a0..a2, AND JUMP TO MAIN RUST FUNCTION
207+ cfg_global_asm ! (
208+ "call _setup_interrupts" ,
209+ #[ cfg( riscv32) ]
210+ "lw a0, 4 * 0(sp)
211+ lw a1, 4 * 1(sp)
212+ lw a2, 4 * 2(sp)
213+ addi sp, sp, 4 * 3" ,
214+ #[ cfg( riscv64) ]
215+ "ld a0, 8 * 0(sp)
216+ ld a1, 8 * 1(sp)
217+ ld a2, 8 * 2(sp)
218+ addi sp, sp, 8 * 3" ,
219+ "jal zero, main
220+ " andi sp, t1, -16 // align stack to 16-bytes
221+ add s0, sp, zero",
222+ );
223+
224+ // STORE A0..A2 IN THE STACK, AS THEY WILL BE NEEDED LATER BY main
225+ cfg_global_asm!(
226+ #[cfg(riscv32)]
227+ " addi sp, sp, -4 * 3
228+ sw a0, 4 * 0 ( sp)
229+ sw a1, 4 * 1 ( sp)
230+ sw a2, 4 * 2 ( sp) ",
231+ #[cfg(riscv64)]
232+ " addi sp, sp, -8 * 3
233+ sd a0, 8 * 0 ( sp)
234+ sd a1, 8 * 1 ( sp)
235+ sd a2, 8 * 2 ( sp) ",
236+ );
237+
238+ // SKIP RAM INITIALIZATION IF CURRENT HART IS NOT THE BOOT HART
239+ #[cfg(not(feature = " single-hart"))]
240+ cfg_global_asm!(
241+ #[cfg(not(feature = " s-mode"))]
242+ " csrr a0, mhartid",
243+ " call _mp_hook
244+ mv t0, a0
245+
246+ beqz a0, 4 f",
247+ );
248+ // IF CURRENT HART IS THE BOOT HART CALL __pre_init AND INITIALIZE RAM
249+ cfg_global_asm!(
250+ " call __pre_init
251+ // Copy .data from flash to RAM
252+ la t0, _sdata
253+ la t2, _edata
254+ la t1, _sidata
255+ bgeu t0, t2, 2 f
256+ 1 : ",
257+ #[cfg(target_arch = " riscv32")]
258+ " lw t3, 0 ( t1)
259+ addi t1, t1, 4
260+ sw t3, 0 ( t0)
261+ addi t0, t0, 4
262+ bltu t0, t2, 1 b",
263+ #[cfg(target_arch = " riscv64")]
264+ " ld t3, 0 ( t1)
265+ addi t1, t1, 8
266+ sd t3, 0 ( t0)
267+ addi t0, t0, 8
268+ bltu t0, t2, 1 b",
269+ "
270+ 2 : // Zero out .bss
271+ la t0, _sbss
272+ la t2, _ebss
273+ bgeu t0, t2, 4 f
274+ 3 : ",
275+ #[cfg(target_arch = " riscv32")]
276+ " sw zero, 0 ( t0)
277+ addi t0, t0, 4
278+ bltu t0, t2, 3 b",
279+ #[cfg(target_arch = " riscv64")]
280+ " sd zero, 0 ( t0)
281+ addi t0, t0, 8
282+ bltu t0, t2, 3 b",
283+ "
284+ 4 : // RAM initilized",
285+ ) ;
286+
287+ // INITIALIZE FLOATING POINT UNIT
288+ #[ cfg( any( riscvf, riscvd) ) ]
289+ cfg_global_asm ! (
290+ "
291+ li t0, 0x4000 // bit 14 is FS most significant bit
292+ li t2, 0x2000 // bit 13 is FS least significant bit
293+ " ,
294+ #[ cfg( feature = "s-mode" ) ]
295+ "csrrc x0, sstatus, t0
296+ csrrs x0, sstatus, t2" ,
297+ #[ cfg( not( feature = "s-mode" ) ) ]
298+ "csrrc x0, mstatus, t0
299+ csrrs x0, mstatus, t2" ,
300+ "fscsr x0" ,
301+ ) ;
302+ // ZERO OUT FLOATING POINT REGISTERS
303+ #[ cfg( all( riscv32, riscvd) ) ]
304+ riscv_rt_macros:: loop_global_asm!( " fcvt.d.w f{}, x0" , 32 ) ;
305+ #[ cfg( all( riscv64, riscvd) ) ]
306+ riscv_rt_macros:: loop_global_asm!( " fmv.d.x f{}, x0" , 32 ) ;
307+ #[ cfg( all( riscvf, not( riscvd) ) ) ]
308+ riscv_rt_macros:: loop_global_asm!( " fmv.w.x f{}, x0" , 32 ) ;
309+
206310// SET UP INTERRUPTS, RESTORE a0..a2, AND JUMP TO MAIN RUST FUNCTION
207311cfg_global_asm ! (
208312 "call _setup_interrupts" ,
0 commit comments