Brooklyn/arch/arm64/kernel/efi-header.S

153 lines
4.7 KiB
ArmAsm
Raw Normal View History

2021-05-27 00:09:36 +05:00
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (C) 2013 - 2017 Linaro, Ltd.
* Copyright (C) 2013, 2014 Red Hat, Inc.
*/
#include <linux/pe.h>
#include <linux/sizes.h>
.macro __EFI_PE_HEADER
.long PE_MAGIC
2021-09-23 21:59:15 +05:00
coff_header:
2021-05-27 00:09:36 +05:00
.short IMAGE_FILE_MACHINE_ARM64 // Machine
2021-09-23 21:59:15 +05:00
.short section_count // NumberOfSections
2021-05-27 00:09:36 +05:00
.long 0 // TimeDateStamp
.long 0 // PointerToSymbolTable
.long 0 // NumberOfSymbols
2021-09-23 21:59:15 +05:00
.short section_table - optional_header // SizeOfOptionalHeader
2021-05-27 00:09:36 +05:00
.short IMAGE_FILE_DEBUG_STRIPPED | \
IMAGE_FILE_EXECUTABLE_IMAGE | \
IMAGE_FILE_LINE_NUMS_STRIPPED // Characteristics
2021-09-23 21:59:15 +05:00
optional_header:
2021-05-27 00:09:36 +05:00
.short PE_OPT_MAGIC_PE32PLUS // PE32+ format
.byte 0x02 // MajorLinkerVersion
.byte 0x14 // MinorLinkerVersion
2021-09-23 21:59:15 +05:00
.long __initdata_begin - efi_header_end // SizeOfCode
2021-05-27 00:09:36 +05:00
.long __pecoff_data_size // SizeOfInitializedData
.long 0 // SizeOfUninitializedData
2021-09-23 21:59:15 +05:00
.long __efistub_efi_pe_entry - _head // AddressOfEntryPoint
.long efi_header_end - _head // BaseOfCode
2021-05-27 00:09:36 +05:00
2021-09-23 21:59:15 +05:00
extra_header_fields:
2021-05-27 00:09:36 +05:00
.quad 0 // ImageBase
.long SEGMENT_ALIGN // SectionAlignment
.long PECOFF_FILE_ALIGNMENT // FileAlignment
.short 0 // MajorOperatingSystemVersion
.short 0 // MinorOperatingSystemVersion
.short LINUX_EFISTUB_MAJOR_VERSION // MajorImageVersion
.short LINUX_EFISTUB_MINOR_VERSION // MinorImageVersion
.short 0 // MajorSubsystemVersion
.short 0 // MinorSubsystemVersion
.long 0 // Win32VersionValue
2021-09-23 21:59:15 +05:00
.long _end - _head // SizeOfImage
2021-05-27 00:09:36 +05:00
// Everything before the kernel image is considered part of the header
2021-09-23 21:59:15 +05:00
.long efi_header_end - _head // SizeOfHeaders
2021-05-27 00:09:36 +05:00
.long 0 // CheckSum
.short IMAGE_SUBSYSTEM_EFI_APPLICATION // Subsystem
.short 0 // DllCharacteristics
.quad 0 // SizeOfStackReserve
.quad 0 // SizeOfStackCommit
.quad 0 // SizeOfHeapReserve
.quad 0 // SizeOfHeapCommit
.long 0 // LoaderFlags
2021-09-23 21:59:15 +05:00
.long (section_table - .) / 8 // NumberOfRvaAndSizes
2021-05-27 00:09:36 +05:00
.quad 0 // ExportTable
.quad 0 // ImportTable
.quad 0 // ResourceTable
.quad 0 // ExceptionTable
.quad 0 // CertificationTable
.quad 0 // BaseRelocationTable
#ifdef CONFIG_DEBUG_EFI
2021-09-23 21:59:15 +05:00
.long efi_debug_table - _head // DebugTable
.long efi_debug_table_size
2021-05-27 00:09:36 +05:00
#endif
// Section table
2021-09-23 21:59:15 +05:00
section_table:
2021-05-27 00:09:36 +05:00
.ascii ".text\0\0\0"
2021-09-23 21:59:15 +05:00
.long __initdata_begin - efi_header_end // VirtualSize
.long efi_header_end - _head // VirtualAddress
.long __initdata_begin - efi_header_end // SizeOfRawData
.long efi_header_end - _head // PointerToRawData
2021-05-27 00:09:36 +05:00
.long 0 // PointerToRelocations
.long 0 // PointerToLineNumbers
.short 0 // NumberOfRelocations
.short 0 // NumberOfLineNumbers
.long IMAGE_SCN_CNT_CODE | \
IMAGE_SCN_MEM_READ | \
IMAGE_SCN_MEM_EXECUTE // Characteristics
.ascii ".data\0\0\0"
.long __pecoff_data_size // VirtualSize
2021-09-23 21:59:15 +05:00
.long __initdata_begin - _head // VirtualAddress
2021-05-27 00:09:36 +05:00
.long __pecoff_data_rawsize // SizeOfRawData
2021-09-23 21:59:15 +05:00
.long __initdata_begin - _head // PointerToRawData
2021-05-27 00:09:36 +05:00
.long 0 // PointerToRelocations
.long 0 // PointerToLineNumbers
.short 0 // NumberOfRelocations
.short 0 // NumberOfLineNumbers
.long IMAGE_SCN_CNT_INITIALIZED_DATA | \
IMAGE_SCN_MEM_READ | \
IMAGE_SCN_MEM_WRITE // Characteristics
2021-09-23 21:59:15 +05:00
.set section_count, (. - section_table) / 40
2021-05-27 00:09:36 +05:00
#ifdef CONFIG_DEBUG_EFI
/*
* The debug table is referenced via its Relative Virtual Address (RVA),
* which is only defined for those parts of the image that are covered
* by a section declaration. Since this header is not covered by any
* section, the debug table must be emitted elsewhere. So stick it in
* the .init.rodata section instead.
*
* Note that the EFI debug entry itself may legally have a zero RVA,
* which means we can simply put it right after the section headers.
*/
__INITRODATA
.align 2
2021-09-23 21:59:15 +05:00
efi_debug_table:
2021-05-27 00:09:36 +05:00
// EFI_IMAGE_DEBUG_DIRECTORY_ENTRY
.long 0 // Characteristics
.long 0 // TimeDateStamp
.short 0 // MajorVersion
.short 0 // MinorVersion
.long IMAGE_DEBUG_TYPE_CODEVIEW // Type
2021-09-23 21:59:15 +05:00
.long efi_debug_entry_size // SizeOfData
2021-05-27 00:09:36 +05:00
.long 0 // RVA
2021-09-23 21:59:15 +05:00
.long efi_debug_entry - _head // FileOffset
2021-05-27 00:09:36 +05:00
2021-09-23 21:59:15 +05:00
.set efi_debug_table_size, . - efi_debug_table
2021-05-27 00:09:36 +05:00
.previous
2021-09-23 21:59:15 +05:00
efi_debug_entry:
2021-05-27 00:09:36 +05:00
// EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY
.ascii "NB10" // Signature
.long 0 // Unknown
.long 0 // Unknown2
.long 0 // Unknown3
.asciz VMLINUX_PATH
2021-09-23 21:59:15 +05:00
.set efi_debug_entry_size, . - efi_debug_entry
2021-05-27 00:09:36 +05:00
#endif
2021-09-23 21:59:15 +05:00
/*
* EFI will load .text onwards at the 4k section alignment
* described in the PE/COFF header. To ensure that instruction
* sequences using an adrp and a :lo12: immediate will function
* correctly at this alignment, we must ensure that .text is
* placed at a 4k boundary in the Image to begin with.
*/
2021-05-27 00:09:36 +05:00
.balign SEGMENT_ALIGN
2021-09-23 21:59:15 +05:00
efi_header_end:
2021-05-27 00:09:36 +05:00
.endm