39 lines
470 B
ArmAsm
39 lines
470 B
ArmAsm
.section ".text.boot"
|
|
|
|
.global _start
|
|
|
|
_start:
|
|
// read cpu id, stop slave cores
|
|
mrs x1, mpidr_el1
|
|
and x1, x1, #3
|
|
cbz x1, run
|
|
// cpu id > 0, fallback to wait
|
|
wait:
|
|
wfe
|
|
b wait
|
|
|
|
run: // cpu id == 0
|
|
mov x20, x0
|
|
|
|
bl el2_to_el1
|
|
|
|
adrp x0, __stack_end
|
|
mov sp, x0
|
|
|
|
// clear bss
|
|
adr x0, __bss_start
|
|
adr x1, __bss_end
|
|
bl memzero
|
|
|
|
mov x0, x20
|
|
bl main
|
|
b wait
|
|
|
|
el2_to_el1:
|
|
mov x0, (1 << 31)
|
|
msr hcr_el2, x0
|
|
mov x0, 0x3c5
|
|
msr spsr_el2, x0
|
|
msr elr_el2, lr
|
|
eret
|