1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
#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 */
#ifdef CONFIG_MMU
bl arm_early_mmu_cache_flush
#endif
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)
|