60 lines
1.2 KiB
ArmAsm
60 lines
1.2 KiB
ArmAsm
.section .init
|
|
.global _start
|
|
.type _start,@function
|
|
|
|
_start:
|
|
// If we're on a multicore system, we need to wait for hart 0 to wake us up.
|
|
#if TINYGO_CORES > 1
|
|
csrr a0, mhartid
|
|
|
|
// Hart 0 stack
|
|
bnez a0, 1f
|
|
la sp, _stack_top
|
|
|
|
1:
|
|
// Hart 1 stack
|
|
li a1, 1
|
|
bne a0, a1, 2f
|
|
la sp, _stack1_top
|
|
|
|
2:
|
|
// Hart 2 stack
|
|
#if TINYGO_CORES >= 3
|
|
li a1, 2
|
|
bne a0, a1, 3f
|
|
la sp, _stack2_top
|
|
#endif
|
|
|
|
3:
|
|
// Hart 3 stack
|
|
#if TINYGO_CORES >= 4
|
|
li a1, 3
|
|
bne a0, a1, 4f
|
|
la sp, _stack3_top
|
|
#endif
|
|
|
|
4:
|
|
// done
|
|
|
|
#if TINYGO_CORES > 4
|
|
#error only up to 4 cores are supported at the moment!
|
|
#endif
|
|
|
|
#else
|
|
// Load the stack pointer.
|
|
la sp, _stack_top
|
|
#endif
|
|
|
|
// Load the globals pointer. The program will load pointers relative to this
|
|
// register, so it must be set to the right value on startup.
|
|
// See: https://gnu-mcu-eclipse.github.io/arch/riscv/programmer/#the-gp-global-pointer-register
|
|
// Linker relaxations must be disabled to avoid the initialization beign
|
|
// relaxed with an uninitialized global pointer: mv gp, gp
|
|
.option push
|
|
.option norelax
|
|
la gp, __global_pointer$
|
|
.option pop
|
|
|
|
// Jump to runtime.main
|
|
call main
|