57 lines
726 B
ArmAsm
57 lines
726 B
ArmAsm
.section ".text.boot"
|
|
|
|
.global _start
|
|
|
|
_start:
|
|
mrs x1, mpidr_el1
|
|
and x1, x1, #3
|
|
cbz x1, run
|
|
|
|
wait:
|
|
wfe
|
|
b wait
|
|
|
|
run:
|
|
mov x20, x0
|
|
adr x0, _start
|
|
mov sp, x0
|
|
|
|
adr x0, __text_start
|
|
ldr x1, =__new_text_start
|
|
cmp x0, x1
|
|
b.gt relocate
|
|
|
|
adr x0, __bss_start
|
|
adr x1, __bss_end
|
|
bl memzero
|
|
|
|
mov x0, x20
|
|
bl main
|
|
b wait
|
|
|
|
relocate:
|
|
// move text section
|
|
ldr x0, =__new_text_start
|
|
adr x1, __text_start
|
|
adr x2, __text_end
|
|
sub x2, x2, x1
|
|
bl memcpy
|
|
mov x19, x0
|
|
|
|
// move rodata section
|
|
ldr x0, =__new_ro_start
|
|
adr x1, __rodata_start
|
|
adr x2, __rodata_end
|
|
sub x2, x2, x1
|
|
bl memcpy
|
|
|
|
// move data section
|
|
ldr x0, =__new_data_start
|
|
adr x1, __data_start
|
|
adr x2, __data_end
|
|
sub x2, x2, x1
|
|
bl memcpy
|
|
|
|
br x19
|
|
b wait
|