mirror of
https://github.com/esp-rs/esp-hal.git
synced 2025-10-01 14:20:44 +00:00
194 lines
4.0 KiB
ArmAsm
194 lines
4.0 KiB
ArmAsm
#define STORE sw
|
|
#define LOAD lw
|
|
#define LOG_REGBYTES 2
|
|
#define REGBYTES (1 << LOG_REGBYTES)
|
|
|
|
|
|
/*
|
|
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_hal:
|
|
/* Jump to the absolute address defined by the linker script. */
|
|
lui ra, %hi(_abs_start_hal)
|
|
jr %lo(_abs_start_hal)(ra)
|
|
|
|
_abs_start_hal:
|
|
.cfi_startproc
|
|
.cfi_undefined ra
|
|
|
|
// unsupported on ESP32C3
|
|
// 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)
|
|
#ifdef __riscv_mul
|
|
mul t0, a2, t0
|
|
#else
|
|
beqz a2, 2f // Jump if single-hart
|
|
mv t1, a2
|
|
mv t2, t0
|
|
1:
|
|
add t0, t0, t2
|
|
addi t1, t1, -1
|
|
bnez t1, 1b
|
|
2:
|
|
#endif
|
|
sub sp, sp, t0
|
|
|
|
// Set frame pointer
|
|
add s0, sp, zero
|
|
|
|
jal zero, _start_rust
|
|
|
|
.cfi_endproc
|
|
|
|
|
|
/*
|
|
Trap entry point (_start_trap)
|
|
Saves registers and calls _start_trap_rust_hal,
|
|
restores registers and then returns.
|
|
*/
|
|
.section .trap, "ax"
|
|
.global _start_trap_hal
|
|
.option norelax
|
|
.align 6
|
|
|
|
_start_trap_hal:
|
|
addi sp, sp, -32*REGBYTES
|
|
|
|
STORE ra, 0*REGBYTES(sp)
|
|
STORE t0, 1*REGBYTES(sp)
|
|
STORE t1, 2*REGBYTES(sp)
|
|
STORE t2, 3*REGBYTES(sp)
|
|
STORE t3, 4*REGBYTES(sp)
|
|
STORE t4, 5*REGBYTES(sp)
|
|
STORE t5, 6*REGBYTES(sp)
|
|
STORE t6, 7*REGBYTES(sp)
|
|
STORE a0, 8*REGBYTES(sp)
|
|
STORE a1, 9*REGBYTES(sp)
|
|
STORE a2, 10*REGBYTES(sp)
|
|
STORE a3, 11*REGBYTES(sp)
|
|
STORE a4, 12*REGBYTES(sp)
|
|
STORE a5, 13*REGBYTES(sp)
|
|
STORE a6, 14*REGBYTES(sp)
|
|
STORE a7, 15*REGBYTES(sp)
|
|
STORE s0, 16*REGBYTES(sp)
|
|
STORE s1, 17*REGBYTES(sp)
|
|
STORE s2, 18*REGBYTES(sp)
|
|
STORE s3, 19*REGBYTES(sp)
|
|
STORE s4, 20*REGBYTES(sp)
|
|
STORE s5, 21*REGBYTES(sp)
|
|
STORE s6, 22*REGBYTES(sp)
|
|
STORE s7, 23*REGBYTES(sp)
|
|
STORE s8, 24*REGBYTES(sp)
|
|
STORE s9, 25*REGBYTES(sp)
|
|
STORE s10, 26*REGBYTES(sp)
|
|
STORE s11, 27*REGBYTES(sp)
|
|
STORE gp, 28*REGBYTES(sp)
|
|
STORE tp, 29*REGBYTES(sp)
|
|
|
|
addi s0, sp, 32*REGBYTES
|
|
STORE s0, 30*REGBYTES(sp)
|
|
|
|
add a0, sp, zero
|
|
jal ra, _start_trap_rust_hal
|
|
|
|
LOAD ra, 0*REGBYTES(sp)
|
|
LOAD t0, 1*REGBYTES(sp)
|
|
LOAD t1, 2*REGBYTES(sp)
|
|
LOAD t2, 3*REGBYTES(sp)
|
|
LOAD t3, 4*REGBYTES(sp)
|
|
LOAD t4, 5*REGBYTES(sp)
|
|
LOAD t5, 6*REGBYTES(sp)
|
|
LOAD t6, 7*REGBYTES(sp)
|
|
LOAD a0, 8*REGBYTES(sp)
|
|
LOAD a1, 9*REGBYTES(sp)
|
|
LOAD a2, 10*REGBYTES(sp)
|
|
LOAD a3, 11*REGBYTES(sp)
|
|
LOAD a4, 12*REGBYTES(sp)
|
|
LOAD a5, 13*REGBYTES(sp)
|
|
LOAD a6, 14*REGBYTES(sp)
|
|
LOAD a7, 15*REGBYTES(sp)
|
|
LOAD s0, 16*REGBYTES(sp)
|
|
LOAD s1, 17*REGBYTES(sp)
|
|
LOAD s2, 18*REGBYTES(sp)
|
|
LOAD s3, 19*REGBYTES(sp)
|
|
LOAD s4, 20*REGBYTES(sp)
|
|
LOAD s5, 21*REGBYTES(sp)
|
|
LOAD s6, 22*REGBYTES(sp)
|
|
LOAD s7, 23*REGBYTES(sp)
|
|
LOAD s8, 24*REGBYTES(sp)
|
|
LOAD s9, 25*REGBYTES(sp)
|
|
LOAD s10, 26*REGBYTES(sp)
|
|
LOAD s11, 27*REGBYTES(sp)
|
|
LOAD gp, 28*REGBYTES(sp)
|
|
LOAD tp, 29*REGBYTES(sp)
|
|
LOAD sp, 30*REGBYTES(sp)
|
|
|
|
# SP was restored from the original SP
|
|
mret
|
|
|
|
.section .trap, "ax"
|
|
.balign 0x100
|
|
.global _vector_table
|
|
.type _vector_table, @function
|
|
|
|
_vector_table:
|
|
.option push
|
|
.option norvc
|
|
.rept 31
|
|
j _start_trap_hal
|
|
.endr |