uboot/arch/arm/lib/crt0_arm_efi.S
<<
>>
Prefs
   1/*
   2 * crt0-efi-arm.S - PE/COFF header for ARM EFI applications
   3 *
   4 * Copright (C) 2014 Linaro Ltd. <ard.biesheuvel@linaro.org>
   5 *
   6 * SPDX-License-Identifier:     GPL-2.0+     BSD-2-Clause
   7 *
   8 * This file is taken and modified from the gnu-efi project.
   9 */
  10
  11        .section        .text.head
  12
  13        /*
  14         * Magic "MZ" signature for PE/COFF
  15         */
  16        .globl  image_base
  17image_base:
  18        .ascii  "MZ"
  19        .skip   58                              /* 'MZ' + pad + offset == 64 */
  20        .long   pe_header - image_base          /* Offset to the PE header */
  21pe_header:
  22        .ascii  "PE"
  23        .short  0
  24coff_header:
  25        .short  0x1c2                           /* Mixed ARM/Thumb */
  26        .short  2                               /* nr_sections */
  27        .long   0                               /* TimeDateStamp */
  28        .long   0                               /* PointerToSymbolTable */
  29        .long   1                               /* NumberOfSymbols */
  30        .short  section_table - optional_header /* SizeOfOptionalHeader */
  31        /*
  32         * Characteristics: IMAGE_FILE_32BIT_MACHINE |
  33         * IMAGE_FILE_DEBUG_STRIPPED | IMAGE_FILE_EXECUTABLE_IMAGE |
  34         * IMAGE_FILE_LINE_NUMS_STRIPPED
  35         */
  36        .short  0x306
  37optional_header:
  38        .short  0x10b                           /* PE32+ format */
  39        .byte   0x02                            /* MajorLinkerVersion */
  40        .byte   0x14                            /* MinorLinkerVersion */
  41        .long   _edata - _start                 /* SizeOfCode */
  42        .long   0                               /* SizeOfInitializedData */
  43        .long   0                               /* SizeOfUninitializedData */
  44        .long   _start - image_base             /* AddressOfEntryPoint */
  45        .long   _start - image_base             /* BaseOfCode */
  46        .long   0                               /* BaseOfData */
  47
  48extra_header_fields:
  49        .long   0                               /* image_base */
  50        .long   0x20                            /* SectionAlignment */
  51        .long   0x8                             /* FileAlignment */
  52        .short  0                               /* MajorOperatingSystemVersion */
  53        .short  0                               /* MinorOperatingSystemVersion */
  54        .short  0                               /* MajorImageVersion */
  55        .short  0                               /* MinorImageVersion */
  56        .short  0                               /* MajorSubsystemVersion */
  57        .short  0                               /* MinorSubsystemVersion */
  58        .long   0                               /* Win32VersionValue */
  59
  60        .long   _edata - image_base             /* SizeOfImage */
  61
  62        /*
  63         * Everything before the kernel image is considered part of the header
  64         */
  65        .long   _start - image_base             /* SizeOfHeaders */
  66        .long   0                               /* CheckSum */
  67        .short  EFI_SUBSYSTEM                   /* Subsystem */
  68        .short  0                               /* DllCharacteristics */
  69        .long   0                               /* SizeOfStackReserve */
  70        .long   0                               /* SizeOfStackCommit */
  71        .long   0                               /* SizeOfHeapReserve */
  72        .long   0                               /* SizeOfHeapCommit */
  73        .long   0                               /* LoaderFlags */
  74        .long   0x6                             /* NumberOfRvaAndSizes */
  75
  76        .quad   0                               /* ExportTable */
  77        .quad   0                               /* ImportTable */
  78        .quad   0                               /* ResourceTable */
  79        .quad   0                               /* ExceptionTable */
  80        .quad   0                               /* CertificationTable */
  81        .quad   0                               /* BaseRelocationTable */
  82
  83section_table:
  84
  85        /*
  86         * The EFI application loader requires a relocation section
  87         * because EFI applications must be relocatable.  This is a
  88         * dummy section as far as we are concerned.
  89         */
  90        .ascii  ".reloc"
  91        .byte   0
  92        .byte   0                       /* end of 0 padding of section name */
  93        .long   0
  94        .long   0
  95        .long   0                       /* SizeOfRawData */
  96        .long   0                       /* PointerToRawData */
  97        .long   0                       /* PointerToRelocations */
  98        .long   0                       /* PointerToLineNumbers */
  99        .short  0                       /* NumberOfRelocations */
 100        .short  0                       /* NumberOfLineNumbers */
 101        .long   0x42100040              /* Characteristics (section flags) */
 102
 103        .ascii  ".text"
 104        .byte   0
 105        .byte   0
 106        .byte   0                       /* end of 0 padding of section name */
 107        .long   _edata - _start         /* VirtualSize */
 108        .long   _start - image_base     /* VirtualAddress */
 109        .long   _edata - _start         /* SizeOfRawData */
 110        .long   _start - image_base     /* PointerToRawData */
 111
 112        .long   0               /* PointerToRelocations (0 for executables) */
 113        .long   0               /* PointerToLineNumbers (0 for executables) */
 114        .short  0               /* NumberOfRelocations  (0 for executables) */
 115        .short  0               /* NumberOfLineNumbers  (0 for executables) */
 116        .long   0xe0500020      /* Characteristics (section flags) */
 117
 118_start:
 119        stmfd           sp!, {r0-r2, lr}
 120
 121        mov             r2, r0
 122        mov             r3, r1
 123        adr             r1, .L_DYNAMIC
 124        ldr             r0, [r1]
 125        add             r1, r0, r1
 126        adr             r0, image_base
 127        bl              _relocate
 128        teq             r0, #0
 129        bne             0f
 130
 131        ldmfd           sp, {r0-r1}
 132        bl              efi_main
 133
 1340:      add             sp, sp, #12
 135        ldr             pc, [sp], #4
 136
 137.L_DYNAMIC:
 138        .word           _DYNAMIC - .
 139