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:
Nicolas Pitre 2017-08-24 15:54:47 -04:00
Родитель 569dbb88e8
Коммит 9520b1a1b5
2 изменённых файлов: 43 добавлений и 31 удалений

Просмотреть файл

@ -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