.section ".text.boot" .global _start _start: mrs x1, mpidr_el1 and x1, x1, #3 cbz x1, run wait: wfe b wait run: // move dtb to x20 mov x20, x0 adrp x0, __stack_end 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 // move dtb back to x0 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 // save return pointer // 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 mov x0, x20 br x19 b wait