2 * Copyright (c) 2014 Andrew Turner
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * We need to be a PE32+ file for EFI. On some architectures we can use
31 * objcopy to create the correct file, however on arm64 we need to do
35 #define IMAGE_FILE_MACHINE_ARM64 0xaa64
37 #define IMAGE_SCN_CNT_CODE 0x00000020
38 #define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
39 #define IMAGE_SCN_MEM_DISCARDABLE 0x02000000
40 #define IMAGE_SCN_MEM_EXECUTE 0x20000000
41 #define IMAGE_SCN_MEM_READ 0x40000000
43 .section .peheader,"a"
45 /* The MS-DOS Stub, only used to get the offset of the COFF header */
49 .long pe_sig - efi_start
51 /* The PE32 Signature. Needs to be 8-byte aligned */
57 .short IMAGE_FILE_MACHINE_ARM64 /* AArch64 file */
58 .short 2 /* 2 Sections */
59 .long 0 /* Timestamp */
60 .long 0 /* No symbol table */
61 .long 0 /* No symbols */
62 .short section_table - optional_header /* Optional header size */
63 .short 0 /* Characteristics TODO: Fill in */
66 .short 0x020b /* PE32+ (64-bit addressing) */
67 .byte 0 /* Major linker version */
68 .byte 0 /* Minor linker version */
69 .long _edata - _end_header /* Code size */
70 .long 0 /* No initialized data */
71 .long 0 /* No uninitialized data */
72 .long _start - efi_start /* Entry point */
73 .long _end_header - efi_start /* Start of code */
75 optional_windows_header:
76 .quad 0 /* Image base */
77 .long 32 /* Section Alignment */
78 .long 8 /* File alignment */
79 .short 0 /* Major OS version */
80 .short 0 /* Minor OS version */
81 .short 0 /* Major image version */
82 .short 0 /* Minor image version */
83 .short 0 /* Major subsystem version */
84 .short 0 /* Minor subsystem version */
85 .long 0 /* Win32 version */
86 .long _edata - efi_start /* Image size */
87 .long _end_header - efi_start /* Header size */
88 .long 0 /* Checksum */
89 .short 0xa /* Subsystem (EFI app) */
90 .short 0 /* DLL Characteristics */
91 .quad 0 /* Stack reserve */
92 .quad 0 /* Stack commit */
93 .quad 0 /* Heap reserve */
94 .quad 0 /* Heap commit */
95 .long 0 /* Loader flags */
96 .long 6 /* Number of RVAs */
107 /* We need a .reloc section for EFI */
110 .byte 0 /* Pad to 8 bytes */
111 .long 0 /* Virtual size */
112 .long 0 /* Virtual address */
113 .long 0 /* Size of raw data */
114 .long 0 /* Pointer to raw data */
115 .long 0 /* Pointer to relocations */
116 .long 0 /* Pointer to line numbers */
117 .short 0 /* Number of relocations */
118 .short 0 /* Number of line numbers */
119 .long (IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | \
120 IMAGE_SCN_MEM_DISCARDABLE) /* Characteristics */
122 /* The contents of the loader */
126 .byte 0 /* Pad to 8 bytes */
127 .long _edata - _end_header /* Virtual size */
128 .long _end_header - efi_start /* Virtual address */
129 .long _edata - _end_header /* Size of raw data */
130 .long _end_header - efi_start /* Pointer to raw data */
131 .long 0 /* Pointer to relocations */
132 .long 0 /* Pointer to line numbers */
133 .short 0 /* Number of relocations */
134 .short 0 /* Number of line numbers */
135 .long (IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | \
136 IMAGE_SCN_MEM_READ) /* Characteristics */
142 /* Save the boot params to the stack */
143 stp x0, x1, [sp, #-16]!
151 stp xzr, xzr, [x0], #16
161 ldp x0, x1, [sp], #16