@@ -203,6 +203,110 @@ riscv_rt_macros::loop_global_asm!(" fmv.d.x f{}, x0", 32);
203
203
#[ cfg( all( riscvf, not( riscvd) ) ) ]
204
204
riscv_rt_macros:: loop_global_asm!( " fmv.w.x f{}, x0" , 32 ) ;
205
205
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
+
206
310
// SET UP INTERRUPTS, RESTORE a0..a2, AND JUMP TO MAIN RUST FUNCTION
207
311
cfg_global_asm ! (
208
312
"call _setup_interrupts" ,
0 commit comments