|
@@ -203,110 +203,6 @@ riscv_rt_macros::loop_global_asm!(" fmv.d.x f{}, x0", 32);
|
|
#[cfg(all(riscvf, not(riscvd)))]
|
|
#[cfg(all(riscvf, not(riscvd)))]
|
|
riscv_rt_macros::loop_global_asm!(" fmv.w.x f{}, x0", 32);
|
|
riscv_rt_macros::loop_global_asm!(" fmv.w.x f{}, x0", 32);
|
|
|
|
|
|
-// SET UP INTERRUPTS, RESTORE a0..a2, AND JUMP TO MAIN RUST FUNCTION
|
|
|
|
-cfg_global_asm!(
|
|
|
|
- "call _setup_interrupts",
|
|
|
|
- #[cfg(riscv32)]
|
|
|
|
- "lw a0, 4 * 0(sp)
|
|
|
|
- lw a1, 4 * 1(sp)
|
|
|
|
- lw a2, 4 * 2(sp)
|
|
|
|
- addi sp, sp, 4 * 3",
|
|
|
|
- #[cfg(riscv64)]
|
|
|
|
- "ld a0, 8 * 0(sp)
|
|
|
|
- ld a1, 8 * 1(sp)
|
|
|
|
- ld a2, 8 * 2(sp)
|
|
|
|
- addi sp, sp, 8 * 3",
|
|
|
|
- "jal zero, main
|
|
|
|
- "andi sp, t1, -16 // align stack to 16-bytes
|
|
|
|
- add s0, sp, zero",
|
|
|
|
-);
|
|
|
|
-
|
|
|
|
-// STORE A0..A2 IN THE STACK, AS THEY WILL BE NEEDED LATER BY main
|
|
|
|
-cfg_global_asm!(
|
|
|
|
- #[cfg(riscv32)]
|
|
|
|
- "addi sp, sp, -4 * 3
|
|
|
|
- sw a0, 4 * 0(sp)
|
|
|
|
- sw a1, 4 * 1(sp)
|
|
|
|
- sw a2, 4 * 2(sp)",
|
|
|
|
- #[cfg(riscv64)]
|
|
|
|
- "addi sp, sp, -8 * 3
|
|
|
|
- sd a0, 8 * 0(sp)
|
|
|
|
- sd a1, 8 * 1(sp)
|
|
|
|
- sd a2, 8 * 2(sp)",
|
|
|
|
-);
|
|
|
|
-
|
|
|
|
-// SKIP RAM INITIALIZATION IF CURRENT HART IS NOT THE BOOT HART
|
|
|
|
-#[cfg(not(feature = "single-hart"))]
|
|
|
|
-cfg_global_asm!(
|
|
|
|
- #[cfg(not(feature = "s-mode"))]
|
|
|
|
- "csrr a0, mhartid",
|
|
|
|
- "call _mp_hook
|
|
|
|
- mv t0, a0
|
|
|
|
-
|
|
|
|
- beqz a0, 4f",
|
|
|
|
-);
|
|
|
|
-// IF CURRENT HART IS THE BOOT HART CALL __pre_init AND INITIALIZE RAM
|
|
|
|
-cfg_global_asm!(
|
|
|
|
- "call __pre_init
|
|
|
|
- // Copy .data from flash to RAM
|
|
|
|
- la t0, _sdata
|
|
|
|
- la t2, _edata
|
|
|
|
- la t1, _sidata
|
|
|
|
- bgeu t0, t2, 2f
|
|
|
|
-1: ",
|
|
|
|
- #[cfg(target_arch = "riscv32")]
|
|
|
|
- "lw t3, 0(t1)
|
|
|
|
- addi t1, t1, 4
|
|
|
|
- sw t3, 0(t0)
|
|
|
|
- addi t0, t0, 4
|
|
|
|
- bltu t0, t2, 1b",
|
|
|
|
- #[cfg(target_arch = "riscv64")]
|
|
|
|
- "ld t3, 0(t1)
|
|
|
|
- addi t1, t1, 8
|
|
|
|
- sd t3, 0(t0)
|
|
|
|
- addi t0, t0, 8
|
|
|
|
- bltu t0, t2, 1b",
|
|
|
|
- "
|
|
|
|
-2: // Zero out .bss
|
|
|
|
- la t0, _sbss
|
|
|
|
- la t2, _ebss
|
|
|
|
- bgeu t0, t2, 4f
|
|
|
|
-3: ",
|
|
|
|
- #[cfg(target_arch = "riscv32")]
|
|
|
|
- "sw zero, 0(t0)
|
|
|
|
- addi t0, t0, 4
|
|
|
|
- bltu t0, t2, 3b",
|
|
|
|
- #[cfg(target_arch = "riscv64")]
|
|
|
|
- "sd zero, 0(t0)
|
|
|
|
- addi t0, t0, 8
|
|
|
|
- bltu t0, t2, 3b",
|
|
|
|
- "
|
|
|
|
-4: // RAM initilized",
|
|
|
|
-);
|
|
|
|
-
|
|
|
|
-// INITIALIZE FLOATING POINT UNIT
|
|
|
|
-#[cfg(any(riscvf, riscvd))]
|
|
|
|
-cfg_global_asm!(
|
|
|
|
- "
|
|
|
|
- li t0, 0x4000 // bit 14 is FS most significant bit
|
|
|
|
- li t2, 0x2000 // bit 13 is FS least significant bit
|
|
|
|
- ",
|
|
|
|
- #[cfg(feature = "s-mode")]
|
|
|
|
- "csrrc x0, sstatus, t0
|
|
|
|
- csrrs x0, sstatus, t2",
|
|
|
|
- #[cfg(not(feature = "s-mode"))]
|
|
|
|
- "csrrc x0, mstatus, t0
|
|
|
|
- csrrs x0, mstatus, t2",
|
|
|
|
- "fscsr x0",
|
|
|
|
-);
|
|
|
|
-// ZERO OUT FLOATING POINT REGISTERS
|
|
|
|
-#[cfg(all(riscv32, riscvd))]
|
|
|
|
-riscv_rt_macros::loop_global_asm!(" fcvt.d.w f{}, x0", 32);
|
|
|
|
-#[cfg(all(riscv64, riscvd))]
|
|
|
|
-riscv_rt_macros::loop_global_asm!(" fmv.d.x f{}, x0", 32);
|
|
|
|
-#[cfg(all(riscvf, not(riscvd)))]
|
|
|
|
-riscv_rt_macros::loop_global_asm!(" fmv.w.x f{}, x0", 32);
|
|
|
|
-
|
|
|
|
// SET UP INTERRUPTS, RESTORE a0..a2, AND JUMP TO MAIN RUST FUNCTION
|
|
// SET UP INTERRUPTS, RESTORE a0..a2, AND JUMP TO MAIN RUST FUNCTION
|
|
cfg_global_asm!(
|
|
cfg_global_asm!(
|
|
"call _setup_interrupts",
|
|
"call _setup_interrupts",
|