Commit 546c8c44 authored by Ard Biesheuvel's avatar Ard Biesheuvel Committed by Will Deacon

arm64: move early boot code to the .init segment

Apart from the arm64/linux and EFI header data structures, there is nothing
in the .head.text section that must reside at the beginning of the Image.
So let's move it to the .init section where it belongs.

Note that this involves some minor tweaking of the EFI header, primarily
because the address of 'stext' no longer coincides with the start of the
.text section. It also requires a couple of relocated symbol references
to be slightly rewritten or their definition moved to the linker script.
Signed-off-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
parent 2c09ec06
...@@ -62,7 +62,7 @@ ENTRY(entry) ...@@ -62,7 +62,7 @@ ENTRY(entry)
*/ */
mov x20, x0 // DTB address mov x20, x0 // DTB address
ldr x0, [sp, #16] // relocated _text address ldr x0, [sp, #16] // relocated _text address
movz x21, #:abs_g0:stext_offset ldr w21, =stext_offset
add x21, x0, x21 add x21, x0, x21
/* /*
......
...@@ -102,8 +102,6 @@ _head: ...@@ -102,8 +102,6 @@ _head:
#endif #endif
#ifdef CONFIG_EFI #ifdef CONFIG_EFI
.globl __efistub_stext_offset
.set __efistub_stext_offset, stext - _head
.align 3 .align 3
pe_header: pe_header:
.ascii "PE" .ascii "PE"
...@@ -123,11 +121,11 @@ optional_header: ...@@ -123,11 +121,11 @@ optional_header:
.short 0x20b // PE32+ format .short 0x20b // PE32+ format
.byte 0x02 // MajorLinkerVersion .byte 0x02 // MajorLinkerVersion
.byte 0x14 // MinorLinkerVersion .byte 0x14 // MinorLinkerVersion
.long _end - stext // SizeOfCode .long _end - efi_header_end // SizeOfCode
.long 0 // SizeOfInitializedData .long 0 // SizeOfInitializedData
.long 0 // SizeOfUninitializedData .long 0 // SizeOfUninitializedData
.long __efistub_entry - _head // AddressOfEntryPoint .long __efistub_entry - _head // AddressOfEntryPoint
.long __efistub_stext_offset // BaseOfCode .long efi_header_end - _head // BaseOfCode
extra_header_fields: extra_header_fields:
.quad 0 // ImageBase .quad 0 // ImageBase
...@@ -144,7 +142,7 @@ extra_header_fields: ...@@ -144,7 +142,7 @@ extra_header_fields:
.long _end - _head // SizeOfImage .long _end - _head // SizeOfImage
// Everything before the kernel image is considered part of the header // Everything before the kernel image is considered part of the header
.long __efistub_stext_offset // SizeOfHeaders .long efi_header_end - _head // SizeOfHeaders
.long 0 // CheckSum .long 0 // CheckSum
.short 0xa // Subsystem (EFI application) .short 0xa // Subsystem (EFI application)
.short 0 // DllCharacteristics .short 0 // DllCharacteristics
...@@ -188,10 +186,10 @@ section_table: ...@@ -188,10 +186,10 @@ section_table:
.byte 0 .byte 0
.byte 0 .byte 0
.byte 0 // end of 0 padding of section name .byte 0 // end of 0 padding of section name
.long _end - stext // VirtualSize .long _end - efi_header_end // VirtualSize
.long __efistub_stext_offset // VirtualAddress .long efi_header_end - _head // VirtualAddress
.long _edata - stext // SizeOfRawData .long _edata - efi_header_end // SizeOfRawData
.long __efistub_stext_offset // PointerToRawData .long efi_header_end - _head // PointerToRawData
.long 0 // PointerToRelocations (0 for executables) .long 0 // PointerToRelocations (0 for executables)
.long 0 // PointerToLineNumbers (0 for executables) .long 0 // PointerToLineNumbers (0 for executables)
...@@ -200,15 +198,18 @@ section_table: ...@@ -200,15 +198,18 @@ section_table:
.long 0xe0500020 // Characteristics (section flags) .long 0xe0500020 // Characteristics (section flags)
/* /*
* EFI will load stext onwards at the 4k section alignment * EFI will load .text onwards at the 4k section alignment
* described in the PE/COFF header. To ensure that instruction * described in the PE/COFF header. To ensure that instruction
* sequences using an adrp and a :lo12: immediate will function * sequences using an adrp and a :lo12: immediate will function
* correctly at this alignment, we must ensure that stext is * correctly at this alignment, we must ensure that .text is
* placed at a 4k boundary in the Image to begin with. * placed at a 4k boundary in the Image to begin with.
*/ */
.align 12 .align 12
efi_header_end:
#endif #endif
__INIT
ENTRY(stext) ENTRY(stext)
bl preserve_boot_args bl preserve_boot_args
bl el2_setup // Drop to EL1, w20=cpu_boot_mode bl el2_setup // Drop to EL1, w20=cpu_boot_mode
...@@ -223,12 +224,12 @@ ENTRY(stext) ...@@ -223,12 +224,12 @@ ENTRY(stext)
* the TCR will have been set. * the TCR will have been set.
*/ */
ldr x27, 0f // address to jump to after ldr x27, 0f // address to jump to after
// MMU has been enabled neg x27, x27 // MMU has been enabled
adr_l lr, __enable_mmu // return (PIC) address adr_l lr, __enable_mmu // return (PIC) address
b __cpu_setup // initialise processor b __cpu_setup // initialise processor
ENDPROC(stext) ENDPROC(stext)
.align 3 .align 3
0: .quad __mmap_switched - (_head - TEXT_OFFSET) + KIMAGE_VADDR 0: .quad (_text - TEXT_OFFSET) - __mmap_switched - KIMAGE_VADDR
/* /*
* Preserve the arguments passed by the bootloader in x0 .. x3 * Preserve the arguments passed by the bootloader in x0 .. x3
...@@ -397,7 +398,7 @@ __create_page_tables: ...@@ -397,7 +398,7 @@ __create_page_tables:
ldr x5, =KIMAGE_VADDR ldr x5, =KIMAGE_VADDR
add x5, x5, x23 // add KASLR displacement add x5, x5, x23 // add KASLR displacement
create_pgd_entry x0, x5, x3, x6 create_pgd_entry x0, x5, x3, x6
ldr w6, kernel_img_size ldr w6, =kernel_img_size
add x6, x6, x5 add x6, x6, x5
mov x3, x24 // phys offset mov x3, x24 // phys offset
create_block_map x0, x7, x3, x5, x6 create_block_map x0, x7, x3, x5, x6
...@@ -414,9 +415,6 @@ __create_page_tables: ...@@ -414,9 +415,6 @@ __create_page_tables:
ret x28 ret x28
ENDPROC(__create_page_tables) ENDPROC(__create_page_tables)
kernel_img_size:
.long _end - (_head - TEXT_OFFSET)
.ltorg .ltorg
/* /*
......
...@@ -71,8 +71,12 @@ ...@@ -71,8 +71,12 @@
DEFINE_IMAGE_LE64(_kernel_offset_le, TEXT_OFFSET); \ DEFINE_IMAGE_LE64(_kernel_offset_le, TEXT_OFFSET); \
DEFINE_IMAGE_LE64(_kernel_flags_le, __HEAD_FLAGS); DEFINE_IMAGE_LE64(_kernel_flags_le, __HEAD_FLAGS);
kernel_img_size = _end - (_text - TEXT_OFFSET);
#ifdef CONFIG_EFI #ifdef CONFIG_EFI
__efistub_stext_offset = stext - _text;
/* /*
* Prevent the symbol aliases below from being emitted into the kallsyms * Prevent the symbol aliases below from being emitted into the kallsyms
* table, by forcing them to be absolute symbols (which are conveniently * table, by forcing them to be absolute symbols (which are conveniently
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment