9
0
Fork 0
barebox/arch/arm/cpu/setupc.S

35 lines
816 B
ArmAsm

#include <linux/linkage.h>
.section .text.setupc
/*
* setup_c: copy binary to link address, clear bss and
* continue executing at new address.
*
* This function does not return to the address it is
* called from, but to the same location in the copied
* binary.
*/
ENTRY(setup_c)
push {r4, r5}
mov r5, lr
bl get_runtime_offset
subs r4, r0, #0
beq 1f /* skip memcpy if already at correct address */
ldr r0,=_text
ldr r2,=__bss_start
sub r2, r2, r0
sub r1, r0, r4
bl memcpy /* memcpy(_text, _text - offset, __bss_start - _text) */
1: ldr r0, =__bss_start
mov r1, #0
ldr r2, =__bss_stop
sub r2, r2, r0
bl memset /* clear bss */
mov r0, #0
mcr p15, 0, r0, c7, c5, 0 /* flush icache */
add lr, r5, r4 /* adjust return address to new location */
pop {r4, r5}
mov pc, lr
ENDPROC(setup_c)