ARM: head-common.S: speed up startup code
Let's use optimized routines such as memcpy to copy .data and memzero to clear .bss in the startup code instead of doing it one word at a time. Those routines don't use any global data so they're safe to use even if .data and .bss segments are not initialized. In the .data copy case a temporary stack is installed in the .bss area as the actual kernel stack is located within the copied data area. The XIP kernel linker script ensures a 8 byte alignment for that purpose. Finally, make the .data copy and related pointers surrounded by CONFIG_XIP_KERNEL to make it obvious what it is all about. This will allow for further cleanups in the non-XIP linker script. Signed-off-by: Nicolas Pitre <nico@linaro.org> Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Tested-by: Chris Brandt <Chris.Brandt@renesas.com>
This commit is contained in:
Родитель
569dbb88e8
Коммит
9520b1a1b5
|
@ -79,47 +79,59 @@ ENDPROC(__vet_atags)
|
||||||
*/
|
*/
|
||||||
__INIT
|
__INIT
|
||||||
__mmap_switched:
|
__mmap_switched:
|
||||||
adr r3, __mmap_switched_data
|
|
||||||
|
|
||||||
ldmia r3!, {r4, r5, r6, r7}
|
mov r7, r1
|
||||||
cmp r4, r5 @ Copy data segment if needed
|
mov r8, r2
|
||||||
1: cmpne r5, r6
|
mov r10, r0
|
||||||
ldrne fp, [r4], #4
|
|
||||||
strne fp, [r5], #4
|
|
||||||
bne 1b
|
|
||||||
|
|
||||||
mov fp, #0 @ Clear BSS (and zero fp)
|
adr r4, __mmap_switched_data
|
||||||
1: cmp r6, r7
|
mov fp, #0
|
||||||
strcc fp, [r6],#4
|
|
||||||
bcc 1b
|
|
||||||
|
|
||||||
ARM( ldmia r3, {r4, r5, r6, r7, sp})
|
#ifdef CONFIG_XIP_KERNEL
|
||||||
THUMB( ldmia r3, {r4, r5, r6, r7} )
|
ARM( ldmia r4!, {r0, r1, r2, sp} )
|
||||||
THUMB( ldr sp, [r3, #16] )
|
THUMB( ldmia r4!, {r0, r1, r2, r3} )
|
||||||
str r9, [r4] @ Save processor ID
|
THUMB( mov sp, r3 )
|
||||||
str r1, [r5] @ Save machine type
|
sub r2, r2, r1
|
||||||
str r2, [r6] @ Save atags pointer
|
bl memcpy @ copy .data to RAM
|
||||||
cmp r7, #0
|
#endif
|
||||||
strne r0, [r7] @ Save control register values
|
|
||||||
|
ARM( ldmia r4!, {r0, r1, sp} )
|
||||||
|
THUMB( ldmia r4!, {r0, r1, r3} )
|
||||||
|
THUMB( mov sp, r3 )
|
||||||
|
sub r1, r1, r0
|
||||||
|
bl __memzero @ clear .bss
|
||||||
|
|
||||||
|
ldmia r4, {r0, r1, r2, r3}
|
||||||
|
str r9, [r0] @ Save processor ID
|
||||||
|
str r7, [r1] @ Save machine type
|
||||||
|
str r8, [r2] @ Save atags pointer
|
||||||
|
cmp r3, #0
|
||||||
|
strne r10, [r3] @ Save control register values
|
||||||
b start_kernel
|
b start_kernel
|
||||||
ENDPROC(__mmap_switched)
|
ENDPROC(__mmap_switched)
|
||||||
|
|
||||||
.align 2
|
.align 2
|
||||||
.type __mmap_switched_data, %object
|
.type __mmap_switched_data, %object
|
||||||
__mmap_switched_data:
|
__mmap_switched_data:
|
||||||
.long __data_loc @ r4
|
#ifdef CONFIG_XIP_KERNEL
|
||||||
.long _sdata @ r5
|
.long _sdata @ r0
|
||||||
.long __bss_start @ r6
|
.long __data_loc @ r1
|
||||||
.long _end @ r7
|
.long _edata_loc @ r2
|
||||||
.long processor_id @ r4
|
.long __bss_stop @ sp (temporary stack in .bss)
|
||||||
.long __machine_arch_type @ r5
|
|
||||||
.long __atags_pointer @ r6
|
|
||||||
#ifdef CONFIG_CPU_CP15
|
|
||||||
.long cr_alignment @ r7
|
|
||||||
#else
|
|
||||||
.long 0 @ r7
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
.long __bss_start @ r0
|
||||||
|
.long __bss_stop @ r1
|
||||||
.long init_thread_union + THREAD_START_SP @ sp
|
.long init_thread_union + THREAD_START_SP @ sp
|
||||||
|
|
||||||
|
.long processor_id @ r0
|
||||||
|
.long __machine_arch_type @ r1
|
||||||
|
.long __atags_pointer @ r2
|
||||||
|
#ifdef CONFIG_CPU_CP15
|
||||||
|
.long cr_alignment @ r3
|
||||||
|
#else
|
||||||
|
.long 0 @ r3
|
||||||
|
#endif
|
||||||
.size __mmap_switched_data, . - __mmap_switched_data
|
.size __mmap_switched_data, . - __mmap_switched_data
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -301,7 +301,7 @@ SECTIONS
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
BSS_SECTION(0, 0, 0)
|
BSS_SECTION(0, 0, 8)
|
||||||
_end = .;
|
_end = .;
|
||||||
|
|
||||||
STABS_DEBUG
|
STABS_DEBUG
|
||||||
|
|
Загрузка…
Ссылка в новой задаче