linux/arch/arm64/kernel/efi-header.S
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2013 - 2017 Linaro, Ltd.
   3 * Copyright (C) 2013, 2014 Red Hat, Inc.
   4 *
   5 * This program is free software; you can redistribute it and/or modify
   6 * it under the terms of the GNU General Public License version 2 as
   7 * published by the Free Software Foundation.
   8 */
   9
  10#include <linux/pe.h>
  11#include <linux/sizes.h>
  12
  13        .macro  __EFI_PE_HEADER
  14        .long   PE_MAGIC
  15coff_header:
  16        .short  IMAGE_FILE_MACHINE_ARM64                // Machine
  17        .short  section_count                           // NumberOfSections
  18        .long   0                                       // TimeDateStamp
  19        .long   0                                       // PointerToSymbolTable
  20        .long   0                                       // NumberOfSymbols
  21        .short  section_table - optional_header         // SizeOfOptionalHeader
  22        .short  IMAGE_FILE_DEBUG_STRIPPED | \
  23                IMAGE_FILE_EXECUTABLE_IMAGE | \
  24                IMAGE_FILE_LINE_NUMS_STRIPPED           // Characteristics
  25
  26optional_header:
  27        .short  PE_OPT_MAGIC_PE32PLUS                   // PE32+ format
  28        .byte   0x02                                    // MajorLinkerVersion
  29        .byte   0x14                                    // MinorLinkerVersion
  30        .long   __initdata_begin - efi_header_end       // SizeOfCode
  31        .long   __pecoff_data_size                      // SizeOfInitializedData
  32        .long   0                                       // SizeOfUninitializedData
  33        .long   __efistub_entry - _head                 // AddressOfEntryPoint
  34        .long   efi_header_end - _head                  // BaseOfCode
  35
  36extra_header_fields:
  37        .quad   0                                       // ImageBase
  38        .long   SZ_4K                                   // SectionAlignment
  39        .long   PECOFF_FILE_ALIGNMENT                   // FileAlignment
  40        .short  0                                       // MajorOperatingSystemVersion
  41        .short  0                                       // MinorOperatingSystemVersion
  42        .short  0                                       // MajorImageVersion
  43        .short  0                                       // MinorImageVersion
  44        .short  0                                       // MajorSubsystemVersion
  45        .short  0                                       // MinorSubsystemVersion
  46        .long   0                                       // Win32VersionValue
  47
  48        .long   _end - _head                            // SizeOfImage
  49
  50        // Everything before the kernel image is considered part of the header
  51        .long   efi_header_end - _head                  // SizeOfHeaders
  52        .long   0                                       // CheckSum
  53        .short  IMAGE_SUBSYSTEM_EFI_APPLICATION         // Subsystem
  54        .short  0                                       // DllCharacteristics
  55        .quad   0                                       // SizeOfStackReserve
  56        .quad   0                                       // SizeOfStackCommit
  57        .quad   0                                       // SizeOfHeapReserve
  58        .quad   0                                       // SizeOfHeapCommit
  59        .long   0                                       // LoaderFlags
  60        .long   (section_table - .) / 8                 // NumberOfRvaAndSizes
  61
  62        .quad   0                                       // ExportTable
  63        .quad   0                                       // ImportTable
  64        .quad   0                                       // ResourceTable
  65        .quad   0                                       // ExceptionTable
  66        .quad   0                                       // CertificationTable
  67        .quad   0                                       // BaseRelocationTable
  68
  69#ifdef CONFIG_DEBUG_EFI
  70        .long   efi_debug_table - _head                 // DebugTable
  71        .long   efi_debug_table_size
  72#endif
  73
  74        // Section table
  75section_table:
  76        .ascii  ".text\0\0\0"
  77        .long   __initdata_begin - efi_header_end       // VirtualSize
  78        .long   efi_header_end - _head                  // VirtualAddress
  79        .long   __initdata_begin - efi_header_end       // SizeOfRawData
  80        .long   efi_header_end - _head                  // PointerToRawData
  81
  82        .long   0                                       // PointerToRelocations
  83        .long   0                                       // PointerToLineNumbers
  84        .short  0                                       // NumberOfRelocations
  85        .short  0                                       // NumberOfLineNumbers
  86        .long   IMAGE_SCN_CNT_CODE | \
  87                IMAGE_SCN_MEM_READ | \
  88                IMAGE_SCN_MEM_EXECUTE                   // Characteristics
  89
  90        .ascii  ".data\0\0\0"
  91        .long   __pecoff_data_size                      // VirtualSize
  92        .long   __initdata_begin - _head                // VirtualAddress
  93        .long   __pecoff_data_rawsize                   // SizeOfRawData
  94        .long   __initdata_begin - _head                // PointerToRawData
  95
  96        .long   0                                       // PointerToRelocations
  97        .long   0                                       // PointerToLineNumbers
  98        .short  0                                       // NumberOfRelocations
  99        .short  0                                       // NumberOfLineNumbers
 100        .long   IMAGE_SCN_CNT_INITIALIZED_DATA | \
 101                IMAGE_SCN_MEM_READ | \
 102                IMAGE_SCN_MEM_WRITE                     // Characteristics
 103
 104        .set    section_count, (. - section_table) / 40
 105
 106#ifdef CONFIG_DEBUG_EFI
 107        /*
 108         * The debug table is referenced via its Relative Virtual Address (RVA),
 109         * which is only defined for those parts of the image that are covered
 110         * by a section declaration. Since this header is not covered by any
 111         * section, the debug table must be emitted elsewhere. So stick it in
 112         * the .init.rodata section instead.
 113         *
 114         * Note that the EFI debug entry itself may legally have a zero RVA,
 115         * which means we can simply put it right after the section headers.
 116         */
 117        __INITRODATA
 118
 119        .align  2
 120efi_debug_table:
 121        // EFI_IMAGE_DEBUG_DIRECTORY_ENTRY
 122        .long   0                                       // Characteristics
 123        .long   0                                       // TimeDateStamp
 124        .short  0                                       // MajorVersion
 125        .short  0                                       // MinorVersion
 126        .long   IMAGE_DEBUG_TYPE_CODEVIEW               // Type
 127        .long   efi_debug_entry_size                    // SizeOfData
 128        .long   0                                       // RVA
 129        .long   efi_debug_entry - _head                 // FileOffset
 130
 131        .set    efi_debug_table_size, . - efi_debug_table
 132        .previous
 133
 134efi_debug_entry:
 135        // EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY
 136        .ascii  "NB10"                                  // Signature
 137        .long   0                                       // Unknown
 138        .long   0                                       // Unknown2
 139        .long   0                                       // Unknown3
 140
 141        .asciz  VMLINUX_PATH
 142
 143        .set    efi_debug_entry_size, . - efi_debug_entry
 144#endif
 145
 146        /*
 147         * EFI will load .text onwards at the 4k section alignment
 148         * described in the PE/COFF header. To ensure that instruction
 149         * sequences using an adrp and a :lo12: immediate will function
 150         * correctly at this alignment, we must ensure that .text is
 151         * placed at a 4k boundary in the Image to begin with.
 152         */
 153        .align 12
 154efi_header_end:
 155        .endm
 156