root/src/system/boot/platform/efi/arch/arm/crt0-efi-arm.S
/*
 * crt0-efi-arm.S - PE/COFF header for ARM EFI applications
 *
 * Copright (C) 2014 Linaro Ltd. <ard.biesheuvel@linaro.org>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice and this list of conditions, without modification.
 * 2. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * Alternatively, this software may be distributed under the terms of the
 * GNU General Public License as published by the Free Software Foundation;
 * either version 2 of the License, or (at your option) any later version.
 */

        .section        .text.head

        /*
         * Magic "MZ" signature for PE/COFF
         */
        .globl  ImageBase
ImageBase:
        .ascii  "MZ"
        .skip   58                              // 'MZ' + pad + offset == 64
        .long   pe_header - ImageBase           // Offset to the PE header.
pe_header:
        .ascii  "PE"
        .short  0
coff_header:
        .short  0x1c2                           // Mixed ARM/Thumb
        .short  2                               // nr_sections
        .long   0                               // TimeDateStamp
        .long   0                               // PointerToSymbolTable
        .long   1                               // NumberOfSymbols
        .short  section_table - optional_header // SizeOfOptionalHeader
        .short  0x306                           // Characteristics.
                                                // IMAGE_FILE_32BIT_MACHINE |
                                                // IMAGE_FILE_DEBUG_STRIPPED |
                                                // IMAGE_FILE_EXECUTABLE_IMAGE |
                                                // IMAGE_FILE_LINE_NUMS_STRIPPED
optional_header:
        .short  0x10b                           // PE32+ format
        .byte   0x02                            // MajorLinkerVersion
        .byte   0x14                            // MinorLinkerVersion
        .long   _edata - _start                 // SizeOfCode
        .long   0                               // SizeOfInitializedData
        .long   0                               // SizeOfUninitializedData
        .long   _start - ImageBase              // AddressOfEntryPoint
        .long   _start - ImageBase              // BaseOfCode
        .long   0                               // BaseOfData

extra_header_fields:
        .long   0                               // ImageBase
        .long   0x20                            // SectionAlignment
        .long   0x8                             // FileAlignment
        .short  0                               // MajorOperatingSystemVersion
        .short  0                               // MinorOperatingSystemVersion
        .short  0                               // MajorImageVersion
        .short  0                               // MinorImageVersion
        .short  0                               // MajorSubsystemVersion
        .short  0                               // MinorSubsystemVersion
        .long   0                               // Win32VersionValue

        .long   _edata - ImageBase              // SizeOfImage

        // Everything before the kernel image is considered part of the header
        .long   _start - ImageBase              // SizeOfHeaders
        .long   0                               // CheckSum
        .short  10                              // Subsystem (EFI)
        .short  0                               // DllCharacteristics
        .long   0                               // SizeOfStackReserve
        .long   0                               // SizeOfStackCommit
        .long   0                               // SizeOfHeapReserve
        .long   0                               // SizeOfHeapCommit
        .long   0                               // LoaderFlags
        .long   0x6                             // NumberOfRvaAndSizes

        .quad   0                               // ExportTable
        .quad   0                               // ImportTable
        .quad   0                               // ResourceTable
        .quad   0                               // ExceptionTable
        .quad   0                               // CertificationTable
        .quad   0                               // BaseRelocationTable

        // Section table
section_table:

        /*
         * The EFI application loader requires a relocation section
         * because EFI applications must be relocatable.  This is a
         * dummy section as far as we are concerned.
         */
        .ascii  ".reloc"
        .byte   0
        .byte   0                       // end of 0 padding of section name
        .long   0
        .long   0
        .long   0                       // SizeOfRawData
        .long   0                       // PointerToRawData
        .long   0                       // PointerToRelocations
        .long   0                       // PointerToLineNumbers
        .short  0                       // NumberOfRelocations
        .short  0                       // NumberOfLineNumbers
        .long   0x42100040              // Characteristics (section flags)


        .ascii  ".text"
        .byte   0
        .byte   0
        .byte   0                       // end of 0 padding of section name
        .long   _edata - _start         // VirtualSize
        .long   _start - ImageBase      // VirtualAddress
        .long   _edata - _start         // SizeOfRawData
        .long   _start - ImageBase      // PointerToRawData

        .long   0               // PointerToRelocations (0 for executables)
        .long   0               // PointerToLineNumbers (0 for executables)
        .short  0               // NumberOfRelocations  (0 for executables)
        .short  0               // NumberOfLineNumbers  (0 for executables)
        .long   0xe0500020      // Characteristics (section flags)

        .globl _start
_start:
        stmfd           sp!, {r0-r2, lr}

        mov             r2, r0
        mov             r3, r1
        adr             r1, .L_DYNAMIC
        ldr             r0, [r1]
        add             r1, r0, r1
        adr             r0, ImageBase
        bl              _relocate
        teq             r0, #0
        bne             0f

        ldmfd           sp, {r0-r1}
        bl              efi_main

0:      add             sp, sp, #12
        ldr             pc, [sp], #4

.L_DYNAMIC:
        .word           _DYNAMIC - .