[efi] Add EFI image format and basic runtime environment
[people/sha0/gpxe.git] / src / arch / i386 / prefix / efiprefix.S
1         .text
2         .code32
3         .arch i386
4         .section ".prefix", "a", @progbits
5         .org 0x00
6
7         /* DOS (.com) header
8          *
9          * EFI executables seem to leave most of this empty
10          */
11 mzhdr:
12         .ascii  "MZ"            /* Magic number */
13         .word   0               /* Bytes on last page of file */
14         .word   0               /* Pages in file */
15         .word   0               /* Relocations */
16         .word   0               /* Size of header in paragraphs */
17         .word   0               /* Minimum extra paragraphs needed */
18         .word   0               /* Maximum extra paragraphs needed */
19         .word   0               /* Initial (relative) SS value */
20         .word   0               /* Initial SP value */
21         .word   0               /* "Checksum" */
22         .word   0               /* Initial IP value */
23         .word   0               /* Initial (relative) CS value */
24         .word   0               /* File address of relocation table */
25         .word   0               /* Ovesrlay number */
26         .word   0, 0, 0, 0      /* Reserved words */
27         .word   0               /* OEM identifier (for e_oeminfo) */
28         .word   0               /* OEM information; e_oemid specific */
29         .word   0, 0, 0, 0, 0   /* Reserved words */
30         .word   0, 0, 0, 0, 0   /* Reserved words */
31         .long   pehdr_lma       /* File address of new exe header */
32         .size   mzhdr, . - mzhdr
33
34         /* PE header */
35         .org    0xc0 /* For compatibility with MS toolchain */
36 pehdr:
37         .ascii  "PE\0\0"        /* Magic number */
38         .word   0x014c          /* CPU architecture: i386 */
39         .word   num_pe_sections /* Number of sections */
40         .long   0x10d1a884      /* Timestamp */
41         .long   0               /* Symbol table */
42         .long   0               /* Number of symbols */
43         .word   opthdr_size     /* Size of optional header */
44         .word   0x2102          /* Characteristics */
45         .size   pehdr, . - pehdr
46         .equ    pehdr_lma, pehdr - mzhdr
47
48         /* "Optional" header */
49 opthdr:
50         .word   0x010b          /* Magic number */
51         .byte   0               /* Linker major version number */
52         .byte   0               /* Linker minor version number */
53         .long   _text_filesz    /* Size of text section */
54         .long   _data_filesz    /* Size of data section */
55         .long   _bss_filesz     /* Size of bss section */
56         .long   efi_entry_lma   /* Entry point */
57         .long   _text_lma       /* Text section start RVA */
58         .long   _data_lma       /* Data section start RVA */
59         .long   0               /* Image base address */
60         .long   _max_align      /* Section alignment */
61         .long   _max_align      /* File alignment */
62         .word   0               /* Operating system major version number */
63         .word   0               /* Operating system minor version number */
64         .word   0               /* Image major version number */
65         .word   0               /* Image minor version number */
66         .word   0               /* Subsystem major version number */
67         .word   0               /* Subsystem minor version number */
68         .long   0               /* Reserved */
69         .long   _filesz         /* Total image size */
70         .long   _prefix_filesz  /* Total header size */
71         .long   0               /* "Checksum" */
72         .word   0x0a            /* Subsystem: EFI */
73         .word   0               /* DLL characteristics */
74         .long   0               /* Size of stack reserve */
75         .long   0               /* Size of stack commit */
76         .long   0               /* Size of heap reserve */
77         .long   0               /* Size of heap commit */
78         .long   0               /* Loader flags */
79         .long   16              /* Number of data directory entries */
80         .long   0, 0            /* Export directory */
81         .long   0, 0            /* Import directory */
82         .long   0, 0            /* Resource directory */
83         .long   0, 0            /* Exception directory */
84         .long   0, 0            /* Security directory */
85         .long   _reloc_lma, _reloc_filesz /* Base relocation directory */
86         .long   debugdir_lma, debugdir_size /* Debug directory */
87         .long   0, 0            /* Description directory */
88         .long   0, 0            /* Special directory */
89         .long   0, 0            /* Thread storage directory */
90         .long   0, 0            /* Load configuration directory */
91         .long   0, 0            /* Bound import directory */
92         .long   0, 0            /* Import address table directory */
93         .long   0, 0            /* Delay import directory */
94         .long   0, 0            /* Reserved */
95         .long   0, 0            /* Reserved */
96         .size   opthdr, . - opthdr
97         .equ    opthdr_size, . - opthdr
98
99         /* PE sections */
100 pe_sections:
101 text_section:
102         .asciz  ".text"         /* Section name */
103         .align  8
104         .long   _text_filesz    /* Section size */
105         .long   _text_lma       /* Relative Virtual Address */
106         .long   _text_filesz    /* Section size (rounded up) */
107         .long   _text_lma       /* Pointer to raw data */
108         .long   0               /* Link-time relocations */
109         .long   0               /* Line numbers */
110         .word   0               /* Number of link-time relocations */
111         .word   0               /* Number of line numbers */
112         .long   0x68000020      /* Characteristics */
113 rodata_section:
114         .asciz  ".rodata"       /* Section name */
115         .align  8
116         .long   _rodata_filesz  /* Section size */
117         .long   _rodata_lma     /* Relative Virtual Address */
118         .long   _rodata_filesz  /* Section size (rounded up) */
119         .long   _rodata_lma     /* Pointer to raw data */
120         .long   0               /* Link-time relocations */
121         .long   0               /* Line numbers */
122         .word   0               /* Number of link-time relocations */
123         .word   0               /* Number of line numbers */
124         .long   0x48000040      /* Characteristics */
125 data_section:
126         .asciz  ".data"         /* Section name */
127         .align  8
128         .long   _data_filesz    /* Section size */
129         .long   _data_lma       /* Relative Virtual Address */
130         .long   _data_filesz    /* Section size (rounded up) */
131         .long   _data_lma       /* Pointer to raw data */
132         .long   0               /* Link-time relocations */
133         .long   0               /* Line numbers */
134         .word   0               /* Number of link-time relocations */
135         .word   0               /* Number of line numbers */
136         .long   0xc8000040      /* Characteristics */
137 reloc_section:
138         .asciz  ".reloc"        /* Section name */
139         .align  8
140         .long   _reloc_filesz   /* Section size */
141         .long   _reloc_lma      /* Relative Virtual Address */
142         .long   _reloc_filesz   /* Section size (rounded up) */
143         .long   _reloc_lma      /* Pointer to raw data */
144         .long   0               /* Link-time relocations */
145         .long   0               /* Line numbers */
146         .word   0               /* Number of link-time relocations */
147         .word   0               /* Number of line numbers */
148         .long   0x42000040      /* Characteristics */
149
150 pe_sections_end:
151         .size   pe_sections, . - pe_sections
152         .equ    num_pe_sections, ( ( . - pe_sections ) / 0x28 )
153
154         /* Debug directory */
155         .section ".rodata"
156         .globl  debugdir
157 debugdir:
158         .long   0               /* Characteristics */
159         .long   0x10d1a884      /* Timestamp */
160         .word   0               /* Major version */
161         .word   0               /* Minor version */
162         .long   0x02            /* RSDS? */
163         .long   codeview_rsds_size /* Size of data */
164         .long   codeview_rsds_lma /* RVA */
165         .long   codeview_rsds_lma /* File offset */
166         .size   debugdir, . - debugdir
167         .equ    debugdir_size, . - debugdir
168         /* Codeview structure */
169         .globl  codeview_rsds
170 codeview_rsds:
171         .ascii  "RSDS"          /* Magic number */
172         .long   0, 0, 0, 0, 0   /* Unused by EFI */
173         .asciz  "efiprefix.pdb"
174         .size   codeview_rsds, . - codeview_rsds
175         .equ    codeview_rsds_size, . - codeview_rsds