123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- /*
- Entry point of all programs (_start).
- It initializes DWARF call frame information, the stack pointer, the
- frame pointer (needed for closures to work in start_rust) and the global
- pointer. Then it calls _start_rust.
- */
- .section .init, "ax"
- .global _start
- _start:
- .cfi_startproc
- .cfi_undefined ra
- csrw mie, 0
- csrw mip, 0
- li x1, 0
- li x2, 0
- li x3, 0
- li x4, 0
- li x5, 0
- li x6, 0
- li x7, 0
- li x8, 0
- li x9, 0
- li x10,0
- li x11,0
- li x12,0
- li x13,0
- li x14,0
- li x15,0
- li x16,0
- li x17,0
- li x18,0
- li x19,0
- li x20,0
- li x21,0
- li x22,0
- li x23,0
- li x24,0
- li x25,0
- li x26,0
- li x27,0
- li x28,0
- li x29,0
- li x30,0
- li x31,0
- .option push
- .option norelax
- la gp, __global_pointer$
- .option pop
- // Check hart id
- csrr a2, mhartid
- lui t0, %hi(_max_hart_id)
- add t0, t0, %lo(_max_hart_id)
- bgtu a2, t0, abort
- // Allocate stacks
- la sp, _stack_start
- lui t0, %hi(_hart_stack_size)
- add t0, t0, %lo(_hart_stack_size)
- mul t0, a2, t0
- sub sp, sp, t0
- // Set frame pointer
- add s0, sp, zero
- // Set trap handler
- la t0, _start_trap
- csrw mtvec, t0
- jal zero, _start_rust
- .cfi_endproc
- /*
- Trap entry point (_start_trap)
- Saves caller saved registers ra, t0..6, a0..7, calls _start_trap_rust,
- restores caller saved registers and then returns.
- */
- .section .trap, "ax"
- .global _start_trap
- _start_trap:
- addi sp, sp, -16*4
- sw ra, 0*4(sp)
- sw t0, 1*4(sp)
- sw t1, 2*4(sp)
- sw t2, 3*4(sp)
- sw t3, 4*4(sp)
- sw t4, 5*4(sp)
- sw t5, 6*4(sp)
- sw t6, 7*4(sp)
- sw a0, 8*4(sp)
- sw a1, 9*4(sp)
- sw a2, 10*4(sp)
- sw a3, 11*4(sp)
- sw a4, 12*4(sp)
- sw a5, 13*4(sp)
- sw a6, 14*4(sp)
- sw a7, 15*4(sp)
- jal ra, _start_trap_rust
- lw ra, 0*4(sp)
- lw t0, 1*4(sp)
- lw t1, 2*4(sp)
- lw t2, 3*4(sp)
- lw t3, 4*4(sp)
- lw t4, 5*4(sp)
- lw t5, 6*4(sp)
- lw t6, 7*4(sp)
- lw a0, 8*4(sp)
- lw a1, 9*4(sp)
- lw a2, 10*4(sp)
- lw a3, 11*4(sp)
- lw a4, 12*4(sp)
- lw a5, 13*4(sp)
- lw a6, 14*4(sp)
- lw a7, 15*4(sp)
- addi sp, sp, 16*4
- mret
- /* Make sure there is an abort when linking */
- .section .init
- .globl abort
- abort:
- j abort
|