61 lines
1.1 KiB
ArmAsm
61 lines
1.1 KiB
ArmAsm
#include <common/asm.h>
|
|
|
|
.extern arm64_elX_to_el1
|
|
.extern boot_cpu_stack
|
|
.extern secondary_boot_flag
|
|
.extern secondary_init_c
|
|
.extern clear_bss_flag
|
|
.extern init_c
|
|
|
|
BEGIN_FUNC(_start)
|
|
mrs x8, mpidr_el1
|
|
and x8, x8, #0xFF
|
|
cbz x8, primary
|
|
|
|
/* Wait for bss clear */
|
|
wait_for_bss_clear:
|
|
adr x0, clear_bss_flag
|
|
ldr x1, [x0]
|
|
cmp x1, #0
|
|
bne wait_for_bss_clear
|
|
|
|
/* Turn to el1 from other exception levels. */
|
|
bl arm64_elX_to_el1
|
|
|
|
/* Prepare stack pointer and jump to C. */
|
|
mov x1, #0x1000
|
|
mul x1, x8, x1
|
|
adr x0, boot_cpu_stack
|
|
add x0, x0, x1
|
|
add x0, x0, #0x1000
|
|
mov sp, x0
|
|
|
|
wait_until_smp_enabled:
|
|
/* CPU ID should be stored in x8 from the first line */
|
|
mov x1, #8
|
|
mul x2, x8, x1
|
|
ldr x1, =secondary_boot_flag
|
|
add x1, x1, x2
|
|
ldr x3, [x1]
|
|
cbz x3, wait_until_smp_enabled
|
|
|
|
/* Set CPU id */
|
|
mov x0, x8
|
|
bl secondary_init_c
|
|
|
|
primary:
|
|
|
|
/* Turn to el1 from other exception levels. */
|
|
bl arm64_elX_to_el1
|
|
|
|
/* Prepare stack pointer and jump to C. */
|
|
adr x0, boot_cpu_stack
|
|
add x0, x0, #0x1000
|
|
mov sp, x0
|
|
|
|
bl init_c
|
|
|
|
/* Should never be here */
|
|
b .
|
|
END_FUNC(_start)
|